如何矢量化 midi 输入?

Posted

技术标签:

【中文标题】如何矢量化 midi 输入?【英文标题】:How do I vectorize a midi input? 【发布时间】:2018-12-22 14:56:04 【问题描述】:

我想创建一个将接受音乐训练的 LSTM 模型(使用 Keras),但我在对 midi 输入进行矢量化时遇到了困难。 我尝试在 python 中使用 'Mido' 库,从中可以提取以下格式的数据:

note_on channel=0 note=72 velocity=50 time=0
note_on channel=0 note=38 velocity=50 time=0.1171875
note_off channel=0 note=80 velocity=0 time=0.1171875
note_off channel=0 note=41 velocity=0 time=0

我正在将其转换为数组

[note_number, velocity, time]

其中velocity表示速度以及是否为note_on\note_off。 现在的问题是我如何在这里喂时间,我的意思是时间以刻度为单位(我猜)。 如何将这些滴答声转换为秒数,并且我会将这个数组提供给顺序模型,我将如何再次将时间转换为输出中的滴答声??

【问题讨论】:

如果它测量刻度,为什么它是浮动的?那时它将是离散的。我认为时间以秒或毫秒为单位。 @LtWorf 那么在第一种情况下是 0,在第二种和第三种情况下是 0.117,在第四种情况下又是 0(我上面发布的示例是按顺​​序排列的)。请解释一下我不知道 Midi 文件 【参考方案1】:

MIDI 文件中的时间是 delta 次,即在前一个事件之后执行此事件之前等待的时间量。在您的示例中,两个 Note Off 事件同时发生。通过保持增量时间值的运行总和,您可以轻松地将增量时间转换为绝对时间。

您显示的时间值不能是刻度。刻度必须是整数值。没有看到你的代码,我不知道这些值是什么,但我猜 Mido 已经转换为秒。

节拍通常基于四分音符,而不是时间。四分音符的时间长度(以及节拍)取决于当前速度,该速度由 Set Tempo 元事件设置。

我认为花些时间更好地理解 MIDI 文件会让您受益匪浅。 Mido documentation on MIDI files 是一个很好的起点。有很多关于 MIDI 文件的解释(例如this one。)

希望这会让您走上正轨。如果您仍然遇到问题,请发布一个新问题,并使用 Minimal, Complete, and Verifiable example 说明您的问题的代码。

【讨论】:

以上是关于如何矢量化 midi 输入?的主要内容,如果未能解决你的问题,请参考以下文章

向量化文本作为 RNN 的输入

我如何矢量化矩阵/输入,以便scipy.optimize.minimize可以使用它?

如何矢量化 3x3 2D 卷积?

如何比较矢量化和非矢量化代码

语音处理中的向量量化解释

HEVC学习与研究44HEVC量化系数的解析——反量化过程