首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哪种计时器最适合MIDI计时?

哪种计时器最适合MIDI计时?
EN

Stack Overflow用户
提问于 2021-04-10 04:17:36
回答 1查看 197关注 0票数 2

我正在用C#和.NET 4.x编写一个简单的MIDI应用程序,供我自己使用。

我假设商业DAWs (在Windows平台上)使用Windows多媒体定时器来计时MIDI数据的回放时间。但我无法证实这一点,因为商业资料是封闭来源的。

我希望有人在这方面有知识,并能告诉我是否我的假设是正确的。或者,这些DAWs是否使用了我不知道的计时器?我想确保没有任何更合适的东西是我忽略的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-16 00:56:38

虽然我没有专门为商业DAW项目编写代码的特权,但我确实有为事件的准确时机(包括MIDI处理/路由)进行编码的经验。

你的假设是正确的。编码良好的MIDI排序器使用Windows多媒体定时器来调度MIDI消息的发送到MIDI设备。

微软的多媒体计时器参考实际上是提及 MIDI测序,举个例子:

这些计时器服务对于需要高分辨率定时的应用程序非常有用。例如,MIDI排序器需要一个高分辨率的定时器,因为它必须将MIDI事件的速度保持在1毫秒的分辨率内。

如何使用定时器是另一个主题,我将不谈这个问题。但我想指出几点:

  • 所有现代硬件都支持1毫秒的定时器分辨率,这基本上是给定的,但是在调用timeBeginPeriod之前,您仍然应该调用timeBeginPeriod来确认。
  • 使用多媒体计时器,以1毫秒的分辨率,将您的MIDI信息量化为1毫秒网格+/-一些方差/抖动。在绝大多数情况下,这不是一个问题,因为这仍然是一个足够好的解决方案,以提供合理的微妙的时间,就音乐的时机而言,无论如何。如果你绝对需要亚毫秒的时间,你必须按照@iinspectable建议的那样做--使用计时器“接近”,然后旋转,精确地计时发送MIDI消息。然而,这种方法是要付出代价的。我不知道你对这个应用的意图是什么,但如果你有几个同时播放的MIDI曲目,每一个都有连续控制器和俯仰弯道,你会发现你的应用一直在旋转,你会把一个CPU核心固定在100%,这是非常糟糕的。
  • 请查看多媒体类调度服务,以便优先访问MIDI回放线程的CPU资源。
  • 不要因为@iinspectable的评论而气馁。您绝对可以使用C#/.NET进行高性能的MIDI排序,您唯一关心的是垃圾收集器无法预测地暂停应用程序。您可以始终以最小化GC的方式编写代码(例如,使用structs而不是类,在播放期间不要创建/销毁任何东西)。还可以考虑使用GC.TryStartNoGCRegion,例如,在播放期间防止GC暂停。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67030753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档