質問

があるので、火災イベントのC#ソースコードの解像度で数マイクロ秒単位?

構築を行っていMIDIシーケンサーで必要とされるイベント焼毎MIDIティックには、その後の再注登録です。

120ビート毎分の解像度で120ppqn(パルス/拍/四半期注)このイベントは火毎4.16666ミリ秒です。現代シーケンサーが高いの決議など768ppqnを求められるこのイベントを設定します毎651マイクロ秒単位.

最良の解決のための短時間のイベントまたは1ミリ秒どのように思える。

この問題は既に解決C#MIDIシーケンサーまたはMIDIファイルのプレイヤー。そんなに問題を通じて、右の角度になります。

~ご協力ありがとうございました.

役に立ちましたか?

解決

ほとんどのMIDIシーケンサ/ MIDIプレイヤーはいずれか(コンピュータのスピーカーから再生する)波形に時間の大きなブロックを変換したり(MIDIポートに接続された外部機器用)MIDI命令の大きなブロックがかかります。いずれにしても、データのブロックは、サウンドカードにコピーして、サウンドカードは、正確なタイミングの世話をされます。

あなたはマルチメディアコントロールのAPIを見てみたいことがあります。

でオーバーこの記事を参照してください。マイクロソフトディスカッションフォーラム

他のヒント

私はあなたがタイマから正確に正しい解像度を取得する可能性は低いと思います。より良いアプローチは、1msの正確なタイマーを使用するようになり、それが発火するとき、MIDIイベントが保留されている確認するには、それらを解雇します。

ですから、MIDIイベントは、あなたが最初のものをのぞく、ソートされたキューに移動して、その時にできるだけ近づけて火にタイマーを設定します。タイマー火災は、あなたが将来のイベントに遭遇するまで、経過したキューからすべてのイベントを消費する場合。このイベントへの計算時間。再スケジュールタイマーます。

もちろん、あなたがサウンドカードに出力している場合は、アプローチが根本的に異なっている、とあなたがすべてのあなたのタイミングのためのカウントのサンプルである必要があります。

正確なイベントを持ってすることはできませんが、.NETでマイクロ秒の間隔で発射ます。

はWindows自体は、ユーザーモードのソフトウェアでは、特定のマイクロ秒〜100%の精度で何かを行うことにより、リアルタイムOSではありませんので、実際には、ほとんど不可能です。

:これはMSDNマガジンの記事を参照してくださいので、困難である理由の詳細については、

Windowsのの連続更新、高解像度タイムプロバイダの実装。それは、Windows NTについて語っているが、これはまだ一般的にそれ以降のバージョンのWindowsに適用されます。

この記事の結論はそれをうまくまとめます:

  あなたは今、あなたが取得できると思われる場合は、

  ほとんどとシステム時間   ここで任意の精度、ちょうどA   わずか警告:忘れてはいけません   マルチタスクのプリエンプティブ   Windows NTのようなシステム。最高で   ケース、あなたが買ってあげるのタイムスタンプがオフになっています   それは読み取りにかかる時間だけによって   パフォーマンスカウンタと、この変換   絶対時間に読みました。の中に   最悪の場合、経過時間ができました   簡単に数十程度であります   ミリ秒。

     

このかもしれませんが   あなたはこのすべてを経て示しています   何のために、あなたはので安心   しませんでした。でもへの呼び出しを実行します   Win32 APIのGetSystemTimeAsFileTime(または   Unix上ではgettimeofday)の対象となります   あなたがいるので、同じ条件、   実際にはそれよりも何より悪いことはありません。に   例大半は、あなたが持っています   良い結果。ただ、実行しないでください   リアルタイムを必要とするもの   時間に基づいて予測可能性   Windows NTでスタンプます。

の代わりにタイマー

使用 ストップウォッチ

例では、 のための10倍の1秒

    static void Main(string[] args)
    {
        Stopwatch masterSW;
        Stopwatch sw=null;
        int count;

        sw = Stopwatch.StartNew();
        sw.Reset();

        for (int i = 0; i < 10; i++)
        {
            count = 0;
            masterSW = Stopwatch.StartNew();
            while (count!=1536) //1537*651 microsecond is about a second (1.0005870 second)
            {
                if (!sw.IsRunning)
                    sw.Start();

                if (sw.Elapsed.Ticks >= 6510)
                {
                    count++;
                    sw.Reset();
                }
            }

            Debug.WriteLine("Ticks: " + masterSW.Elapsed.Ticks.ToString());
        }
    }

出力は、このようになります:

採10005392(1.0005392秒)
採10004792
採10004376
採10005408
採10004398
採10004426
採10004268
採10004427
採10005161
採10004306

るように見られるようなのでok

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top