Mercurial > hg > smallbox
diff util/matlab_midi/piano_roll.m @ 81:a30e8bd6d948
matlab_midi scripts
author | Ivan <ivan.damnjanovic@eecs.qmul.ac.uk> |
---|---|
date | Mon, 28 Mar 2011 17:35:01 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/matlab_midi/piano_roll.m Mon Mar 28 17:35:01 2011 +0100 @@ -0,0 +1,46 @@ +function [PR,t,nn] = piano_roll(Notes,vel,ts) +% +% Inputs: +% Notes: A 'notes' matrix as returned from midiInfo.m +% vel: (optional) if vel==1, set value to note velocity instead of 1. (default 0) +% ts: (optional) time step of one 'pixel' in seconds (default 0.01) +% +% Outputs: +% PR: PR(ni,ti): value at note index ni, time index ti +% t: t(ti): time value in seconds at time index ti +% nn: nn(ni): note number at note index ti +% +% (i.e. t and nn provide 'real-world units' for PR) +% + +% Copyright (c) 2009 Ken Schutte +% more info at: http://www.kenschutte.com/midi + +if nargin < 2 + vel = 0; +end +if nargin < 3 + ts = 0.01; +end + +Nnotes = size(Notes,1); + +n1 = round(Notes(:,5)/ts)+1; +n2 = round(Notes(:,6)/ts)+1; + +if vel == 0 + vals = ones(Nnotes,1); +else + vals = Notes(:,4); % velocity +end + +for i=1:Nnotes + PR(Notes(i,3), n1(i):n2(i)) = vals(i); +end + +% create quantized time axis: +t = linspace(0,max(Notes(:,6)),size(PR,2)); +% note axis: +nn = min(Notes(:,3)):max(Notes(:,3)); +% truncate to notes used: +PR = PR(nn,:);