private static List<MidiTrack> SplitChannels(MidiTrack origtrack, List<MidiEvent> events)
{
/* Find the instrument used for each channel */
int[] channelInstruments = new int[16];
foreach (MidiEvent mevent in events) {
if (mevent.EventFlag == EventProgramChange) {
channelInstruments[mevent.Channel] = mevent.Instrument;
}
}
channelInstruments[9] = 128; /* Channel 9 = Percussion */
List<MidiTrack> result = new List<MidiTrack>();
foreach (MidiNote note in origtrack.Notes) {
bool foundchannel = false;
foreach (MidiTrack track in result) {
if (note.Channel == track.Notes[0].Channel) {
foundchannel = true;
track.AddNote(note);
}
}
if (!foundchannel) {
MidiTrack track = new MidiTrack(result.Count + 1);
track.AddNote(note);
track.Instrument = channelInstruments[note.Channel];
result.Add(track);
}
}
return result;
}