【问题标题】:How to parse a music into a array of frequencies and durations of its notes如何将音乐解析为其音符的频率和持续时间数组
【发布时间】:2011-06-01 18:56:03
【问题描述】:

您好,

我正在从事一个低级编程项目,我想用计算机扬声器播放音乐。

我已经能够使用扬声器(使用timer2),并且歌曲以下列方式表示:

note_t *music;

其中note_t 代表一个音符,它的合成方式为:

typedef struct {
  int freq; /* note frequency */
  int dur;  /* note duration in miliseconds */
} note_t;

现在,从音乐文件中获取音符的频率和持续时间的最佳方法是什么?

提前致谢!

编辑

为了澄清一些疑问,我想知道的是获得必要信息以创建具有上述结构的歌曲的最佳格式。

【问题讨论】:

  • 这取决于音乐文件的格式。
  • 这是非常重要的。
  • 如前所述,这是无法回答的。
  • 我知道这取决于音乐文件的格式。我想知道提取所需信息的最佳格式是什么。
  • 如果您将自己限制为 MIDI (.MID) 文件,那么它应该很容易。

标签: c low-level speaker background-music


【解决方案1】:

根据您的具体目的,您可以使用其中一种铃声格式或发明自己的铃声格式。

一个简单的铃声格式示例是RTTTL

【讨论】:

    【解决方案2】:

    anatolyg 的回答很好。我只是想展示这样的任务有多复杂:看看 MIDI 以获得灵感。

    http://en.wikipedia.org/wiki/Musical_Instrument_Digital_Interface

    MIDI 文件可以用作音乐软件的“虚拟乐谱”,存储音符和许多描述演奏细微差别的附加信息(例如速度、弯音、调制等)。它专为存储包含多种乐器和复调的整段音乐而设计。

    【讨论】:

    • 我使用的是 MIDI 到 txt 转换器 (en.nemidi.com/conversor/mid2txt.html) - 它创建了一个包含大量信息的 txt,包括 MIDI 音符及其持续时间。然后我将音符转换为相应的频率。问题是生成的歌曲比原始 MIDI 快很多。
    • 增加每个频率的持续时间。比如说,将每个持续时间乘以 0.7 以使每个持续时间变慢。然而,这是一个反复试验。但是,这是您至少可以做的。或者你可以通过 sleep() 或类似的函数来减慢你的运行时间。
    • @Neigyl:我会先准备一个已知音符长度的 MIDI 来校准我的软件 - 没有反复试验。
    • 是的。而已。试错只是粗略的不切实际的做法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2016-06-08
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多