samer@20: % drumplots - return functions to do plots for one array of drum tracking data samer@20: % Execute each function in its own figure to see the results. samer@20: function PX=drumplots(BDT,varargin) samer@20: samer@20: % columns: time, type:{1,2}, error, beat pos, prob, KL, post entro, prior entro, beat period samer@20: opts=prefs('bar',4,'with_metre',0,'marker_size',2,varargin{:}); samer@20: K=find(BDT(:,2)==1); % kick samer@20: S=find(BDT(:,2)==2); % snare samer@20: TM=mod(BDT(:,4)+0.5,opts.bar)-0.5; samer@20: Surp=max(0,-log(BDT(:,5))); samer@20: Info=BDT(:,6); samer@20: HPrior=BDT(:,8); samer@20: HPost=BDT(:,7); samer@20: plotargs={'MarkerSize',opts.marker_size}; samer@20: samer@20: PX={ @()scat_with_metre([HPrior,Surp], 'surprise/nats', 'prior entropy/nats'), ... samer@20: @()scat_with_metre([HPost,Surp],'posterior entropy/nats','surprise/nats'), ... samer@20: @()scat_with_metre([Surp,Info], 'surprise/nats','information gain/nats'), ... samer@20: @()scat_with_metre([Info,HPost],'information gain/nats','posterior entropy/nats'), ... samer@20: @()scat_with_metre([HPrior,Info],'prior entropy/nats','information gain/nats'), ... samer@20: @()scat_with_metre([HPrior,HPost],'posterior entropy/nats', 'prior entropy/nats'), ... samer@20: @()scat_by_type([TM,Info], {'metrical position','information gain/nats'}), ... samer@20: @()scat_by_type([TM,Surp], {'metrical position','surprise/nats'}), ... samer@20: @()scat_by_type([TM,noisy(BDT(:,2),0.02)], {'metrical position','drum type'}), ... samer@20: @metre_entropies, ... samer@20: @()metre_hist, ... samer@20: @()total_info_dist, ... samer@20: @()mean_info_dist, ... samer@20: @()scat3d_by_type([HPrior,HPost,Info],{'prior entro','posterior entro','info gain'}), ... samer@20: % @()scat_by_type([HPrior,HPost,Info], { 'prior entropy/nats', 'posterior entropy/nats', 'information gain/nats'}); samer@20: }; samer@20: samer@20: samer@20: function y=noisy(x,k), y=x+k*randn(size(x)); end samer@20: samer@20: function h=metre_hist samer@20: DTime=round(8*TM); samer@20: T1=min(DTime); samer@20: T2=max(DTime); samer@20: ID=accumhist(DTime-T1+1,1,T2-T1+1); samer@20: colormap jet; samer@20: bar((T1:T2)/8,ID); samer@20: xlabel('metrical position'); samer@20: title('total event count'); samer@20: h=gca; samer@20: end samer@20: samer@20: function h=total_info_dist samer@20: DTime=round(8*TM); samer@20: T1=min(DTime); samer@20: T2=max(DTime); samer@20: ID=accumhist(DTime-T1+1,Info,T2-T1+1); samer@20: colormap jet; samer@20: bar((T1:T2)/8,ID); samer@20: xlabel('metrical position'); samer@20: title('total information gain'); samer@20: h=gca; samer@20: end samer@20: samer@20: function h=mean_info_dist samer@20: DTime=round(8*TM); samer@20: T1=min(DTime); samer@20: T2=max(DTime); samer@20: ID=accumhist(DTime-T1+1,Info,T2-T1+1); samer@20: CC=accumhist(DTime-T1+1,1,T2-T1+1); samer@20: colormap jet; samer@20: bar((T1:T2)/8,ID./CC); samer@20: xlabel('metrical position'); samer@20: title('mean information per event'); samer@20: h=gca; samer@20: end samer@20: function h=metre_entropies samer@20: newplot; hold on; samer@20: scat1([TM,BDT(:,8)],'b+'); samer@20: scat1([TM,BDT(:,7)],'ro'); samer@20: hold off; samer@20: legend({'prior entropy','posterior entropy'}); samer@20: xlabel('metrical position'); samer@20: ylabel('entropy/nats'); samer@20: rotate3d off; samer@20: h=gca; samer@20: end samer@20: samer@20: function h=scat_with_metre(X,lab1,lab2) samer@20: if opts.with_metre samer@20: h=scat_by_type([X,TM],{lab1,lab2,'metrical position'}); samer@20: camproj('orthographic'); samer@20: else samer@20: h=scat_by_type(X,{lab1,lab2}); samer@20: end samer@20: end samer@20: samer@20: function h=scat3d_by_type(X,labels) samer@20: h=scat_by_type(X,labels); samer@20: camproj('perspective'); samer@20: axis vis3d; samer@20: end samer@20: samer@20: function h=scat_by_type(X,labels) samer@20: newplot; hold on; samer@20: scat1(X(K,:),'ro'); samer@20: scat1(X(S,:),'b+'); samer@20: hold off; samer@20: legend({'kick','snare'}); samer@20: axislabels(labels); samer@20: if length(labels)>2, rotate3d on; samer@20: else rotate3d off; samer@20: end samer@20: h=gca; samer@20: end samer@20: samer@20: function scat1(X,marker) samer@20: if size(X,2)<=2 samer@20: plot(X(:,1),X(:,2),marker,plotargs{:}); samer@20: else samer@20: plot3(X(:,1),X(:,2),X(:,3),marker,plotargs{:}); samer@20: end samer@20: box on; samer@20: end samer@20: end samer@20: