5

私は C シャープでピアノを作成していますが、現在、サウンドを再生するためのキーボード キーがあります。たとえば、キー A がノート C を再生します。私が抱えている問題は、同時に複数のキーを押して音を出したいということです。明らかに、何千もの if ステートメントを作成する必要があるため、すべての組み合わせを keyDown クラスに配置する必要はありません。とにかくこのあたりはありますか?

4

1 に答える 1

2

Windows は 1 つのメッセージ キューだけで動作するため、各時間単位でキー ダウン メッセージのみが処理されます。できることは、すべてのキー ダウン イベントを短時間 (たとえば 0.5 秒) で取得し、押されたすべてのキーをリストまたはキューに保存してから、キーに応じてすべてのサウンドを非同期に (スレッドを使用して) 再生することです。これまでにこれを行ったことはありませんが、うまくいくはずです。希望は助けます...

編集


わかりました、見てみましょう: 最初にキーを保存する場所のリスト

List<Key> _keys = new List<Key>();

次に、時間間隔で押されたキーをチェックするためのタイマーを開始します。

        var t = new System.Timers.Timer(500);    //you may try using an smaller value
        t.Elapsed += t_Elapsed;
        t.Start();

次に、t_Elapsedメソッド(WPF を使用している場合はDispatcherTimer、このタイマーを使用する必要があることに注意してくださいSystem.Timers

    void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (_keys.Count > 0)
        {
             //Here get all keys and play the sound using threads
             _keys.Clear();
        }
    }

そして、オンキーダウンメソッド:

void OnKeyDownMethod(object sender, KeyPressedEventArgs e)  //not sure this is the name of the EventArgs class
 {
    _keys.Add(e.Key);    //need to check
 }

これを試してみてください。お役に立てば幸いです。

于 2013-03-15T16:55:26.553 に答える