예제 #1
0
        public void ProcessMessages()
        {
            if (_rtmidi == null || !_rtmidi->ok) return;

            byte* msg = stackalloc byte [32];

            while (true)
            {
                ulong size = 32;
                var stamp = RtMidiDll.InGetMessage(_rtmidi, msg, ref size);
                if (stamp < 0 || size == 0) break;

                var status = (byte)(msg[0] >> 4);
                var channel = (byte)(msg[0] & 0xf);

                if (status == 9)
                {
                    if (msg[2] > 0)
                        OnNoteOn?.Invoke(channel, msg[1], msg[2]);
                    else
                        OnNoteOff?.Invoke(channel, msg[1]);
                }
                else if (status == 8)
                {
                    OnNoteOff?.Invoke(channel, msg[1]);
                }
                else if (status == 0xb)
                {
                    OnControlChange?.Invoke(channel, msg[1], msg[2]);
                }
            }
        }
예제 #2
0
 public string GetPortName(int port)
 {
     if (_rtmidi == null || !_rtmidi->ok)
     {
         return(null);
     }
     return(Marshal.PtrToStringAnsi(RtMidiDll.GetPortName(_rtmidi, (uint)port)));
 }
예제 #3
0
        public void SendMessage(byte [] data)
        {
            if (_rtmidi == null || !_rtmidi->ok)
            {
                return;

                fixed(byte *ptr = &data[0])
                RtMidiDll.OutSendMessage(_rtmidi, ptr, data.Length);
        }
예제 #4
0
        public void Dispose()
        {
            if (_rtmidi == null || !_rtmidi->ok) return;

            RtMidiDll.InFree(_rtmidi);
            _rtmidi = null;

            System.GC.SuppressFinalize(this);
        }
예제 #5
0
        public MidiInPort(int portNumber)
        {
            _rtmidi = RtMidiDll.InCreateDefault();

            if (_rtmidi == null || !_rtmidi->ok)
                throw new System.InvalidOperationException("Failed to set up a MIDI input port.");

            RtMidiDll.OpenPort(_rtmidi, (uint)portNumber, "RtMidi In");
        }
예제 #6
0
        public MidiProbe()
        {
            _rtmidi = RtMidiDll.InCreateDefault();

            if (_rtmidi == null || !_rtmidi->ok)
            {
                UnityEngine.Debug.LogWarning("Failed to create an RtMidi device object.");
            }
        }
예제 #7
0
        public MidiOutPort(int portNumber)
        {
            _rtmidi = RtMidiDll.OutCreateDefault();

            if (_rtmidi != null && _rtmidi->ok)
            {
                RtMidiDll.OpenPort(_rtmidi, (uint)portNumber, "RtMidi Out");
            }

            if (_rtmidi == null || !_rtmidi->ok)
            {
                throw new System.InvalidOperationException("Failed to set up a MIDI output port.");
            }
        }
예제 #8
0
        public MidiPort(int portNumber, string portName)
        {
            _portName = portName;

            _rtmidi = RtMidiDll.InCreateDefault();

            if (_rtmidi == null || !_rtmidi->ok)
            {
                UnityEngine.Debug.LogWarning("Failed to create an RtMidi device object.");
                return;
            }

            RtMidiDll.OpenPort(_rtmidi, (uint)portNumber, "RtMidi Input");
        }
예제 #9
0
        public MidiProbe(Mode mode)
        {
            if (mode == Mode.In)
            {
                _rtmidi = RtMidiDll.InCreateDefault();
            }
            else // mode == Mode.Out
            {
                _rtmidi = RtMidiDll.OutCreateDefault();
            }

            _mode = mode;

            if (_rtmidi == null || !_rtmidi->ok)
            {
                throw new System.InvalidOperationException("Failed to create a MIDI client.");
            }
        }
예제 #10
0
        public void ProcessMessageQueue()
        {
            if (_rtmidi == null || !_rtmidi->ok)
            {
                return;
            }

            while (true)
            {
                var size    = 4ul;
                var message = stackalloc byte [(int)size];

                var stamp = RtMidiDll.InGetMessage(_rtmidi, message, ref size);
                if (size != 3)
                {
                    break;
                }

                var status  = message[0] >> 4;
                var channel = message[0] & 0xf;
                var data1   = message[1];
                var data2   = message[2];

                if (data1 > 0x7f || data2 > 0x7f)
                {
                    continue;                               // Invalid data
                }
                var noteOff = (status == 8) || (status == 9 && data2 == 0);

                if (status == 9 && !noteOff)
                {
                    GetChannelDevice(channel).ProcessNoteOn(data1, data2);
                }
                else if (noteOff)
                {
                    GetChannelDevice(channel).ProcessNoteOff(data1);
                }
                else if (status == 0xb)
                {
                    GetChannelDevice(channel).ProcessControlChange(data1, data2);
                }
            }
        }
예제 #11
0
        public void Dispose()
        {
            if (_rtmidi == null || !_rtmidi->ok)
            {
                return;
            }

            RtMidiDll.InFree(_rtmidi);
            _rtmidi = null;

            foreach (var dev in _channels)
            {
                if (dev != null)
                {
                    InputSystem.RemoveDevice(dev);
                }
            }

            System.GC.SuppressFinalize(this);
        }
예제 #12
0
        public void Dispose()
        {
            if (_rtmidi == null || !_rtmidi->ok)
            {
                return;
            }

            if (_mode == Mode.In)
            {
                RtMidiDll.InFree(_rtmidi);
            }
            else // _mode == Mode.Out
            {
                RtMidiDll.OutFree(_rtmidi);
            }

            _rtmidi = null;

            System.GC.SuppressFinalize(this);
        }