保存到 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 显示 Mid 文件中的 midi 音高数字