[英]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.