Mercurial > hg > aimmat
view aim-mat/tools/transferetotune.m @ 4:537f939baef0 tip
various bug fixes and changed copyright message
author | Stefan Bleeck <bleeck@gmail.com> |
---|---|
date | Tue, 16 Aug 2011 14:37:17 +0100 |
parents | 20ada0af3d7d |
children |
line wrap: on
line source
% tool % % INPUT VALUES: % % RETURN VALUE: % % This external file is included as part of the 'aim-mat' distribution package % (c) 2011, University of Southampton % Maintained by Stefan Bleeck (bleeck@gmail.com) % download of current version is on the soundsoftware site: % http://code.soundsoftware.ac.uk/projects/aimmat % documentation and everything is on http://www.acousticscale.org function sig=transferetotune(tune,art) % Tonlength: % a=0.25 % b=0.5 % c=1 if nargin < 1 % tunes: % Yankee Doodle tune='aC5aC5aD5aE5aC5aE5aD5aG4aC5aC5aD5aE5aC5aC5aB4aG4aC5aC5aD5aE5aF5aE5aD5aC5aB4aG4aA4aB4aC5aC5aC5aC5'; % Frere Jackes tune='aC5aD5aE5aC5aC5aD5aE5aC5aE5aF5aG5aE5aF5aG5'); end if nargin<2 % art='decreaseoddamplitude'; art='decreaseoddphase'; % art='sinus'; % art='harmonic'; % art='clicktrain'; end nr=size(tune,2); duration=0.25; sr=16000; sig=signal(0,sr); count=1; notecount=0; while count < nr-2 cur=tune(count); if cur~='a' & cur~='b' & cur~='c' error('Error in tune'); else if cur=='a' duration=0.25;end if cur=='b' duration=0.5;end if cur=='c' duration=1;end end cur1=tune(count+1); if cur1=='P'; fre=0; count=count+2; else cur2=tune(count+2); if count<nr-2 cur3=tune(count+3); if strcmp(cur3,'#'); current=[cur1 cur2 cur3]; count=count+4; notecount=notecount+1; else current=[cur1 cur2]; count=count+3; notecount=notecount+1; end else current=[cur1 cur2]; count=count+3; notecount=notecount+1; end fre=note2fre(current); end freq(notecount)=fre; end mifre=min(freq); for i=1:notecount octab(i)=log2(freq(i)/mifre); end maxoct=max(octab); for i=1:notecount atten(i)=-(maxoct-octab(i))*20; phase(i)=(maxoct-octab(i))*80; end for i=1:notecount fre=freq(i); if fre==0 ton=signal(duration,sr); else switch art case 'sinus' ton=sinus(duration,sr,fre); case 'clicktrain' ton=clicktrain(duration,sr,fre); case 'harmonic' bandwidth=1000; %fixed df1=256; df2=512; fc=1000; s=sprintf('genharmonics(signal(%f,%f),''fundamental'',''%f'',''filterprop'',[%f %f %f %f]);',duration,sr,fre,fc,df1,bandwidth,df2); eval(sprintf('ton=%s;',s)); case 'decreaseoddamplitude' bandwidth=2000; %fixed f0=125; df1=256; df2=512; fc=1000; type='decreaseoddamplitude'; amp=atten(i); s=sprintf('genharmonics(signal(%f,%f),''fundamental'',''%f'',''type'',''%s'',''changeby'',''%f'',''filterprop'',[%f %f %f %f]);',duration,sr,f0,type,amp,fc,df1,bandwidth,df2); eval(sprintf('ton=%s;',s)); case 'decreaseoddphase' bandwidth=2000; %fixed f0=125; df1=256; df2=512; fc=1000; type='decreaseoddphase'; amp=phase(i); s=sprintf('genharmonics(signal(%f,%f),''fundamental'',''%f'',''type'',''%s'',''changeby'',''%f'',''filterprop'',[%f %f %f %f]);',duration,sr,f0,type,amp,fc,df1,bandwidth,df2); eval(sprintf('ton=%s;',s)); end end ton=rampamplitude(ton,0.02); sig=append(sig,ton); end a=0;