□投稿者/ イチ (6回)-(2010/01/21(Thu) 15:11:03)
|
分類:[.NET 全般]
すみません。また質問させて頂きます。私はC#で簡単なメトロノームを作ろうとしているのですが、どうしてもテンポがずれてしまいます。 timerを使って時間を計算しているのですが、timerでは若干ズレが生じるのでしょうか?
プログラムの内容はこんな感じです。 テンポを120として実装すると、ans=5となり、0.1秒毎に実装されるtimer2_Tickにてansの値を1ずつ引いています。 ans=1となった時、音を鳴らして、カウントを1つ増やします。
timer2_Tickの呼び出し 1回目:ans=5-1=4 2回目:ans=4-1=3 3回目:ans=3-1=2 4回目:ans=2-1=1 5回目:ans==1なので音を鳴らして、カウントを増やす。
以上により、音をならすのには0.5秒かかります。120のテンポを考えると、0.5秒に1回音が鳴れば正しいので、この考えでいいのではないかと思うのですが、60秒間実装すると、カウント数は110になってしまい、少し遅いです。 これはアルゴリズムに問題があるのでしょうか?それともtimerにはズレが生じてしまうのでしょうか? よろしくお願いします。
private void bstart_Click(object sender, EventArgs e) { secTime = 0; count = 0;
x = (int)TENPO.Value; // テンポを取得 ans =(double) 60 / x ; //ディレイタイムの計算(sec) ans = System.Math.Round(ans, 2); //ansを少数第2位までにする
ANS.Text = ans.ToString();
timer1.Start(); timer2.Start();
bstart.Enabled = false; //ボタンの2度押しを防ぐ ans = ans*1000; //単位をmsecに直す
ans = (double)ans / 100;
} //0.1秒毎に呼び出されるイベント private void timer2_Tick(object sender, EventArgs e) { txt2 = (double)ans / 10; //値を少数になおす ex.500→0.5 txt2 = System.Math.Round(txt2, 2); nokori.Text = txt2.ToString();//msecをsecにして表示 CO.Text = count.ToString();
if (ans == 1) { count = count + 1; CO.Text = count.ToString(); PlaySound("se_saa01.wav"); //ansの初期化 ans = (double)60 / x; //ディレイタイムの計算(sec) ans = System.Math.Round(ans, 2); //ansを少数第2位までにする ans = ans * 1000; //単位をmsecに直す ans = (double)ans / 100;
} else { ans = ans - 1; label6.Text = ans.ToString(); } }
|
|