void NoteOn(MidiChannel channel, int note, float velocity) { if (!FilterNote(channel, note)) { return; } velocity = Mathf.Lerp(_velocityOffset, 1.0f, velocity); if (_eventType == EventType.Trigger) { _triggerEvent.Invoke(velocity); } else if (_eventType == EventType.Gate) { if (_voiceMode == VoiceMode.Mono && _lastNote != -1 && _lastNote != note) { _noteOffEvent.Invoke(_lastNote); } _noteOnEvent.Invoke(note, velocity); _lastNote = note; } else if (_eventType == EventType.Toggle) { _toggle ^= true; if (_toggle) { _toggleOnEvent.Invoke(); } else { _toggleOffEvent.Invoke(); } } else // EventType.Value { _value.targetValue = _onValue * velocity; } }
/// <summary> /// Play at specified time. /// </summary> public void Play(float time = -1) { //if( _sequencers == null ){ if (_multiSequencer == null) { Debug.LogWarning("Can't play, you need to load a file first.\n"); return; } if (time != -1) { _time = time; } // Fire note off messages. for (int ch = 0; ch < 16; ch++) { for (int k = 0; k < 128; k++) { if (_onMemo[ch, k]) { _onNoteOffEvent.Invoke(ch, (byte)k); _onMemo[ch, k] = false; } } } _isPlaying = true; List <MidiEvent> events = _multiSequencer.Start(_time); if (_time == 0) { DispatchEvents(events); } _onPlayEvent.Invoke(); }
public void OnReceiveMessage(MidiMessage message) { switch (message.messageType) { case MidiMessageType.NoteOn: OnNoteOn(message.midiNote, message.velocity); OnNoteOnEvent.Invoke(message.midiNote, message.velocity); break; case MidiMessageType.NoteOff: OnNoteOff(message.midiNote, message.velocity); OnNoteOffEvent.Invoke(message.midiNote, message.velocity); break; case MidiMessageType.NoteAftertouch: OnNoteAftertouch(message.midiNote, message.velocity); OnNoteAftertouchEvent.Invoke(message.midiNote, message.velocity); break; } }