function y=synth(freq,dur,amp,Fs,type)
% y=synth(freq,dur,amp,Fs,type)
%
% Synthesize a single note
%
% Inputs:
%  freq - frequency in Hz
%  dur - duration in seconds
%  amp - Amplitude in range [0,1]
%  Fs -  sampling frequency in Hz
%  type - string to select synthesis type
%         current options: 'fm', 'sine', ' square' or 'saw'
%


    if nargin<5
      error('Five arguments required for synth()');
    end
    
    N = floor(dur*Fs);
    n=0:N-1;
    if (strcmp(type,'sine') || strcmp(type,'sin'))
      y = amp.*sin(2*pi*n*freq/Fs);
      
    elseif (strcmp(type,'square'))
      y = amp.*square(2*pi*n*freq/Fs);
    
    
    elseif (strcmp(type,'saw'))
    
      T = (1/freq)*Fs;     % period in fractional samples
      ramp = (0:(N-1))/T;
      y = ramp-fix(ramp);
      y = amp.*y;
      y = y - mean(y);
    
    elseif (strcmp(type,'fm'))
    
      t = 0:(1/Fs):dur;
      envel = interp1([0 dur/6 dur/3 dur/5 dur], [0 1 .75 .6 0], 0:(1/Fs):dur);
      I_env = 5.*envel;
      y = envel.*sin(2.*pi.*freq.*t + I_env.*sin(2.*pi.*freq.*t));
      
    else
      error('Unknown synthesis type');
    end
    
    % smooth edges w/ 10ms ramp
    if (dur > .02)
      L = 2*fix(.01*Fs)+1;  % L odd
      ramp = bartlett(L)';  % odd length
      L = ceil(L/2);
      y(1:L) = y(1:L) .* ramp(1:L);
      y(end-L+1:end) = y(end-L+1:end) .* ramp(end-L+1:end);
    end
end