void OnGUI()
        {
            var sourceCount = MidiDriver.CountSources();

            // Sources
            var temp = "Detected MIDI inputs:";

            for (var i = 0; i < sourceCount; i++)
            {
                var id   = MidiDriver.GetSourceIdAtIndex(i);
                var name = MidiDriver.GetSourceName(id);
                temp += "\n" + id.ToString("X8") + ": " + name;
            }
            EditorGUILayout.HelpBox(temp, MessageType.None);

            // Message history
            temp = "Recent MIDI messages:";
            foreach (var message in MidiDriver.Instance.History)
            {
                temp += "\n" + message.ToString();
            }
            EditorGUILayout.HelpBox(temp, MessageType.None);

            var destinationCount = MidiDriver.CountDestinations();

            // Destinations
            temp = "Detected MIDI outputs:";
            for (var i = 0; i < destinationCount; i++)
            {
                var id   = MidiDriver.GetDestinationIdAtIndex(i);
                var name = MidiDriver.GetDestinationName(id);
                temp += "\n" + id.ToString("X8") + ": " + name;
            }
            EditorGUILayout.HelpBox(temp, MessageType.None);
        }
Ejemplo n.º 2
0
        public int[] GetKnobNumbers(MidiChannel channel)
        {
            MidiDriver.Refresh();
            var cs      = _channelArray[(int)channel];
            var numbers = new int[cs._knobMap.Count];

            cs._knobMap.Keys.CopyTo(numbers, 0);
            return(numbers);
        }
Ejemplo n.º 3
0
        public int GetSysex(MidiSysex id)
        {
            MidiDriver.Refresh();

            int index = (int)id;

            if (index >= _sysexMem.Length)
            {
                return(0);
            }

            return(_sysexMem[index]);
        }
Ejemplo n.º 4
0
        public float GetKey(MidiChannel channel, int noteNumber)
        {
            MidiDriver.Refresh();
            var v = _channelArray[(int)channel]._noteArray[noteNumber];

            if (v > 1)
            {
                return(v - 1);
            }
            if (v > 0)
            {
                return(v);
            }
            return(0.0f);
        }
Ejemplo n.º 5
0
        public float GetKnob(MidiChannel channel, int knobNumber, float defaultValue)
        {
            MidiDriver.Refresh();
            var cs = _channelArray[(int)channel];

            if (_midiMap)
            {
                knobNumber = _midiMap.JackValue(knobNumber);
            }
            if (cs._knobMap.ContainsKey(knobNumber))
            {
                return(cs._knobMap[knobNumber]);
            }
            return(defaultValue);
        }
 public void SendMessage(MidiMessage msg)
 {
     if (_endpointId == uint.MaxValue)
     {
         // Send to all.
         for (var i = 0; i < MidiDriver.CountDestinations(); i++)
         {
             msg.endpoint = MidiDriver.GetDestinationIdAtIndex(i);
             MidiDriver.SendMessage(msg.Encode64Bit());
         }
     }
     else if (_endpointId != 0)
     {
         msg.endpoint = _endpointId;
         MidiDriver.SendMessage(msg.Encode64Bit());
     }
 }
Ejemplo n.º 7
0
 public bool IsPlaying()
 {
     MidiDriver.Refresh();
     return(_isPlaying);
 }
Ejemplo n.º 8
0
 public override int CountEndpoints()
 {
     return(MidiDriver.CountSources());
 }
Ejemplo n.º 9
0
 public override string GetEndpointName(uint endpointId)
 {
     return(MidiDriver.GetSourceName(endpointId));
 }
Ejemplo n.º 10
0
 public override uint GetEndpointIdAtIndex(int index)
 {
     return(MidiDriver.GetSourceIdAtIndex(index));
 }
Ejemplo n.º 11
0
 protected override void RemoveEndpoint(uint endpointId)
 {
     MidiDriver.RemoveSource(endpointId);
 }
Ejemplo n.º 12
0
 protected override void AddEndpoint()
 {
     MidiDriver.AddSource(this);
 }
Ejemplo n.º 13
0
 void OnDestroy()
 {
     MidiDriver.RemoveSource(_endpointId);
 }
