异步播放单独的MIDI消息的最佳实践?

问题描述 投票:0回答:1

我已经将MIDI文件解析为一组音符(键,力度,时间,还有MIDI文件的速度及其更改事件)。我需要以GUI(LCL)应用程序的异步方式播放它们(我无法使用MCISendString,因为我需要处理这些消息)。问题是,在MIDI中通常有成千上万个音符。您认为什么是播放它们的最佳方法?

我有一些想法,但是它们很慢而且不切实际:

  • [使用一个在指定时间量内等待(BeginThreadSleep)并播放音符(线程有限制,并且确实很不稳定)的函数一次调用一堆Delay
  • 排序时间戳,然后通过单个线程运行它们,这将使currentNoteTime-previousNoteTime休眠/延迟并播放音符。可能会变慢,尤其是在尝试对所有内容进行排序时。
  • 将另一个应用程序编写为后台进程并完成任务(不专业的结合)。
  • 我正在使用Lazarus(对象Pascal),但是如果需要,我也可以利用Delphi代码。谢谢您的时间。

我已经将MIDI文件解析为一组音符(键,力度,时间,还有MIDI文件的速度及其更改事件)。我需要将它们回放为GUI(LCL)应用的异步方式(我不能使用...

delphi pascal midi lazarus
1个回答
0
投票

所有线程方法(睡眠,延迟等)在Windows上都会失败,因为您获得的精度不会超过16毫秒(在最佳情况下),这将导致您的数据无法正确播放,并且延迟较大。这是已知问题,您可以在网上搜索。

© www.soinside.com 2019 - 2024. All rights reserved.