public static Message getChannelMessage(int msgtype, int channel, int b1, int b2) { Message msg = null; switch (msgtype) { case 0x8: msg = new NoteOffMessage(channel, b1, b2); break; case 0x9: msg = new NoteOnMessage(channel, b1, b2); break; case 0xa: msg = new AftertouchMessage(channel, b1, b2); break; case 0xb: msg = new ControllerMessage(channel, b1, b2); break; case 0xc: msg = new PatchChangeMessage(channel, b1); break; case 0xd: msg = new ChannelPressureMessage(channel, b1); break; case 0xe: int wheelamt = ((b1 % 128) * 128) + (b2 % 128); msg = new PitchWheelMessage(channel, wheelamt); break; default: break; } //convert noteon msg w/ vel = 0 to noteoff msg if (msg is NoteOnMessage) { NoteOnMessage noteOn = (NoteOnMessage)msg; if (noteOn.velocity == 0) { NoteOffMessage noteOff = new NoteOffMessage(noteOn.channel, noteOn.noteNumber, 0); msg = noteOff; } } return(msg); }
public static void finalizeTrack(Track track) { bool haveName = false; bool seenNoteOn = false; for (int i = 0; i < track.events.Count; i++) { if (!haveName && (track.events[i] is TrackNameEvent)) { track.setName(((TrackNameEvent)track.events[i]).trackName); haveName = true; } //scan events for these values only before the first note on event if ((!seenNoteOn) && (track.events[i] is MessageEvent)) { Message msg = ((MessageEvent)track.events[i]).msg; if (msg is NoteOnMessage) { track.setOutputChannel(((NoteOnMessage)msg).channel); seenNoteOn = true; } if (msg is PatchChangeMessage) { track.setPatchNum(((PatchChangeMessage)msg).patchNumber); } if (msg is ControllerMessage) { ControllerMessage ctrlMsg = (ControllerMessage)msg; if (ctrlMsg.ctrlNumber == 7) { track.setVolume(ctrlMsg.ctrlValue); } if (ctrlMsg.ctrlNumber == 10) { track.setPan(ctrlMsg.ctrlValue); } } } if (haveName && seenNoteOn) { break; } } }