ivan@81: function y=synth(freq,dur,amp,Fs,type) ivan@81: % y=synth(freq,dur,amp,Fs,type) ivan@81: % ivan@81: % Synthesize a single note ivan@81: % ivan@81: % Inputs: ivan@81: % freq - frequency in Hz ivan@81: % dur - duration in seconds ivan@81: % amp - Amplitude in range [0,1] ivan@81: % Fs - sampling frequency in Hz ivan@81: % type - string to select synthesis type ivan@81: % current options: 'fm', 'sine', or 'saw' ivan@81: ivan@81: % Copyright (c) 2009 Ken Schutte ivan@81: % more info at: http://www.kenschutte.com/midi ivan@81: ivan@81: if nargin<5 ivan@81: error('Five arguments required for synth()'); ivan@81: end ivan@81: ivan@81: N = floor(dur*Fs); ivan@81: ivan@81: if N == 0 ivan@81: warning('Note with zero duration.'); ivan@81: y = []; ivan@81: return; ivan@81: ivan@81: elseif N < 0 ivan@81: warning('Note with negative duration. Skipping.'); ivan@81: y = []; ivan@81: return; ivan@81: end ivan@81: ivan@81: n=0:N-1; ivan@81: if (strcmp(type,'sine')) ivan@81: y = amp.*sin(2*pi*n*freq/Fs); ivan@81: ivan@81: elseif (strcmp(type,'saw')) ivan@81: ivan@81: T = (1/freq)*Fs; % period in fractional samples ivan@81: ramp = (0:(N-1))/T; ivan@81: y = ramp-fix(ramp); ivan@81: y = amp.*y; ivan@81: y = y - mean(y); ivan@81: ivan@81: elseif (strcmp(type,'fm')) ivan@81: ivan@81: t = 0:(1/Fs):dur; ivan@81: envel = interp1([0 dur/6 dur/3 dur/5 dur], [0 1 .75 .6 0], 0:(1/Fs):dur); ivan@81: I_env = 5.*envel; ivan@81: y = envel.*sin(2.*pi.*freq.*t + I_env.*sin(2.*pi.*freq.*t)); ivan@81: ivan@81: else ivan@81: error('Unknown synthesis type'); ivan@81: end ivan@81: ivan@81: % smooth edges w/ 10ms ramp ivan@81: if (dur > .02) ivan@81: L = 2*fix(.01*Fs)+1; % L odd ivan@81: ramp = bartlett(L)'; % odd length ivan@81: L = ceil(L/2); ivan@81: y(1:L) = y(1:L) .* ramp(1:L); ivan@81: y(end-L+1:end) = y(end-L+1:end) .* ramp(end-L+1:end); ivan@81: end