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

2024-04-26 05:39:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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

这里我使用的是这个library,它是另一个one(它只与Python2兼容)的Python3兼容版本

我得到的结果如下:

 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滴答声是如何管理的?对于每种“类型”的票据,它是否为固定值

例如,如果我有一个四分之一音符,我总是(例如)在原始MIDI文件的BPM上独立地有100个刻度

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

由于我在不同的BPM中有许多midi文件,我显然需要为我的深层网络提供输入的统一表示

我读了documentation但是我有点困惑。特别是当它说:

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.


Tags: 文件thedatatimeischannelfileiomidi
1条回答
网友
1楼 · 发布于 2024-04-26 05:39:20

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

节奏(BPM)本身嵌入到MIDI流中(与音符一起),因为它可以在曲目的任何点上改变。默认情况下,假定为120 BPM

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

相关问题 更多 >