如何使用Music21去除写入MIDI文件时末尾的空白数据
原因
music21默认导出MIDI时会自动将总时长对齐到整数个完整小节,默认使用4/4拍的配置下,仅包含2拍半音符的流会被自动补2拍空白休止符凑满1个完整小节,最终出现尾部空白。
解决方案
你可以选择以下任意一种方法去掉尾部空白:
- 方法1:将流修剪到实际内容的最大时长
修改后的代码如下:
import music21 stream = music21.stream.Stream() n = music21.note.Note(60) n.duration.type = 'half' stream.insert(0, n) # 新增以下两行,裁剪流到实际内容的结束位置 max_offset = stream.highestTime stream = stream.trimToOffset(max_offset) stream.write('midi', fp='out.midi')
- 方法2:创建小节时禁用自动补全休止符
如果你需要保留小节结构,可以在生成小节时关闭补全逻辑:
import music21 stream = music21.stream.Stream() n = music21.note.Note(60) n.duration.type = 'half' stream.insert(0, n) # 新增以下行,生成小节时不补全空白休止符 stream.makeMeasures(fillWithRests=False, inPlace=True) stream.write('midi', fp='out.midi')
两种方法生成的MIDI文件总时长都会匹配实际音符的长度,不会出现尾部空白。
内容的提问来源于stack exchange,提问作者duhaime
相关产品推荐
相关产品推荐

