PrettyMIDI 快速上手教程:读取、改写与合成 .mid 文件

📅 2026/8/24 17:53:09
PrettyMIDI 快速上手教程:读取、改写与合成 .mid 文件
PrettyMIDI 快速上手教程读取、改写与合成 .mid 文件【免费下载链接】pretty-midiUtility functions for handling MIDI data in a nice/intuitive way.项目地址: https://gitcode.com/gh_mirrors/pr/pretty-midiPrettyMIDI 是一个 Python 库能把.mid文件解析成以秒为单位计时的 Python 对象也可以反向写出 MIDI 文件、渲染成音频波形。它解决的是从乐谱数据里提取信息、再修改保存这类问题适合做音乐数据处理、音频算法或刚接触 MIDI 的开发者。本文走一遍安装、读取音符、音高换算和音频合成这几个常用用法。三步跑起来一条命令安装加一段可运行代码先装包pip install pretty-midi仓库里自带了示例文件example.mid本地没有它的话执行git clone https://gitcode.com/gh_mirrors/pr/pretty-midi然后直接把下面这段代码复制运行它会打印速度估计、画出一张钢琴卷帘、再渲染出音频import pretty_midi import scipy.io.wavfile pm pretty_midi.PrettyMIDI(example.mid) print(tempo ~, pm.estimate_tempo()) # 经验估计的整体速度 roll pm.get_piano_roll(fs10) # 钢琴卷帘矩阵可直接绘图 audio pm.fluidsynth() # 用包内 TimGM6mb.sf2 渲染 scipy.io.wavfile.write(out.wav, 44100, audio)能听到声音说明环境就绪。从 .mid 文件里把所有音符读出来PrettyMIDI对象按轨道组织instruments是乐器列表每个乐器的notes是音符列表。Note对象有四个字段velocity力度、pitch音高编号、start/end起止秒数。pm pretty_midi.PrettyMIDI(example.mid) for inst in pm.instruments: for n in inst.notes: print(inst, n.pitch, n.start, n.end)所有时间都以秒为单位不需要自己换算 MIDI tick这是这个库最省事的地方。音高与频率互相换算拿到 MIDI 音高编号后经常要换成物理频率Hz或反过来。两个工具函数直接调用即可print(pretty_midi.note_number_to_hz(60)) # 中音 C4 → 261.63 Hz print(pretty_midi.hz_to_note_number(440)) # A4 的频率 → 音高编号 69反过来如果手里只有音名字符串note_name_to_number(C4)和note_number_to_name(60)可以完成名称与编号的互换program_to_instrument_name()则用来查某个音色编号对应的乐器名。从零合成一个 C 大调和弦并保存不需要现成的.mid文件也可以手工组装一个。核心思路是创建PrettyMIDI对象 → 加一个乐器 → 往乐器里塞音符 → 调用write()。pm pretty_midi.PrettyMIDI() piano pretty_midi.Instrument(program0) # GM 音色 0 钢琴 pm.instruments.append(piano) for name in [C4, E4, G4]: # C 大和弦的三个音 piano.notes.append(pretty_midi.Note( velocity100, pitchpretty_midi.note_name_to_number(name), start0, end0.6)) # 每个音响 0.6 秒 pm.write(chord.mid)注意Note的第一个参数是velocity力度不是音高——参数顺序写反是新手最常见的错误。进阶把 MIDI 渲染成能播放的 wav .mid本身只是指令数据不含任何声音。要得到波形synthesize()用正弦波叠加出一个电子琴版本音质更高的是fluidsynth()它调用 FluidSynth 配合音色库soundfont渲染需要先pip install pyfluidsynth。包内已自带TimGM6mb.sf2不用额外下载音色文件audio pm.fluidsynth() # 44100 Hz 的 float 波形 scipy.io.wavfile.write(out.wav, 44100, audio)鼓声轨在synthesize()中会被忽略含打击乐的文件建议走 fluidsynth 这条路。常见坑与 FAQQnote.pitch是 60 就代表 C4 吗是。MIDI 音高是 0–127 的整数编号60 C4中音 C每大 1 升一个半音。要频率用note_number_to_hz()不要拿velocity当频率用那是力度。Qestimate_tempo()返回的不是 BPM它返回 QPM每秒四分音符数与 BPM 差一个 60 倍。换算用pretty_midi.qpm_to_bpm()或直接读pm.tempo。Qwrite()之后为什么没有 wavwrite()只负责保存.mid。想要音频必须再走一遍synthesize()或fluidsynth()。继续深入官方文档docs/可运行的示例脚本和弦目录、芯片音合成、音频对齐、钢琴卷帘反演examples/测试用例可对照 API 的标准用法tests/交互式教程Tutorial.ipynbPrettyMIDI 的核心工作流就是读进来、按任务改、存出去或渲染上面的代码基本覆盖了日常 90% 的需求。【免费下载链接】pretty-midiUtility functions for handling MIDI data in a nice/intuitive way.项目地址: https://gitcode.com/gh_mirrors/pr/pretty-midi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考