python - 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 时间划分定义了每个四分音符的节拍数,但它本身并不定义四分音符的长度。然后使用此处描述的设置速度元消息定义四分音符的长度。
解决方案
每四分音符的刻度或“分辨率”是 MIDI 中每个文件的变量,并在文件的标题中给出。看起来您使用的库将其作为resolution=96
.
速度 (BPM) 本身嵌入在 MIDI 流中(连同音符),因为它可以在轨道中的任何点更改。默认情况下,它假定为 120 BPM。
您可以在 MIDI 文件规范中找到这些信息和更多信息,例如:http: //www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html
推荐阅读
- mysql - 在配置文件 MySQL 8 中设置 LOCAL_INFILE
- swift - UIImage 未从 AWS S3 url 加载
- python - 如何使用 tksheet 将表格保存为 csv 格式的文件?
- javascript - ASP.NET 核心图像到 Canvas
- c# - 大点云中大点循环的优化
- android - 找不到兼容的并排 NDK 版本 React Native
- php - 无法在 Ubuntu 18.04 上安装 lsphp56
- c - c中的管道,2个叉子与main交谈
- node.js - request-promise 循环,如何包含随响应发送的请求数据?
- angular - 如何设置子组件属性以在父构造函数中使用?