public void Process(VstEventCollection events) { int _transposeSemitones = _plugin.Transpose.Semitones; foreach (VstEvent anyEvent in events) { if (anyEvent.EventType != VstEventTypes.MidiEvent) { continue; } VstMidiEvent midiEvent = (VstMidiEvent)anyEvent; if (((midiEvent.Data[0] & 0xF0) == 0x80 || (midiEvent.Data[0] & 0xF0) == 0x90)) { // these are all the note on and note off events. if (_transposeSemitones != 0) { VstMidiEvent mappedEvent = null; byte[] midiData = new byte[4]; midiData[0] = midiEvent.Data[0]; int _note = midiEvent.Data[1] + _transposeSemitones; if (_note < 0 || _note > 127) { continue; // skip out of range notes. } midiData[1] = (byte)_note; midiData[2] = midiEvent.Data[2]; mappedEvent = new VstMidiEvent(midiEvent.DeltaFrames, midiEvent.NoteLength, midiEvent.NoteOffset, midiData, midiEvent.Detune, midiEvent.NoteOffVelocity); Events.Add(mappedEvent); // add raw note-on note numbers to the queue if ((midiEvent.Data[0] & 0xF0) == 0x90) { lock (((ICollection)NoteOnEvents).SyncRoot) { NoteOnEvents.Enqueue(midiEvent.Data[1]); } } } else { // we're not transposing, so just pass it through. Events.Add(anyEvent); } } else { // not a midi on-off event, so pass it through. Events.Add(anyEvent); } } }
public void Process(VstEventCollection events) { foreach (VstEvent evnt in events) { if (evnt.EventType != VstEventTypes.MidiEvent) { continue; } var midiEvent = (VstMidiEvent)evnt; if (((midiEvent.Data[0] & 0xF0) == 0x80 || (midiEvent.Data[0] & 0xF0) == 0x90)) { if (_noteMap.Contains(midiEvent.Data[1])) { byte[] midiData = new byte[4]; midiData[0] = midiEvent.Data[0]; midiData[1] = _noteMap[midiEvent.Data[1]].OutputNoteNumber; midiData[2] = midiEvent.Data[2]; var mappedEvent = new VstMidiEvent(midiEvent.DeltaFrames, midiEvent.NoteLength, midiEvent.NoteOffset, midiData, midiEvent.Detune, midiEvent.NoteOffVelocity); Events.Add(mappedEvent); // add raw note-on note numbers to the queue if ((midiEvent.Data[0] & 0xF0) == 0x90) { lock (((ICollection)NoteOnEvents).SyncRoot) { NoteOnEvents.Enqueue(midiEvent.Data[1]); } } } else if (MidiThru) { // add original note event Events.Add(evnt); } } else if (MidiThru) { // add original (non-note) event Events.Add(evnt); } } }