diff util/matlab_midi/midi2audio.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/midi2audio.m	Mon Mar 28 17:35:01 2011 +0100
@@ -0,0 +1,66 @@
+function [y,Fs]=midi2audio(input,Fs,synthtype)
+% y = midi2audio(input, Fs, synthtype)
+% y = midi2audio(input, Fs)
+% y = midi2audio(input)
+%
+% Convert midi structure to a digital waveform
+%
+% Inputs:
+%  input - can be one of:
+%    a structure: matlab midi structure (created by readmidi.m)
+%    a string: a midi filename
+%    other: a 'Notes' matrix (as ouput by midiInfo.m)
+%
+%  synthtype - string to choose synthesis method
+%      passed to synth function in synth.m
+%      current choices are: 'fm', 'sine' or 'saw'
+%      default='fm'
+%
+%  Fs - sampling frequency in Hz (beware of aliasing!)
+%       default =  44.1e3
+
+% Copyright (c) 2009 Ken Schutte
+% more info at: http://www.kenschutte.com/midi
+
+if (nargin<2)
+  Fs=44.1e3;
+end
+if (nargin<3)
+  synthtype='fm';
+end
+
+endtime = -1;
+if (isstruct(input))
+  [Notes,endtime] = midiInfo(input,0);
+elseif (ischar(input))
+  [Notes,endtime] = midiInfo(readmidi(input), 0);
+else
+  Notes = input;
+end
+
+% t2 = 6th col
+if (endtime == -1)
+  endtime = max(Notes(:,6));
+end
+if (length(endtime)>1)
+  endtime = max(endtime);
+end
+
+
+y = zeros(1,ceil(endtime*Fs));
+
+for i=1:size(Notes,1)
+
+  f = midi2freq(Notes(i,3));
+  dur = Notes(i,6) - Notes(i,5);
+  amp = Notes(i,4)/127;
+
+  yt = synth(f, dur, amp, Fs, synthtype);
+
+  n1 = floor(Notes(i,5)*Fs)+1;
+  N = length(yt);  
+
+  % ensure yt is [1,N]:
+  y(n1:n1+N-1) = y(n1:n1+N-1) + reshape(yt,1,[]);
+
+end