没有钢琴采样,没有第三方库,没有需要下载的音色包。一个用C++17写成的物理建模钢琴合成器,把锤子、琴弦、音板和共鸣全部用代码算出来。
这个项目叫coopiano。它能把音符和MIDI文件渲染成立体声WAV,在macOS上还支持实时MIDI输入。声音来自锤子、琴弦、音板与共鸣的物理模型,外加一个房间混响效果。作者在说明里写得很直白:代码放出来得非常早,钢琴本身没问题,但AU和VST插件还只是原型,不在这次开源的范围里。
跑起来需要什么
一个C++17编译器和Make就够了。macOS上如果没装Xcode命令行工具,先执行xcode-select --install,然后:
- make 编译
- ./coopiano --help 查看用法
macOS构建会链接系统的CoreMIDI、AudioToolbox、CoreFoundation和CoreAudio框架。源码在其他平台上也支持离线渲染,前提是有C++17编译器和线程支持;实时MIDI和音频只在macOS上可用。作者明确说明,这次提取出来的代码是在macOS上构建和测试的,其他平台没有验证过。
编译设置可以覆盖,比如make CXX=clang++ CXXFLAGS=-O3。改编译设置前先跑make clean,它只删可执行文件,渲染结果和预设都会保留。
几条命令能干什么
不带参数运行./coopiano,会以力度0.5渲染A4八秒。指定音符、力度和时长也很直接:
- ./coopiano A4 0.5 8 写出A4_gp.wav,升号音符名要加引号,比如'G#3'
- ./coopiano demo 跑内置音乐演示,写出demo_piano.wav
- ./coopiano performance.mid 1.0 performance.wav 渲染自己的MIDI文件,项目本身不带任何MIDI文件
- ./coopiano live 从连接的MIDI源或虚拟coopiano MIDI目标播放,仅macOS,Ctrl-C停止
离线命令写出的是44.1 kHz、16位立体声WAV,不会自动播放。macOS上可以用afplay A4_gp.wav来听。每次离线渲染都会独立做峰值归一化。
内置默认值不需要任何配置文件就能工作。default.ini记录了可用的发声和混响控制项及其范围。用法是复制一份再改,然后显式指定:
- cp default.ini my-piano.ini
- ./coopiano --preset my-piano.ini live
- ./coopiano --preset my-piano.ini audition --output audition.wav
audition命令会以递增力度弹一个和弦,和弦、力度和时序选项可以用--help查看。只改default.ini不会改变内置声音,必须通过--preset传入并重启播放才能加载改动。
环境变量可以覆盖预设设置,且优先级更高。比如GP_NO_REVERB=1关掉混响,GP_SAVE_SETTINGS=1会把解析后的预设写到WAV旁边,命名为A4_gp.wav.ini。
代码结构
coopiano.cpp负责CLI、MIDI文件解析、WAV写入和macOS实时宿主。piano.hpp是命名空间piano下的header-only合成库。instrument.hpp管声部池、音符与踏板调度和乐器效果。streaming_soundboard.hpp做流式音板卷积。preset.hpp和reverb.hpp处理INI配置和立体声房间效果。piano_host.hpp与piano_resampler.hpp负责宿主采样率适配和重采样。live_diagnostics.hpp和live_bench.hpp是编译进macOS宿主的支持代码。
作者提到,这些C++源文件和头文件来自一个更大的开发项目,历史注释可能指向那个项目里的文档。原始的测试和基准测试集合没有随这次开源一起打包。许可证是MIT。
热门跟贴