Beispiel #1
0
        private void ProcessMessage(ref uOSC.Message message)
        {
            //メッセージアドレスがない、あるいはメッセージがない不正な形式の場合は処理しない
            if (message.address == null || message.values == null)
            {
                StatusMessage = "Bad message.";
                return;
            }

            //コントローラ操作情報 v2.1
            if (message.address == "/VMC/Ext/Con" &&
                (message.values[0] is int) &&
                (message.values[1] is string) &&
                (message.values[2] is int) &&
                (message.values[3] is int) &&
                (message.values[4] is int) &&
                (message.values[5] is float) &&
                (message.values[6] is float) &&
                (message.values[7] is float)
                )
            {
                con.active  = (int)message.values[0];
                con.name    = (string)message.values[1];
                con.IsLeft  = (int)message.values[2];
                con.IsTouch = (int)message.values[3];
                con.IsAxis  = (int)message.values[4];
                con.Axis.x  = (float)message.values[5];
                con.Axis.y  = (float)message.values[6];
                con.Axis.z  = (float)message.values[7];

                //イベントを呼び出す
                if (ControllerInputAction != null)
                {
                    ControllerInputAction.Invoke(con);
                }
                if (con.IsAxis == 0)
                {
                    if (con.IsLeft == 1)
                    {
                        LastInput = "Left-" + con.name + " = " + con.active;
                        InputDictionary["Left-" + con.name] = (con.active != 0);
                    }
                    else
                    {
                        LastInput = "Right-" + con.name + " = " + con.active;
                        InputDictionary["Right-" + con.name] = (con.active != 0);
                    }
                }
            }
            //キーボード操作情報 v2.1
            else if (message.address == "/VMC/Ext/Key" &&
                     (message.values[0] is int) &&
                     (message.values[1] is string) &&
                     (message.values[2] is int)
                     )
            {
                key.active  = (int)message.values[0];
                key.name    = (string)message.values[1];
                key.keycode = (int)message.values[2];

                //イベントを呼び出す
                if (KeyInputAction != null)
                {
                    KeyInputAction.Invoke(key);
                }

                LastInput = "Key-" + key.name + " = " + key.active + " (" + key.keycode + ")";
            }
            // v2.2
            else if (message.address == "/VMC/Ext/Midi/Note" &&
                     (message.values[0] is int) &&
                     (message.values[1] is int) &&
                     (message.values[2] is int) &&
                     (message.values[3] is float)
                     )
            {
                note.active   = (int)message.values[0];
                note.channel  = (int)message.values[1];
                note.note     = (int)message.values[2];
                note.velocity = (float)message.values[3];

                //イベントを呼び出す
                if (MidiNoteInputAction != null)
                {
                    MidiNoteInputAction.Invoke(note);
                }

                LastInput = "Note-" + note.note + " = " + note.active + "/" + note.channel + "/" + note.velocity;
                InputDictionary["Note-" + note.note] = (note.active != 0);
            }
            // v2.2
            else if (message.address == "/VMC/Ext/Midi/CC/Val" &&
                     (message.values[0] is int) &&
                     (message.values[1] is float)
                     )
            {
                ccvalue.knob  = (int)message.values[0];
                ccvalue.value = (float)message.values[1];

                //イベントを呼び出す
                if (MidiCCValueInputAction != null)
                {
                    MidiCCValueInputAction.Invoke(ccvalue);
                }

                LastInput = "CC Val " + ccvalue.knob + " = " + ccvalue.value;

                if (ccvalue.knob >= 0 && ccvalue.knob < 128)
                {
                    CCValuesMonitor[ccvalue.knob] = ccvalue.value;
                }
            }
            // v2.2
            else if (message.address == "/VMC/Ext/Midi/CC/Bit" &&
                     (message.values[0] is int) &&
                     (message.values[1] is int)
                     )
            {
                ccbutton.knob   = (int)message.values[0];
                ccbutton.active = (int)message.values[1];

                //イベントを呼び出す
                if (MidiCCButtonInputAction != null)
                {
                    MidiCCButtonInputAction.Invoke(ccbutton);
                }
                LastInput = "CC-" + ccbutton.knob + " = " + ccbutton.active;
                InputDictionary["CC-" + ccbutton.knob] = (ccbutton.active != 0);
            }
        }