7

我阅读了很多关于 MIDI 解析的内容,并研究了一些代码,例如 Tone.js 和 heartbeat。但我不明白为什么每四分音符的脉冲数(PPQN)值不同,以及它对演奏音符有什么影响。当我有 960 个 PPQN 时,这意味着 1 个四分音符有 960 个刻度,1 个八分音符有 480 个刻度,等等。如果我理解正确,增量时间只是一个相对值。

我不明白的是,当我在 JavScript 中演奏音符时,PPQN 应该是什么,当我设置 PPQN 时为什么它应该有这个值?例如,我使用 WebAudio API 播放音符:

function nextNote() {
  var quarterBeat = 60.0/tempo;
  nextNoteDuration = nextNoteDuration + (quarterBeat/32);
  currentNote++;
}

这样我可以演奏不同的音符时长。现在当我读取 MIDI 文件时,我应该只比较增量时间并将其转换为我的音序器当前播放吗?例如,当我读取具有以下值的 MIDI 文件时:

Tempo = 120
PQN = 960
4 Quarter Notes

我读取了 MIDI 文件,将音符保存在一个数组中(假设增量时间是每个音符的 1/4)

duration = [quarterNote, quarterNote, quarterNote, quarterNote]

并弹奏音符:

while (nextNoteDuration < audioContext.currentTime) {
  if (duration[i] %32 == 0) playNote(currentNote, nextNoteDuration);
  nextNote();
  i++;
}

我应该只在导出 MIDI 文件时使用 PPQN 吗?如果是这样,我应该设置什么 PPQN?我希望有人可以更详细地向我解释这一点。

4

2 回答 2

1

在标准的 MIDI 文件中,文件头中有关于“每四分音符的记号”的信息,也就是“每四分之一的声部”(或“PPQ”)。出于本次讨论的目的,我们将“节拍”和“四分音符”视为同义词,因此您可以将“节拍”视为节拍的一小部分。PPQ 在文件开头出现的标头块的最后一个信息字(最后两个字节)中说明。PPQ 可以是一个较小的数字,例如 24 或 96,这对于简单的音乐来说通常是足够的分辨率,或者它可以是一个更大的数字,例如 480 以获得更高的分辨率,或者如果更喜欢参考时间,甚至可以是 500 或 1000 之类的数字以毫秒为单位。

PPQ 在绝对时间方面的含义取决于指定的节奏。默认情况下,拍号为 4/4,速度为每分钟 120 拍。然而,这可以通过指定不同速度的“元事件”来改变。(您可以在文件格式描述文档中阅读有关设置速度元事件消息的信息。)速度表示为一个 24 位数字,表示每四分音符的微秒。这与我们通常表达节奏的方式有点颠倒,但它有一些优势。因此,例如,100 bpm 的速度将是每四分音符 600000 微秒,因此用于表达它的 MIDI 元事件将是 FF 51 03 09 27 C0(最后三个字节是 600000 的十六进制)。元事件之前会有一个增量时间,就像文件中的任何其他 MIDI 消息一样,

增量时间始终表示为可变长度的数量,其格式在文档中进行了说明。例如,如果 PPQ 是 480(大多数 MIDI 音序软件中的标准),一个带点四分音符(720 个滴答声)的增量时间将由两个字节 85 50(十六进制)表示。

因此,考虑到所有这些,以刻度表示的增量时间与我们以人类术语看待它们的音符值之间存在对应关系。该关系取决于在标头块中指定的 PPQ。例如,如果 PPQ 为 96(十六进制 60),则 MIDI 通道 10 上的音符中间 C 以 127 的力度持续一个带点四分音符(1.5 拍)将被表示为 00 99 3C 7F // delta time 0 ticks , 153 60 127 90 99 3C 00 // delta time 144 tick, 153 60 0

于 2020-02-19T21:55:01.747 回答
1

PPQ 是关于分辨率的。更具体地说是关于时间分辨率。

当我在 JavScript 中演奏音符时,PPQN 应该(是什么?),当我设置 PPQN 为什么它应该有这个值?

当您的程序播放音符时,它可以使用您想要或需要的任何时间单位,例如毫秒、纳秒、电影帧、滴答声。绝对挂钟或相对时间。这取决于您的音序器功能和软件功能。仅当将 MIDI 序列存储为 MIDI 文件时,才需要选择一个 PPQ 值。当然,您需要能够在读取/存储 MIDI 文件时转换时间单位。

现在当我读取 MIDI 文件时,我应该只比较增量时间并将其转换为我的音序器当前播放吗?

当然,如果您的音乐事件在内部使用不同的时间表示,那么您需要能够将 MIDI 文件中的增量时间转换为您的内部表示。

您只询问 PPQ,但该值仅在 MIDI 文件头中找到一次。相反,速度事件可能会在文件中多次发生,并且它会影响下一个增量时间到挂钟时间的转换,直到下一个速度事件。如果您的音序器/播放器允许用户更改/添加速度事件,最好使用相对单位而不是挂钟单位来表示内部时间(或两者兼而有之)。

我应该只在导出 MIDI 文件时使用 PPQN 吗?如果是这样,我应该设置什么 PPQN?

是的,您需要在导出 MIDI 文件时为 PPQ 选择合适的值。如果您的内部时间单位是相对的(就像大多数定序器一样),则将您的内部单位分辨率用于 PPQ。如果您从挂钟单位转换为增量时间,那么您需要选择一个分辨率,您的翻译会丢失更少的细节(通过量化)。从这个意义上说,更高的值更好。Rosegarden始终以 960 PPQ 存储 MIDI 文件。相比之下,斯坦伯格的Cubase使用 480。我记得很久以前使用 Cakewalk 只有 120 PPQ,但后来的版本允许将此值作为配置设置进行更改。一般来说,您不仅需要适应所有短于四分之一的音乐数字,包括三连音等细分,还需要考虑基于精细时间调整的摇摆等效果。

于 2020-02-18T17:24:23.033 回答