1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
clear all; fig=1;
fsam = 44100;
%
% Controle de fréquence
%
notes = [60 62 64 60 65 62 67 64 69 65 71 67 72];
duree = 0.2 * fsam; % Durée de chaque notes, en samples
freq = []; % Ceci est notre contrôle frequence(t)
for i=1:size(notes,2)
% Conversion MIDI -> Hz
f = 440 * exp(0.057762265 * (notes(i) - 69))
freq = [freq; f*ones(duree,1)];
end
figure(fig++, 'name', 'frequence');
plot (freq);
%
% Calcul du phaser
%
phase = cumsum (freq); % Intégration de la phase
phaser = mod (phase/fsam, 1.0); % Repliement sur [0,1]
figure(fig++, 'name', 'phaser (debut seulement)');
plot(phaser); axis ([0,1000,-1,2]);
%
% Wavetable non anti-aliasée
%
tsize = 512;
wave_sans = zeros (tsize,1);
wave_sans (1:tsize/2) = +1;
wave_sans (tsize/2+1:tsize) = -1;
figure(fig++, 'name', 'wavetable sans anti-alias');
plot(wave_sans); ylim ([-2,+2]);
%
% Wavetable anti-aliasée (Fourier)
%
wave_avec = zeros (tsize,1);
index = (0:tsize-1)';
for n = 1:5
harmo = 2*n-1
ampl = 1/harmo;
wave_avec = wave_avec + ampl * sin(2*pi*harmo*index/tsize);
end
figure(fig++, 'name', 'wavetable avec anti-alias');
plot(wave_avec); ylim ([-2,+2]);
%
% Passage du phaser dans les wavetables
%
index = floor(1 + phaser*(tsize-1)); % De [0..1] vers [1..tsize]
out1 = wave_sans(index); % Waveshaping
out2 = wave_avec(index); % Waveshaping
figure(fig++, 'name', 'waveshaping sans anti-alias');
plot(out1); ylim ([-2,+2]); axis ([0,1000,-2,+2]);
figure(fig++, 'name', 'waveshaping avec anti-alias');
plot(out2); ylim ([-2,+2]); axis ([0,1000,-2,+2]);
wavwrite(0.9*phaser,fsam,'phaser.wav');
wavwrite(0.9*out1,fsam,'sans.wav');
wavwrite(0.9*out2,fsam,'avec.wav'); |
Partager