Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
    /// <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();
    }
Beispiel #3
0
        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;
            }
        }