ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PrettyMIDI 手把手教程:从解析到合成的完整路径

PrettyMIDI 手把手教程:从解析到合成的完整路径 PrettyMIDI 手把手教程从解析到合成的完整路径【免费下载链接】pretty-midiUtility functions for handling MIDI data in a nice/intuitive way.项目地址: https://gitcode.com/gh_mirrors/pr/pretty-midi拿到一份 .mid 文件想做和弦分析常常被事件流的写法劝退想造一段两小节的旋律又得对着 tick 和速度事件头疼。PrettyMIDI 是一个 Python MIDI 处理库把 MIDI 文件解析成可以直接读写、修改的 Python 对象面向音乐分析、教学演示和创意编程三类使用者。PrettyMIDI 的定位把 MIDI 事件流转成音符列表它做的事情很集中把 MIDI 底层的事件流翻译成以秒为单位的对象——一个 PrettyMIDI 实例装着一组乐器每个乐器装着一组音符每个音符有力度、音高、起止时间。底层解析交给 mido它负责时间域换算和数据结构设计让你写 Python 音乐编程时直接工作在秒这个维度上。做调性与节奏分析的研究者、演示音乐教学的老师、需要把 MIDI 转成音频的开发者都能省掉自己写解析器的功夫。三步写完你的第一首 MIDI第一步装包pip install pretty-midi第二步创建、第三步保存。下面这段代码跑通创建 C 大和弦并导出文件的完整链路import pretty_midi # 新建 MIDI 对象分辨率 220 tick/拍初始速度 120 BPM pm pretty_midi.PrettyMIDI(resolution220, initial_tempo120) piano pretty_midi.Instrument(program0) # program 0 是钢琴 pm.instruments.append(piano) # C 大和弦C4(60)、E4(64)、G4(67)持续 0.5 秒 piano.notes.extend( pretty_midi.Note(velocity100, pitchp, start0, end0.5) for p in (60, 64, 67) ) pm.write(output.mid)跑完就得到一个可播放的 output.mid用PrettyMIDI(output.mid)读回来即可继续分析。能力地图从解析到合成整个库的 API 基本都挂在PrettyMIDI和Instrument两个对象上能力关键函数一句话说明MIDI 文件解析与写出PrettyMIDI(file)、write()一行读入 .mid一行写回磁盘音符管理Instrument(program)、Note(velocity, pitch, start, end)按乐器组织音符时间单位为秒音高换算note_number_to_hz/hz_to_note_number、note_name_to_number/note_number_to_nameMIDI 音数、频率、C4 式音名自由互转乐器映射program_to_instrument_name程序号转成人能读的乐器名钢琴卷帘get_piano_roll(fs)128 音高 × 时间矩阵直接喂给绘图和弦特征提取get_chroma(fs)、get_pitch_class_histogram()12 维色度与音级直方图调性判定的代理指标节奏分析get_beats()、get_downbeats()拍点与强拍小节第一拍时刻时间轴编辑adjust_times(old_times, new_times)把旧时间重映射到新时间变速或对齐都用它音频合成synthesize(fs)、fluidsynth()内置正弦波或 FluidSynth 出真实音色两个真实场景画卷帘、出音频场景一钢琴卷帘可视化。卷帘是音乐可视化最直观的形式。get_piano_roll(fs100)按每秒 100 列采样返回 128 行的矩阵用 imshow 就能画出来pm pretty_midi.PrettyMIDI(example.mid) pr pm.get_piano_roll(fs100) import matplotlib.pyplot as plt plt.imshow(pr, aspectauto, originlower) plt.show()仓库示例里还有reverse_pianoroll.py用 CQT 频谱把音频反过来转成 MIDI思路值得参考。场景二MIDI 转音频。synthesize用正弦波合成音色简陋但零额外依赖fluidsynth走 FluidSynth 引擎音色真实很多需要 .sf2 音色库库本身自带 TimGM6mb.sf2开箱即可调用pm pretty_midi.PrettyMIDI(example.mid) audio pm.synthesize(fs44100) # 正弦波合成 audio pm.fluidsynth() # FluidSynth 合成音色更接近真实避坑与小贴士initial_tempo只在不传文件、全新创建时生效读入 .mid 后速度以文件内的速度事件为准。一次加多个音符用notes.extend(...)notes.append([...])会把列表塞成一个整体后续遍历会很难排查。fluidsynth依赖系统里的 FluidSynth 程序和 pyfluidsynth旧参数sf2_path从 0.2.11 起已弃用改由synthesizer参数传入 sf2 路径。Note的start/end单位是秒不是 tick——这是它和 mido 原始 API 最大的差别混用会把时间差出几个数量级。延伸学习官方文档全部类与换算函数的 API 参考示例代码节拍对齐、芯片音乐、和弦库等可运行的完整样例测试用例覆盖常见用法是学 API 的好参照下次拿到 MIDI 文件就用 PrettyMIDI 打开一次析出和弦、画张卷帘、导一段合成音频。需要更多用法时翻 docs/ 里的 API 清单即可库不大很容易摸透。【免费下载链接】pretty-midiUtility functions for handling MIDI data in a nice/intuitive way.项目地址: https://gitcode.com/gh_mirrors/pr/pretty-midi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表