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