【问题标题】:Where to find resources for writing a decent metronome app?在哪里可以找到编写体面的节拍器应用程序的资源?
【发布时间】:2021-07-12 10:26:39
【问题描述】:

最近我一直在尝试弄清楚如何编写节拍器应用程序,但在操作系统时间控制(例如调用函数)或显着不准确的起始检测算法(我使用过 librosa)和这似乎是一个相当复杂的话题。然而由于某种原因,我对专业节拍器应用程序源代码/教程/书籍等主题的研究没有成功......网络似乎充满了不符合现代节拍器应用程序的业余示例和解决方案(例如 Frozenapes iOS Tempo 应用程序)标准。例如一个节拍器,它在调用某个速度时使用预先录制的 .wav 样本(因此应用程序中存储了 30 到 300 bpm 之间的所有速度)。如果用户想在节拍器工作时改变节奏,这种解决方案似乎有点死胡同。 总而言之 - 我正在寻找任何包含代码/文本/whatev 的专业资源,这不是面向数学毕业生的 2000 页信号处理书籍,并且可以帮助我设计具有一些录音功能的体面节拍器。

【问题讨论】:

  • @PhilFreihofner 的答案是正确的方法。您想直接写入音频线程而不是触发事件。我能感觉到您的沮丧,但遗憾的是,SO 不是此类问题的平台。我可以推荐的是在 GitHub github.com/… 上搜索类似的项目,这应该会产生足够的示例。

标签: audio signal-processing librosa metronome


【解决方案1】:

也许我使用 Java 编写节拍器的经验会有所帮助。关键不依赖于系统时钟,而是依赖于计算 PCM 帧的确切数量并将点击音频 PCM 放置在该点。在 44100 fps 的采样率下,这基本上可以达到 1/44100 秒的精度。

我无法建议您如何流式传输 PCM 以及在帧通过时对其进行计数。 Python 是否允许您访问各个帧?

【讨论】:

  • Python Librosa 包带有允许您操纵采样率和帧的功能,但是您将如何实现这种想法?如果您使用任何类型的循环来调用点击样本,那么您需要控制循环完成其生命周期所花费的时间,但它并不总是完全相同的确切时间。
  • Java 有一个类javax.sound.sampled.SourceDataLine,它允许流式传输数据。如果 Python 允许您将字节流式传输到声音系统,则解决方案是连续流式传输,计算帧数,并使用零作为源(无声时)或单击(具有固定数量的字节,也要计算在内)。播放声音的软件非常准确,比系统操作系统时钟消息更准确。底层播放代码(在 Java 中)采用“阻塞队列”来保持时间紧凑。
猜你喜欢
  • 2014-02-05
  • 2010-09-20
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多