www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/physmodel/ksstring/MergeTracks.m

    function trackout = MergeTracks(tracksin)
% function trackout = MergeTracks(tracksin)     merge tracks given as cell array tracksin
%
%  Function midird returns the note information within a cell array. 
%  This function merges all MIDI tracks in tracksin while maintaining
%  time consistency.
%

TUPLEN = 6;       % important:  # components of the midi n-tuple

if ~iscell(tracksin)
   trackout = tracksin;
   return
end

ntrks = length(tracksin);
lx = zeros(1,ntrks);
ct = 1;

for k=1:ntrks
   [lx(k),ly] = size(tracksin{k});
   if ly ~= TUPLEN
      disp('MergeTracks: mismatch between TUPLEN and array size');
      return;
   end
   if lx(k) ~= 0
      trackin{ct} = tracksin{k};
      trackmax(ct) = lx(k);
      ct = ct + 1;   
   end
      
end

ntrks = ct - 1;
trackptr = ones(1,ntrks);
tmp = zeros(ntrks,TUPLEN);
trackout = zeros(sum(lx),TUPLEN);

for k=1:ntrks
   tmp(k,:) = trackin{k}(1,:);
end

abstime = 0;

for k = 1:sum(lx)

   nexttime = min(tmp(:,2)-abstime);
   idx = find(nexttime == (tmp(:,2)-abstime));
   idx = idx(1);
   
   trackout(k,:) = tmp(idx,:);
   trackout(k,1) = nexttime;
   abstime = trackout(k,2);
   
   trackptr(idx) = trackptr(idx) + 1;

   if trackptr(idx) > trackmax(idx)
      tmp(idx,2) = inf;
   else      
      tmp(idx,:) = trackin{idx}(trackptr(idx),:);
   end   
      
end