Przykłady wyników losowania próbek dźwiękowych
Losowanie próbek fortepianu z uwzględnieniem harmonii muzycznej
czterodźwięki „wesołe” (a'la Mychael Nyman, kod na dole strony):
Czterodźwięki „smutniejsze”
Czterodźwięki „dziwne” (całkowicie przypadkowe wysokości)
Proste losowanie 120 próbek fortepianu na odcinku 60 sekund:
listaPlikow= dir(fullfile('piano_mp3', '*.mp3'));
ileDzwiekow = 120;
ileSekund = 60;
fs = 44100;
X = zeros (ileSekund * fs, 2);
listaIndeksow = randi (length(listaPlikow), [ileDzwiekow, 1]);
for k = 1 : length (listaIndeksow)
indeks = listaIndeksow(k);
sciezkaDoPliku = [listaPlikow(indeks).folder, '/', listaPlikow(indeks).name];
x = audioread (sciezkaDoPliku);
miejsce = max(round(rand * maxSekunda * fs), 1);
if miejsce + size(x, 1) - 1 > size (X, 1)
x = x (1 : size (X, 1) - miejsce + 1, :);
end
X (miejsce : miejsce + size (x, 1) - 1, :) = ...
X (miejsce : miejsce + size (x, 1) - 1, :) + x;
end
X = X / max (abs(X(:)));
d = string(datetime(now, 'ConvertFrom','datenum', 'Format', 'yyyyMMdd-HHmmss'));
sciezkaWyniku = strcat('rezultat-', num2str(ileDzwiekow), 'w', num2str(ileSekund), '-', d, '.wav');
audiowrite (sciezkaWyniku, X, fs);
Losowanie 600 próbek w minucie:
1200 próbek
6000 próbek w minucie:
100 próbek w minucie, z dodaniem losowego czasu trwania każdej próbki:
listaPlikow= dir(fullfile('piano_mp3', '*.mp3'));
ileDzwiekow = 100;
ileSekund = 60;
fs = 44100;
X = zeros (ileSekund * fs, 2);
listaIndeksow = randi (length(listaPlikow), [ileDzwiekow, 1]);
trwanieMinMax = [round(.1 * fs), 1 * fs] % dodane
for k = 1 : length (listaIndeksow)
indeks = listaIndeksow(k);
sciezkaDoPliku = [listaPlikow(indeks).folder, '/', listaPlikow(indeks).name];
x = audioread (sciezkaDoPliku);
x = fadeinout (x, 500);
iletrwa = randi([trwanieMinMax(1), min(trwanieMinMax(2),size(x, 1))], 1);
x = x (1:iletrwa, :);
miejsce = max(round(rand * maxSekunda * fs), 1);
if miejsce + size(x, 1) - 1 > size (X, 1)
x = x (1 : size (X, 1) - miejsce + 1, :);
end
X (miejsce : miejsce + size (x, 1) - 1, :) = ...
X (miejsce : miejsce + size (x, 1) - 1, :) + x;
end
X = X / max (abs(X(:)));
d = string(datetime(now, 'ConvertFrom','datenum', 'Format', 'yyyyMMdd-HHmmss'));
sciezkaWyniku = strcat('rezultat-', num2str(ileDzwiekow), 'w', num2str(ileSekund), '-', d, '.wav');
audiowrite (sciezkaWyniku, X, fs);
Dodanie losowej głośności dla każdej próbki
listaPlikow= dir(fullfile('piano_mp3', '*.mp3'));
ileDzwiekow = 100;
ileSekund = 60;
fs = 44100;
X = zeros (ileSekund * fs, 2);
listaIndeksow = randi (length(listaPlikow), [ileDzwiekow, 1]);
trwanieMinMax = [round(.1 * fs), 1 * fs] % dodane
dynamikaMinMax= [.05 1] % dodane
for k = 1 : length (listaIndeksow)
indeks = listaIndeksow(k);
sciezkaDoPliku = [listaPlikow(indeks).folder, '/', listaPlikow(indeks).name];
x = audioread (sciezkaDoPliku);
x = fadeinout (x, 1500);
iletrwa = randi([trwanieMinMax(1), min(trwanieMinMax(2),size(x, 1))], 1);
x = x (1:iletrwa, :);
jakaDynamika = rand() * ( dynamikaMinMax(2) - dynamikaMinMax(1)) + dynamikaMinMax(1);
x = x .* jakaDynamika;
miejsce = max(round(rand * maxSekunda * fs), 1);
if miejsce + size(x, 1) - 1 > size (X, 1)
x = x (1 : size (X, 1) - miejsce + 1, :);
end
X (miejsce : miejsce + size (x, 1) - 1, :) = ...
X (miejsce : miejsce + size (x, 1) - 1, :) + x;
end
X = X / max (abs(X(:)));
d = string(datetime(now, 'ConvertFrom','datenum', 'Format', 'yyyyMMdd-HHmmss'));
sciezkaWyniku = strcat('rezultat-zDynamika-', num2str(ileDzwiekow), 'w', num2str(ileSekund), '-', d, '.wav');
audiowrite (sciezkaWyniku, X, fs);
Nałożenie dźwięków na siatkę czasową o module ok. 1/6 sekundy (300 dźwięków w 30 sekund):
listaPlikow= dir(fullfile('piano_mp3', '*.mp3'));
ileDzwiekow = 600;
ileSekund = 30;
siatka = 6; % ile na sekunde
fs = 44100;
fsNaSiatke = round (fs / siatka);
miejsca = 1:fsNaSiatke:(ileSekund*siatka*fsNaSiatke);
X = zeros (ileSekund * fs, 2);
listaIndeksow = randi (length(listaPlikow), [ileDzwiekow, 1]);
trwanieMinMax = [round(.05 * fs), .5 * fs] % dodane
dynamikaMinMax = [.05 1] % dodane
for k = 1 : length (listaIndeksow)
indeks = listaIndeksow(k);
sciezkaDoPliku = [listaPlikow(indeks).folder, '/', listaPlikow(indeks).name];
x = audioread (sciezkaDoPliku);
x = fadeinout (x, 1500);
iletrwa = randi([trwanieMinMax(1), min(trwanieMinMax(2),size(x, 1))], 1);
x = x (1:iletrwa, :);
jakaDynamika = rand() * ( dynamikaMinMax(2) - dynamikaMinMax(1)) + dynamikaMinMax(1);
x = x .* jakaDynamika;
miejsce= miejsca(randi([1, length(miejsca)], 1));
if miejsce + size(x, 1) - 1 > size (X, 1)
x = x (1 : size (X, 1) - miejsce + 1, :);
end
X (miejsce : miejsce + size (x, 1) - 1, :) = ...
X (miejsce : miejsce + size (x, 1) - 1, :) + x;
end
X = X / max (abs(X(:)));
d = string(datetime(now, 'ConvertFrom','datenum', 'Format', 'yyyyMMdd-HHmmss'));
sciezkaWyniku = strcat('rezultat-siatkaKrotsze-', num2str(ileDzwiekow), 'w', num2str(ileSekund), '-', d, '.wav');
audiowrite (sciezkaWyniku, X, fs);
Losowanie z całej bazy próbek (różne instrumenty):
Losowanie z próbek instrumentów dętych i perkusyjnych, które w nazwie mają słowo „trem”:
Przykład mas dźwiękowych w smyczkach
Losowanie próbek instrumentów smyczkowych, o minimalnej długości 5 sekund, i klasach wysokości c, des, e, g:
Faktura orkiestrowa
Ograniczenie ambitusu losowanych próbek przez kontury:
Kod w języku matlab, generujący przykład a'la Michael Nyman (przykład dźwiękowy na górze strony):
folderZprobkamiFortepianu = 'piano_mp3';
listaPlikow= dir(fullfile(folderZprobkamiFortepianu, '*.mp3')); % wczytanie probek
for midi = 24 : 108
sciezkaDoPliku = [folderZprobkamiFortepianu, '/', num2str(midi), '.mp3'];
mp3s{midi} = audioread (sciezkaDoPliku);
end
ileDzwiekowNaAkord = [3:8];
siatka = 8;
ileSekund = 120;
fs = 44100;
Muzyka rzecz ludzka
tonika = 0;
wzory = {[4, 3, 4, 1], [4, 3, 3, 2], [3, 4, 3, 2] [5, 2, 3, 2]};
wzor = wzory{1};
akordy = cell (12, length(wzory));
for midi = 0 : 11
for w = 1 : length (wzory) wzor = wzory {w}; midis = [midi];
while midis(end) <= 127
for k = 1 : length(wzor)
midis(end+1) = midis(end) + wzor(k);
end
end
midis (midis > 127) = [];
akordy {midi + 1, w} = midis;
end
end
krok = 5;
long = 0;
longNow = 0;
minMidiNormal = 48;
maxMidiNormal = 72;
minMidiAccent = 32;
maxMidiAccent = 108;
trwanieMinMax = [round(.5 * fs), 3 * fs];
fsNaSiatke = round (fs / siatka);
X = zeros (ileSekund * fs, 2);
ileAkordow = ileSekund
punkt = 1;
for k = 1 : ileAkordow
if longNow == long
idxs = randperm (length(longs)); long = longs(idxs(1));
dynamiki = linspace (0.7, 0.1, long); longNow = 0;
jakaDynamika = 1;
idxs = randperm (length(kroki));
krok = kroki(idxs(1));
tonika = tonika + krok;
if tonika > 11
tonika = tonika - 12;
end
idxs = randperm (size(wzory, 1));
akord = akordy {tonika + 1, idxs(1)};
else
jakaDynamika = dynamiki (longNow);
end
idxs = randperm (length(ileDzwiekowNaAkord));
ileDzwiekow = ileDzwiekowNaAkord(idxs(1));
akordTeraz = akord;
if longNow > 0
akordTeraz(akordTeraz<minMidiNormal) = []; akordTeraz(akordTeraz>maxMidiNormal) = [];
else
akordTeraz(akordTeraz<minMidiAccent) = []; akordTeraz(akordTeraz>maxMidiAccent) = [];
end
for l = 1 : ileDzwiekow
idxs = randperm (length(akordTeraz));
midi = akordTeraz(idxs(1));
x = mp3s{midi};
iletrwa = randi([trwanieMinMax(1), min(trwanieMinMax(2),size(x, 1))], 1);
x = x (1:iletrwa, :);
x = fadeinout (x, 500);
if jakaDynamika < 1
dynamika = jakaDynamika * rand() * ( dynamikaMinMax(2) - dynamikaMinMax(1)) + dynamikaMinMax(1);
else
dynamika = 1;
end
x = x .* jakaDynamika;
miejsce= punkt;
if miejsce + size(x, 1) - 1 > size (X, 1)
x = x (1 : size (X, 1) - miejsce + 1, :); end
X (miejsce : miejsce + size (x, 1) - 1, :) = X (miejsce : miejsce + size (x, 1) - 1, :) + x;
end
longNow = longNow + 1;
punkt = punkt + fsNaSiatke;
end
X = X / max (abs(X(:))) * .8;
d = string(datetime(now, 'ConvertFrom','datenum', 'Format', 'yyyyMMdd-HHmmss'));
sciezkaWyniku = strcat('./results/rezultat-siatkaWysokosci-', num2str(ileDzwiekow), 'w', num2st r(ileSekund), '-', d, '.wav');
audiowrite (sciezkaWyniku, X, fs);
Autorstwo kodu i próbek dźwiękowych: Marcin Strzelecki