% VOWEL EXPLORER
%
% Guy J Brown
% MAD - Matlab Auditory Demostrations
% (C) University of Sheffield 1998
% updated July 1999 for v2.1 by Martin

function vowelExplorer(action)

if nargin<1
	action='init';
end

switch action

case 'init';
  f=findobj('Tag','vowelExplorer_fig');
  if ~isempty(f)
    figure(f);
  else  		
    vowelExplorer_gui;
    ud=get(gcf,'UserData');
		set(ud.waveaxes,'NextPlot','replacechildren','DrawMode','fast');
		ud.vowel1=zeros(1,2000);
		ud.vowel2=zeros(1,2000);
		ud.mixture=zeros(1,2000);
    ud.fs=10000;
		axes(ud.waveaxes);
    ud.waveplot=plot(ud.mixture(1501:2000),'EraseMode','background');
		set(gcf,'UserData',ud);
		oneChanged;
		twoChanged;
		vowelExplorer 'sliderChanged'
  end

case 'vowel1changed'
  oneChanged;
  
case 'vowel2changed'
  twoChanged;
	
case 'semitone1changed'
  oneChanged;
  
case 'semitone2changed'
  twoChanged;
  
case 'playOne'
  ud=get(gcf,'UserData');
  soundsc(ud.vowel1/1600,ud.fs);
  
case 'playTwo'
  ud=get(gcf,'UserData');
  soundsc(ud.vowel2/1600,ud.fs);
  
case 'playBoth'
  ud=get(gcf,'UserData');
  soundsc(ud.mixture/1600,ud.fs);	
  
case 'sliderChanged'
  ud=get(gcf,'UserData');
  ud.db=round(get(ud.slider1,'Value'));
  set(ud.edit1,'String',num2str(ud.db));
  set(gcf,'UserData',ud);
  plotWaveform;
  if (get(ud.check1,'Value'))
    plotBasilarMembrane;
  end

case 'ppboxchanged'
  plotWaveform;
  plotBasilarMembrane;
  
case 'boxChanged'
  ud=get(gcf,'UserData');
  ud.db=round(str2num(get(ud.edit1,'String')));
  ud.db=max(min(ud.db,ud.maxdb),ud.mindb);
  set(ud.edit1,'String',num2str(ud.db));
  set(ud.slider1,'Value',ud.db);
  set(gcf,'UserData',ud);
  plotWaveform;
  if (get(ud.check1,'Value'))
    plotBasilarMembrane;
  end

case 'recompute'
  plotBasilarMembrane;
  
case 'boxchanged'
  ud=get(gcf,'UserData');  
if get(ud.check1,'Value')
    plotBasilarMembrane;
  end
otherwise
  maduievent('vowelExplorer',action);
  
end

function plotBasilarMembrane
ud=get(gcf,'UserData');
bm=gammatonebank(ud.mixture(1301:2000),80,4000,32,10000);
axes(ud.bmaxes);
waveplot(bm(:,445:700),30,5);
% compute correlogram
bm=sqrt(0.000001+(bm.*(bm>0)));
acg=real(ifft(abs(fft(bm(:,189:700)')).^2))';
axes(ud.acgaxes);
waveplot(acg(:,1:128),30,0.1);
axes(ud.summaryaxes);
cla;
s=sum(acg);
hold on;
if (get(ud.showpitch,'Value')==1)
	slist=get(ud.semitonemenu1,'String');
	sstr1=char(slist(get(ud.semitonemenu1,'Value')));
	slist=get(ud.semitonemenu2,'String');
	sstr2=char(slist(get(ud.semitonemenu2,'Value')));
	fzero1=stringToF(sstr1);
	fzero2=stringToF(sstr2);
	plot([10000/fzero1 10000/fzero1],[0 1.1],'r');
	plot([10000/fzero2 10000/fzero2],[0 1.1],'r');
end
plot(s/max(s),'k');
hold off;

function f=stringToFzero(s)
if (s=='zero')
	f=100;
elseif (s=='quarter')
	f=100;
elseif (s=='half')
	f=105.946;
elseif (s=='one')
	f=105.946;
elseif (s=='two')
	f=112.2455;
elseif (s=='four')
	f=125.9906;
end

function f=stringToF(s)
switch(s)
case 'zero', f=100;
case 'quarter', f=101.4545;
case 'half', f=102.93;
case 'one', f=105.946;
case 'two', f=112.2455;
case 'four', f=125.9906;
end

function waveplot(m,inc,scale)
cla;
[row,col]=size(m);
x=[1 1:col col 1];
for i=row:-1:1,
	y=[0 scale*m(i,:)+inc*i 0 0];
	fill(x,y,'w');
end

function plotWaveform
ud=get(gcf,'UserData');
db=get(ud.slider1,'Value');
r=db2amp(db);
if (r<1)
	ud.mixture=ud.vowel1.*r+ud.vowel2;
else
	ud.mixture=ud.vowel1+ud.vowel2./r;
end
set(ud.waveplot,'YData',ud.mixture(1501:2000));
set(gcf,'UserData',ud);

function oneChanged
ud=get(gcf,'UserData');
vlist=get(ud.vowelmenu1,'String');
vstr=vlist(get(ud.vowelmenu1,'Value'));
slist=get(ud.semitonemenu1,'String');
sstr=slist(get(ud.semitonemenu1,'Value'));
set(ud.playonebutton,'String',['play ' char(vstr) ' ' char(sstr)]);
%v=load(fullfile(madroot,'data','vowels',[char(vstr) '.' char(sstr) '.mat']));
[v,fs]=auread(fullfile(madroot,'data','vowels',[char(vstr) '.' char(sstr) '.au']));
%ud.vowel1=v.data';
ud.vowel1=v'.*1000;
set(gcf,'UserData',ud);
textChanged;
plotWaveform;
plotBasilarMembrane;

function twoChanged
ud=get(gcf,'UserData');
vlist=get(ud.vowelmenu2,'String');
vstr=vlist(get(ud.vowelmenu2,'Value'));
slist=get(ud.semitonemenu2,'String');
sstr=slist(get(ud.semitonemenu2,'Value'));		
set(ud.playtwobutton,'String',['play ' char(vstr) ' ' char(sstr)]);
%v=load(fullfile(madroot,'data','vowels',[char(vstr) '.' char(sstr) '.mat']));
[v,fs]=auread(fullfile(madroot,'data','vowels',[char(vstr) '.' char(sstr) '.au']));
ud.vowel2=v'.*1000;
%ud.vowel2=v.data';
set(gcf,'UserData',ud);
textChanged;
plotWaveform;
plotBasilarMembrane;

function textChanged
ud=get(gcf,'UserData');
vlist=get(ud.vowelmenu1,'String');
vstr1=vlist(get(ud.vowelmenu1,'Value'));
vlist=get(ud.vowelmenu2,'String');
vstr2=vlist(get(ud.vowelmenu2,'Value'));
set(ud.ratiotext,'String',[char(vstr1) '/' char(vstr2) ' amplitude ratio (dB)']);
set(gcf,'UserData',ud);
