← strona główna

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