繁体   English   中英

MIDI 刻度是固定值还是取决于文件的 BPM?

[英]Is MIDI tick a fixed value or depends on the BPM of the file?

我正在使用 RNN 编写深度学习自动作曲家。 显然我需要训练它,我决定使用 MIDI 文件格式作为输入。

到目前为止,我编写了我的输入代码和我的 model,但是我在读取输入 MIDI 时遇到了一些问题。

这是我的“阅读”部分代码:

from mydy import Events, FileIO, Containers
test=FileIO.read_midifile('file2.mid') #returns a Pattern with the MIDI file information (resolution ecc...), based on documentation https://github.com/jameswenzel/mydy/blob/master/src/FileIO.py
print(test) #I have to figure out how time is managed

我在哪里使用这个,它是另一个库的 Python3 兼容版本(仅与 Python2 兼容)

我得到的结果如下:

 mydy.Pattern(format=0, resolution=96, tracks=\
[mydy.Track(relative: True\
  [mydy.TrackNameEvent(tick=0, text='', data=[]),
   mydy.TimeSignatureEvent(tick=0, data=[4, 2, 36, 8]),
   mydy.TimeSignatureEvent(tick=0, data=[4, 2, 36, 8]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[60, 100]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[64, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[60, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[62, 100]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[67, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[62, 64]),
   mydy.NoteOffEvent(tick=0, channel=0, data=[64, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[64, 100]),
   mydy.NoteOffEvent(tick=0, channel=0, data=[67, 64]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[64, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[67, 100]),
   mydy.NoteOnEvent(tick=384, channel=0, data=[66, 100]),
   mydy.NoteOffEvent(tick=0, channel=0, data=[67, 64]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[66, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[67, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[67, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[69, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[69, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[71, 100]),
   mydy.NoteOnEvent(tick=384, channel=0, data=[60, 100]),
   mydy.NoteOffEvent(tick=0, channel=0, data=[71, 64]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[60, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[62, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[62, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[64, 100]),
   mydy.NoteOffEvent(tick=375, channel=0, data=[64, 64]),
   mydy.NoteOnEvent(tick=9, channel=0, data=[67, 100]),
   mydy.NoteOnEvent(tick=384, channel=0, data=[66, 100]),
   mydy.NoteOffEvent(tick=0, channel=0, data=[67, 64]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[66, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[67, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[67, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[69, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[69, 64]),
   mydy.NoteOnEvent(tick=0, channel=0, data=[71, 100]),
   mydy.NoteOffEvent(tick=384, channel=0, data=[71, 64]),
   mydy.EndOfTrackEvent(tick=0, data=[])])])

这对我来说很好。

问题是:MIDI 滴答声是如何管理的? 对于每种“类型”的音符,它是固定值吗?

例如,如果我有一个四分音符,我将总是有(例如)100 个滴答声,独立于原始 MIDI 文件的 BPM?

例如,如果我在 DAW 中打开一个以 100 BPM 编写的 MIDI 文件,然后我打开一个以 150 BPM 编写的文件,四分音符将始终对应于 100 节拍? (在这两种情况下)

由于我有许多不同 BPM 的 midi 文件,我显然需要对我的深度网络的输入进行统一表示。

我阅读了文档,但我有点困惑。 尤其是当它

如果在“每四分音符的脉冲数”中指定了 MIDI 时间划分,则此消息很重要,因为这样的 MIDI 时间划分定义了每个四分音符的节拍数,但它本身并不定义四分音符的长度。 然后使用此处描述的设置速度元消息定义四分音符的长度。

每四分音符的刻度或“分辨率”是 MIDI 中每个文件的变量,并在文件的 header 中给出。 看起来您使用的库正在以resolution=96的形式提供给您。

速度 (BPM) 本身嵌入在 MIDI stream(连同音符)中,因为它可以在轨道中的任何点更改。 默认情况下,假定为 120 BPM。

您可以在 MIDI 文件规范中找到此信息和更多信息,例如: http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM