保存到 MIDI 文件时,Music21 一次播放所有音符

Posted

技术标签:

【中文标题】保存到 MIDI 文件时,Music21 一次播放所有音符【英文标题】:Music21 plays all notes at once when saving to midi file 【发布时间】:2020-11-18 15:30:33 【问题描述】:

我在尝试在 music21 工具包中组合顺序和并行和弦时注意到并出现问题。

ch = stream.Part([
  stream.Measure([note.Rest(duration=duration.Duration(type='eighth'))]),
  stream.Measure([note.Note('C4'), note.Note('F4')]),
  stream.Measure([note.Rest(duration=duration.Duration(type='half'))]),
  stream.Measure([chord.Chord([note.Note('C4'), note.Note('F4')], duration=duration.Duration(type='half'))])
])

ch.write('musicxml.png) 时,上面的代码给了我正确的分数

但是当保存为 MIDI 时:ch.write('midi') 一次播放所有音符。 (我不能附加 MIDI,所以 hexdump)

00000000  4d 54 68 64 00 00 00 06  00 01 00 01 04 00 4d 54  |MThd..........MT|
00000010  72 6b 00 00 00 3f 00 ff  03 00 00 e0 00 40 00 90  |rk...?.......@..|
00000020  45 5a 00 90 42 5a 00 90  46 5a 00 90 45 5a 00 90  |EZ..BZ..FZ..EZ..|
00000030  42 5a 00 90 46 5a 88 00  80 45 00 00 80 42 00 00  |BZ..FZ...E...B..|
00000040  80 46 00 88 00 80 45 00  00 80 42 00 00 80 46 00  |.F....E...B...F.|
00000050  88 00 ff 2f 00                                    |.../.|
00000055

这是music21 中的错误吗?还是我搞砸了什么?

【问题讨论】:

【参考方案1】:

您创建的每个度量都位于偏移量 0 处,因此当您将它们传递给 Part() 时,它们都会在偏移量 0 处插入,这意味着同时。碰巧 xml 编写器尝试修复符号(调用 makeNotation 等),但 midi 编写器更文字。

尝试将每个 Measure 附加到 stream.Part() 而不是将它们传递给构造函数。或者在将其写入 midi 之前尝试在您的 Part 上调用 .makeNotation()

【讨论】:

以上是关于保存到 MIDI 文件时,Music21 一次播放所有音符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 中的长笛乐器从音符制作 MIDI 文件(music21 库)

Music21 Python 库将只输出钢琴声音

使用 music21 显示 Mid 文件中的 midi 音高数字

music21:写入midi文件后和弦转音符?

music21:读取 MIDI 文件的 BPM 和乐器信息并将其写回文件

music21:从平面乐谱中获取 midi 声音的声音/程序/乐器?