Ejemplo n.º 14
0
        void Update()
        {
            Refresh();

            // Update the note state array.
            foreach (var cs in _channelArray)
            {
                for (var i = 0; i < 128; i++)
                {
                    var x = cs._noteArray[i];
                    if (x > 1)
                    {
                        cs._noteArray[i] = x - 1; // Key down -> Hold.
                    }
                    else if (x < 0)
                    {
                        cs._noteArray[i] = 0; // Key up -> Off.
                    }
                }
            }

            MidiDriver.Refresh();

            // Process the message queue.
            while (true)
            {
                if (msgQueue.Count == 0)
                {
                    break;
                }

                // Pop from the queue.
                MidiMessage message = msgQueue.Dequeue();

                // Split the first byte.
                var statusCode    = message.status >> 4;
                var channelNumber = message.status & 0xf;

                // Note on message?
                if (statusCode == 9)
                {
                    var velocity = 1.0f / 127 * message.data2 + 1;
                    _channelArray[channelNumber]._noteArray[message.data1]        = velocity;
                    _channelArray[(int)MidiChannel.All]._noteArray[message.data1] = velocity;
                    if (noteOnDelegate != null)
                    {
                        noteOnDelegate((MidiChannel)channelNumber, message.data1, velocity - 1);
                    }
                }

                // Note off message?
                if (statusCode == 8 || (statusCode == 9 && message.data2 == 0))
                {
                    _channelArray[channelNumber]._noteArray[message.data1]        = -1;
                    _channelArray[(int)MidiChannel.All]._noteArray[message.data1] = -1;
                    if (noteOffDelegate != null)
                    {
                        noteOffDelegate((MidiChannel)channelNumber, message.data1);
                    }
                }

                // CC message?
                if (statusCode == 0xb)
                {
                    // Normalize the value.
                    var level = 1.0f / 127 * message.data2;
                    // Update the channel if it already exists, or add a new channel.
                    int knobNumber = message.data1;
                    if (_midiMap)
                    {
                        knobNumber = _midiMap.JackValue(knobNumber);
                    }
                    _channelArray[channelNumber]._knobMap[knobNumber] = level;
                    // Do again for All-ch.
                    _channelArray[(int)MidiChannel.All]._knobMap[knobNumber] = level;
                    if (knobDelegate != null)
                    {
                        knobDelegate((MidiChannel)channelNumber, knobNumber, level);
                    }
                }

                // System message?
                if (statusCode == 0xf)
                {
                    if (channelNumber == 0)
                    {
                        if (message.data1 >= _sysexMem.Length)
                        {
                            return;
                        }

                        _sysexMem[message.data1] = message.data2;

                        if (sysexDelegate != null)
                        {
                            sysexDelegate((MidiSysex)message.data1, message.data2);
                        }
                    }
                    else
                    {
                        if (message.status == (byte)MidiRealtime.Clock)
                        {
                            if (realtimeDelegate != null)
                            {
                                realtimeDelegate(MidiRealtime.Clock);
                            }
                        }

                        if (message.status == (byte)MidiRealtime.Start)
                        {
                            _isPlaying = true;

                            if (realtimeDelegate != null)
                            {
                                realtimeDelegate(MidiRealtime.Start);
                            }
                        }

                        if (message.status == (byte)MidiRealtime.Continue)
                        {
                            _isPlaying = true;

                            if (realtimeDelegate != null)
                            {
                                realtimeDelegate(MidiRealtime.Continue);
                            }
                        }

                        if (message.status == (byte)MidiRealtime.Stop)
                        {
                            _isPlaying = false;

                            if (realtimeDelegate != null)
                            {
                                realtimeDelegate(MidiRealtime.Stop);
                            }
                        }
                    }
                }
            }
        }
 public override uint GetEndpointIdAtIndex(int index)
 {
     return(MidiDriver.GetDestinationIdAtIndex(index));
 }
Ejemplo n.º 16
0
 public override int CountEndpoints()
 {
     return(Application.platform.Equals(RuntimePlatform.Android) ? 0 : MidiDriver.CountSources());
 }
 public override string GetEndpointName(uint endpointId)
 {
     return(MidiDriver.GetDestinationName(endpointId));
 }
Ejemplo n.º 18
0
 public bool GetKeyUp(MidiChannel channel, int noteNumber)
 {
     MidiDriver.Refresh();
     return(_channelArray[(int)channel]._noteArray[noteNumber] < 0);
 }
 public override int CountEndpoints()
 {
     return(MidiDriver.CountDestinations());
 }