首页 > 解决方案 > MIDI 刻度是固定值还是取决于文件的 BPM?

问题描述

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

到目前为止,我编写了输入代码和模型,但在读取输入 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 时间划分定义了每个四分音符的节拍数,但它本身并不定义四分音符的长度。然后使用此处描述的设置速度元消息定义四分音符的长度。

标签: pythonneural-networkmidi

解决方案


每四分音符的刻度或“分辨率”是 MIDI 中每个文件的变量,并在文件的标题中给出。看起来您使用的库将其作为resolution=96.

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

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


推荐阅读