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

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

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

到目前为止,我已经编写了输入代码和模型,但在读取输入 MIDI 时遇到了一些问题。

这是我的 "reading" 部分代码:

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

我在哪里使用这个 library which is the Python3 compatible version of this other one(仅 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 节拍?每个 "type" 个音符是固定值吗?

例如,如果我有一个四分音符,我将始终有(例如)100 个节拍,独立于原始 MIDI 文件的 BPM?

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

因为我有很多不同 BPM 的 MIDI 文件,我显然需要一个统一的深度网络输入表示。

我读了 documentation but i'm a bit confused. Especially here,上面写着:

This message is important if the MIDI time division is specified in "pulses per quarter note", as such MIDI time division defines the number of ticks per quarter note, but does not itself define the length of the quarter note. The length of the quarter note is then defined with the set tempo meta message described here.

每个四分音符的节拍数或 "resolution" 是 MIDI 中每个文件的变量,并在文件的 header 中给出。看起来您使用的库正在以 resolution=96.

的形式提供给您

节奏 (BPM) 本身嵌入在 MIDI 流中(连同音符),因为它可以在音轨的任何一点发生变化。默认情况下假定为 120 BPM。

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