.NET中的精确计时

时间:2009-04-27 22:10:13

标签: c# .net midi timing naudio

我刚看到this question,其中一个答案表明System.Diagnostics.Stopwatch只应用于诊断效果,而不能用于生产代码。

在这种情况下,在.NET中获得精确计时的最佳方法是什么?我目前正处于使用MIDI的MIDI输出功能构建一个非常简单的NAudio音序器的早期阶段。我希望能够以尽可能小的抖动将MIDI消息发送到(例如)1 / 10s。这是可行的,还是像上下文切换这样的事情会破坏我的一天?

我目前在控制台应用程序中有一些代码,它连续调用Stopwatch并在150bpm生成1/16笔记流时计算抖动。在这种情况下抖动非常低。但是,我将把它移到另一个线程,所以我不知道是否仍然如此。

4 个答案:

答案 0 :(得分:6)

如果您不介意P / Invoke,可以使用QueryPerformanceCounter:http://www.eggheadcafe.com/articles/20021111.asp

答案 1 :(得分:1)

您还可以使用本机流式MIDI API。我不认为它在NAudio,但你可以看看C#Midi工具包,看看是否支持它。否则你有两个如何进行原生MIDI API P / Invoke的例子,可以自己滚动...

答案 2 :(得分:0)

Windows multimedia timer表示它允许"应用程序以最高分辨率(或准确度)为硬件平台安排定时器事件。"

它用作示例的应用程序是MIDI音序器。

答案 3 :(得分:0)

我是DryWetMIDI的作者。该库具有回放功能,可借助WinMM高精度计时器来工作。计时器被包装到MidiClock类中,因此您可以使用它来驱动MIDI操作:

Cognito

var midiClock = new MidiClock(true, new HighPrecisionTickGenerator(), TimeSpan.FromMilliseconds(1)); midiClock.Ticked += OnTick; 将每1毫秒被调用一次。