samer@20
|
1 % fileplay - Do plots for given file and play over MIDI channel 9
|
samer@20
|
2 % Data is played on kick and snare (note numbers 36 and 38).
|
samer@20
|
3 % Metrical grid can be played on hi-hat, cowbell etc.
|
samer@20
|
4 function player=fileplay(MO,file,varargin)
|
samer@20
|
5 opts=prefs('vel',80,'dur',0.1,'shift',file{2},'metre',[],varargin{:});
|
samer@20
|
6
|
samer@20
|
7 disp(file{1});
|
samer@20
|
8 BDT=shift_beat(opts.shift,read(file{1}));
|
samer@20
|
9 drumplot(BDT,'bar',4,'pause',0,varargin{:});
|
samer@20
|
10 player=playdrums(MO,[36,38,42,44,51,56,49,53],addmetre(opts.metre,BDT(:,[2,1,4])),opts);
|
samer@20
|
11 end
|
samer@20
|
12
|
samer@20
|
13 function player=playdrums(MO,PercMap,Evs,opts)
|
samer@20
|
14 NN=map(PercMap,Evs(:,1));
|
samer@20
|
15 Times=(Evs(:,2)-Evs(1,2))/1000;
|
samer@20
|
16 player=rendermidi(MO,window(zipmidi_abs(Times,opts.dur,9,NN,opts.vel)'),nows(MO)+1);
|
samer@20
|
17 end
|
samer@20
|
18
|
samer@20
|
19 function Evs=addmetre(metre,Evs)
|
samer@20
|
20 for i=1:size(metre,1)
|
samer@20
|
21 Evs=add_periodic(metre(i,1),metre(i,2),Evs);
|
samer@20
|
22 end
|
samer@20
|
23 end
|
samer@20
|
24
|
samer@20
|
25 function X=add_periodic(m,type,Y)
|
samer@20
|
26 [UMetPos,K]=unique(Y(:,3));
|
samer@20
|
27 Bars=(0:m:max(UMetPos))';
|
samer@20
|
28 BarTimes=interp1(UMetPos,Y(K,2),Bars);
|
samer@20
|
29 Types=repmat(type,size(BarTimes));
|
samer@20
|
30 X=sort_by(2,vertcat(Y,[Types,BarTimes,Bars]));
|
samer@20
|
31 end
|
samer@20
|
32
|
samer@20
|
33 function X=sort_by(col,Y)
|
samer@20
|
34 [dummy,K]=sort(Y(:,col));
|
samer@20
|
35 X=Y(K,:);
|
samer@20
|
36 end
|