samer@20: % fileplay - Do plots for given file and play over MIDI channel 9 samer@20: % Data is played on kick and snare (note numbers 36 and 38). samer@20: % Metrical grid can be played on hi-hat, cowbell etc. samer@20: function player=fileplay(MO,file,varargin) samer@20: opts=prefs('vel',80,'dur',0.1,'shift',file{2},'metre',[],varargin{:}); samer@20: samer@20: disp(file{1}); samer@20: BDT=shift_beat(opts.shift,read(file{1})); samer@20: drumplot(BDT,'bar',4,'pause',0,varargin{:}); samer@20: player=playdrums(MO,[36,38,42,44,51,56,49,53],addmetre(opts.metre,BDT(:,[2,1,4])),opts); samer@20: end samer@20: samer@20: function player=playdrums(MO,PercMap,Evs,opts) samer@20: NN=map(PercMap,Evs(:,1)); samer@20: Times=(Evs(:,2)-Evs(1,2))/1000; samer@20: player=rendermidi(MO,window(zipmidi_abs(Times,opts.dur,9,NN,opts.vel)'),nows(MO)+1); samer@20: end samer@20: samer@20: function Evs=addmetre(metre,Evs) samer@20: for i=1:size(metre,1) samer@20: Evs=add_periodic(metre(i,1),metre(i,2),Evs); samer@20: end samer@20: end samer@20: samer@20: function X=add_periodic(m,type,Y) samer@20: [UMetPos,K]=unique(Y(:,3)); samer@20: Bars=(0:m:max(UMetPos))'; samer@20: BarTimes=interp1(UMetPos,Y(K,2),Bars); samer@20: Types=repmat(type,size(BarTimes)); samer@20: X=sort_by(2,vertcat(Y,[Types,BarTimes,Bars])); samer@20: end samer@20: samer@20: function X=sort_by(col,Y) samer@20: [dummy,K]=sort(Y(:,col)); samer@20: X=Y(K,:); samer@20: end