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