Exemplo n.º 1
0
    /// <summary>
    /// すべてのMIDIInデバイスの名前を取得します。
    /// </summary>
    /// <returns></returns>
    private string[] midiInDeviceEnum()
    {
        List <string> names = new List <string>();
        int           inNum = MIDIIN.GetDeviceNum();

        for (int i = 0; i < inNum; i++)
        {
            names.Add(MIDIIN.GetDeviceName(i));
        }
        return(names.ToArray());
    }
Exemplo n.º 2
0
        /// <summary>
        /// MIDIメッセージを取得するスレッド
        /// </summary>
        private void MIDILoadThread()
        {
            SetEnableEnd(true);

            MIDIIN midiIn = null;

            try
            {
                midiIn = new MIDIIN(GetSelectedDeviceName());
                while (!token.IsCancellationRequested)
                {
                    byte[] message = midiIn.GetMIDIMessage();
                    if (message.Length == 0)
                    {
                        Thread.Sleep(1);
                        continue;
                    }

                    //MIDIメッセージ表示
                    PrintMIDIMessage(message);

                    //midiメッセージ毎に分岐
                    //ノートオン
                    if (message[0] == 0x90 + MIDIChannel)
                    {
                        //ノートが選択されていた場合
                        if (GetRadioIsCheckde(noteRadio))
                        {
                            //指定の音階の場合
                            if (message[1] == GetNoteNumber())
                            {
                                //ベロシティーでOnかOffか判定
                                if (message[2] != 0)
                                {
                                    ReverbOn();
                                }
                                else
                                {
                                    ReverbOff();
                                }
                            }
                        }
                    }
                    //ノートオフ
                    else if (message[0] == 0x80 + MIDIChannel)
                    {
                        //ノートが選択されていた場合
                        if (GetRadioIsCheckde(noteRadio))
                        {
                            //指定の音階の場合
                            if (message[1] == GetNoteNumber())
                            {
                                ReverbOff();
                            }
                        }
                    }
                    //コントロールチェンジ
                    else if (message[0] == 0xB0 + MIDIChannel)
                    {
                        //コントロールチェンジ選択時
                        if (GetRadioIsCheckde(ccRadio))
                        {
                            //指定のCC番号の場合
                            if (message[1] == GetCCNumber())
                            {
                                //64以上の(63より多い)場合にOn
                                if (message[2] > 63)
                                {
                                    ReverbOn();
                                }
                                else
                                {
                                    ReverbOff();
                                }
                            }
                        }
                    }
                    else /*何もしない*/ } {
            }
        }
        catch
        {
            //例外処理はメインスレッドで行う。そのため、呼び出し元に例外を再スロー。
            throw;
        }
        finally
        {
            if (midiIn != null)
            {
                midiIn.Dispose();
                midiIn = null;
            }
            //有効無効切り替え
            SetEnableEnd(false);
            SetEnableStart(true);
        }
    }