www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/physmodel/ksstring/pianoroll.m
function pianoroll(midistruct,col,mstart,mend) % function pianoroll(midi,col,mstart,mend) show piano roll representation of midi tracks % % This function plots a simple piano roll representation of the given cell array % (or matrix in the case of one midi track) of midi tracks. Midi tracks may % be generated from standard MIDI files by the function midird. % % Example: pianoroll(midi); % plots all of the midi notes % pianoroll(midi{2}); % plots only the midi notes % % contained in midi track 2 () % pianoroll(midi{3},1,100,200); % plots the 100th - 200th midi % % notes in midi track 3 in color % % 1 (provided these notes exist!) % % From MATLAB MIDI tools midi = midistruct.data; THICKNESS = 4; XDIM = 1024; if iscell(midi) midi = mergetracks(midi); end [lx,ly] = size(midi); if nargin < 4 mend = lx; end if nargin < 3 mstart = 1; end %if nargin < 5 UNIT = XDIM/(midi(mend,2)-midi(mstart,2)); %end if nargin < 2 col=0; end proll = zeros(128*THICKNESS,XDIM); for k = mstart:mend; if midi(k,5) ~= 0 x1 = 1+midi(k,3)*THICKNESS; y1 = 1+ceil(UNIT*midi(k,2)); x2 = midi(k,3)*THICKNESS+THICKNESS-col; y2 = 1+ceil(UNIT*(midi(k,2)+midi(k,4))); proll(1+midi(k,3)*THICKNESS:(midi(k,3)*THICKNESS+THICKNESS-col),... 1+ceil(UNIT*midi(k,2)):1+ceil(UNIT*(midi(k,2)+midi(k,4)))) = (midi(k,6)+1+col) * 10; proll(x1:x2,y1:y1+2) = 100; proll(x1:x2,y2:y2+2) = 100; %proll(x1,y1:y2) = 100; %proll(x2,y1:y2) = 100; end end %image(proll(rev(1:128*THICKNESS),:)); f = figure('Position',[500 300 660 650],'MenuBar','none','Units','Normalized'); width = 0.87; h = 0.91; top = 0.06; Caxes1 = axes('position', [0.08 top width h]); pa = image(proll); %get(Caxes1); axis xy; set(Caxes1,'YTick',[],'YTickLabel',''); axis([midi(mstart,2)*UNIT (midi(mend,2)+midi(mend,4))*UNIT 0 1]); xlabels = str2num(get(Caxes1,'XTickLabel')); newxlabels = xlabels.*midistruct.ms_per_tick./UNIT/1000; set(Caxes1,'XTickLabel',num2str(newxlabels,'%2.2f')); xlabel('Time (seconds)'); miny = min(midi(:,3)-3)*THICKNESS; maxy = max(midi(:,3)+3)*THICKNESS; V = axis; V(3)=miny; V(4)=maxy; axis(V); colormap('lines'); c=colormap; c(1,:)=[1 1 1]; colormap(c); center=round(THICKNESS/3); [yy,xx]=size(proll); %for k=10:100 for k=min(midi(:,3)-3):max(midi(:,3)+3) line([1 xx],[k*THICKNESS+0.5 k*THICKNESS+0.5]); text(midi(mstart,2)*UNIT-50,1+k*THICKNESS+center,midi2note(k)); text((midi(mend,2)+midi(mend,4))*UNIT+10,1+k*THICKNESS+center,midi2note(k)); end %v = axis; %v = [v(1:2) 0 127]; %axis(v); return; if nargin < 3 proll = zeros(128*THICKNESS,XDIM); else [sy,sx]=size(proll); if (sy < 128*THICKNESS) | ( sx < XDIM ) pold = proll; proll = zeros(128*THICKNESS,XDIM); proll(1:sy,1:sx)=pold; end end