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

Music21 plays all notes at once when saving to midi file

我在 music21 工具包中尝试 assemble 顺序和平行和弦时注意到并发出了问题。

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 中的错误吗?还是我搞砸了什么?

您创建的每个度量都位于偏移量 0 处,因此当您将它们传递给 Part() 时,它们都会被插入到偏移量 0 处,即同时插入。碰巧 xml 作者试图修复符号(调用 makeNotation 等),但 midi 作者更直白。

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