MIDI ↔ MP3/WAV

翻唱伴奏/钢琴谱→音频互转

407 次访问
🎹
MIDI RENDERER · FLUIDSYNTH / TIMIDITY

MIDI 转 MP3 / WAV

使用 SoundFont 音色库渲染 MIDI 为音频 · 钢琴谱转音频 / 翻唱伴奏制作

什么是 MIDI

MIDI(Musical Instrument Digital Interface)是音乐数字接口标准,文件存储的不是音频波形而是"乐谱"(音符 / 时值 / 力度 / 乐器)。需要 SoundFont(音色库)才能渲染为真实音频。

推荐方案 · FluidSynth + FFmpeg

步骤 1:安装 FluidSynth
# macOS brew install fluidsynth # Linux sudo apt install fluidsynth # 或 sudo dnf install fluidsynth # Windows: 下载 https://www.fluidsynth.org/ # 解压并加入 PATH
步骤 2:下载 SoundFont(音色库)
# FluidR3_GM (140 MB · 通用 GM 标准) wget https://musical-artifacts.com/artifacts/738/FluidR3_GM.sf2 # 或 GeneralUser GS (29 MB · 体积小质量好) wget https://musical-artifacts.com/artifacts/696/GeneralUser_GS.sf2 # 或 Salamander Grand Piano (1.5 GB · 顶级钢琴音色) wget https://freepats.zenvoid.org/Piano/SalamanderGrandPiano-V3+20200602.sfz
步骤 3:MIDI 渲染为 WAV
# 基础渲染 fluidsynth -ni FluidR3_GM.sf2 input.mid -F output.wav -r 44100 # 高质量 fluidsynth -ni FluidR3_GM.sf2 input.mid -F output.wav \ -r 48000 -g 1.0 --gain 0.8 # 渲染为 MP3(管道接 FFmpeg) fluidsynth -ni FluidR3_GM.sf2 input.mid -T raw -F - -r 44100 | \ ffmpeg -f s16le -ar 44100 -ac 2 -i - -c:a libmp3lame -b:a 192k output.mp3

备选方案 · Timidity++

# macOS brew install timidity # Linux sudo apt install timidity timidity-instruments # 渲染为 WAV timidity input.mid -Ow -o output.wav # 直接生成 MP3(结合 FFmpeg) timidity input.mid -Ow -o - | ffmpeg -i - -b:a 192k output.mp3 # 指定 SoundFont timidity --soundfont FluidR3_GM.sf2 input.mid -Ow -o output.wav

桌面 GUI 工具

MuseScore(免费 / Win/Mac/Linux):开源乐谱软件,支持 MIDI 导入 + 多种 SoundFont + 导出 MP3 / WAV / OGG / FLAC。是非专业用户最易上手的工具。

Synthesia(付费 / Win/Mac):钢琴学习软件,MIDI 文件可视化 + 自动跟弹。

MidiEditor(免费 / Win/Mac/Linux):MIDI 编辑器,支持音色库切换 + 导出音频。

在线服务(无需部署)

conversion-tool.com:MIDI → MP3 在线转换,免费且无需注册。

solmire.com:MIDI 在线播放 + 转 MP3。

⚠ 上传隐私:MIDI 文件如果是您原创作品(未发表),建议本地处理。商业服务可能存留文件。

逆向方案 · MP3 转 MIDI(不准确)

音频转 MIDI 是难得多的问题,需要 AI 音高检测 + 节奏检测。准确度在多乐器混音上很差。

Spotify Basic Pitch(开源):

pip install basic-pitch basic-pitch input.mp3 ./output/

Magenta Onsets-and-Frames:Google 开源,钢琴单乐器专门优化。

商业:AnthemScore(付费 GUI)/ Melodyne / Klangio API。

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎤

翻唱伴奏制作

翻唱爱好者手头只有原版 MP3,想消人声做伴奏但效果不佳。本工具将 MP3 转为 MIDI 后,可在钢琴卷帘中手动删除人声音符、调整和弦节奏,再转回 WAV 输出干净伴奏,比常规消音算法保留更多低频细节。

🎹

钢琴谱试听验证

作曲新手在打谱软件里写完一段 MIDI 钢琴谱,不确定实际听感是否像想象中那样。本工具把 MIDI 直接转成 MP3,无需加载 DAW 或虚拟乐器,30 秒内听到带力度和踏板的真实钢琴音色,快速判断音符密度和声部平衡是否合理。

🎧

乐队排练记谱

乐队排练时即兴了一段吉他 riff,手机录的 WAV 音质嘈杂。本工具将 WAV 转为 MIDI 后,自动提取主音高和节奏网格,成员可直接在谱面上标注和弦级数、修改错音,省去逐帧听写的时间,排练效率提升一倍。

🎬

短视频 BGM 改编

视频创作者找到一首喜欢的流行歌想做 BGM,但原曲有人声或版权受限。本工具将 MP3 转为 MIDI 后,可自由移调、变速、替换音色(钢琴→电子琴→管弦乐),再导出 WAV 作为无版权风险的纯器乐版背景音乐。

🎓

视唱练耳训练素材

音乐老师需要批量生成不同调性、节奏型的听音练习曲。本工具将 MIDI 谱转成 MP3 音频,支持指定速度(60-200 BPM)和音色(钢琴/小提琴/单簧管),学生听完音频后默写旋律,系统自动比对 MIDI 原谱给出正确率。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (Audacity)传统方法
数据隐私纯浏览器端处理,音频文件不上传服务器本地软件处理,文件不离开电脑需将文件发送给第三方制作人或混音师
处理速度秒级完成,取决于文件大小分钟级,需手动导入、设置参数并导出数小时到数天,需预约、沟通、等待交付
操作门槛上传文件即转,无需学习需学习软件界面、音频轨道、导出设置等需具备乐理知识或联系专业人员
输出格式直接输出 MP3/WAV 音频文件可输出多种格式,但需手动配置编码器参数通常交付 WAV 或 MP3,格式固定
设备依赖有现代浏览器即可,跨平台需安装特定操作系统版本的软件依赖线下设备(合成器/音源)或人工
适用场景快速试听、翻唱伴奏制作、教学演示专业音频编辑、多轨混音、效果处理高质量唱片级制作、复杂编曲需求

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例8 个典型场景,覆盖常规、边界与易错

输入输出说明
C D E F G A B C D E F G A B C生成一个 16 音符的 C 大调音阶 WAV 文件,每个音符持续 0.5 秒典型场景:将简单的单音旋律转为音频试听
伴奏.wav生成一个 MIDI 文件,包含原 WAV 中识别出的主要旋律和和弦轨道典型场景:将人声清唱或乐器录音转为 MIDI 谱
钢琴谱.mid生成一个 128kbps MP3 文件,使用标准钢琴音色播放全部音符典型场景:将 MIDI 钢琴谱转为可分享的 MP3 音频
empty.mid错误提示:MIDI 文件为空,无任何音符数据边界 case:空文件或损坏文件会直接报错
采样率_192kHz.wav生成一个 MIDI 文件,但高频泛音可能丢失(FFmpeg 默认降采样至 44.1kHz)边界 case:极高采样率 WAV 转 MIDI 时精度受限
和弦密集.mid生成一个 WAV 文件,但同时发声音符超过 16 个时部分音符被静音边界 case:MIDI 标准限制同时发音数(通常 16 通道)
无声音频.wav生成一个空 MIDI 文件(无音符事件)易错 case:用户误以为静音段会被忽略,实际会生成空文件
中文歌名.mid生成一个 WAV 文件,但文件名中的中文字符在部分浏览器中显示为乱码易错 case:非 ASCII 文件名可能导致下载后无法识别

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 把 MIDI 文件当作普通音频上传

错误
上传一个 .wav 或 .mp3 文件到「MIDI → MP3/WAV」转换入口
修复
确认文件后缀是 .mid 或 .midi;MIDI 是乐谱指令集,不是波形文件

MIDI 只记录音符、时长、力度等控制信息,不包含实际声音波形。工具内部用 FFmpeg 合成音色,输入必须为 MIDI 格式。

2. 期望 MIDI→MP3 能保留原录音的人声

错误
用 MIDI→MP3 转换一首歌曲的伴奏,期望输出包含原唱人声
修复
MIDI→MP3 只生成乐器音色,不含任何录音人声;如需提取人声请用人声分离工具

MIDI 是纯乐谱数据,不包含录音采样。转换后听到的是 FFmpeg 用内置音色库(如 FluidSynth)实时合成的电子音,不是原曲录音。

3. MP3/WAV→MIDI 时上传低质量或含混响的音频

错误
上传一段 64kbps 的 MP3 或带有大量混响/背景噪音的录音
修复
上传 320kbps 或无损 WAV,且音频尽量干净(无混响、无背景噪)

音频转 MIDI 依赖音高检测算法(如 FFT 峰值提取)。低码率或混响会模糊音高边界,导致识别出大量错音或缺失音符。

4. 把多乐器混音整轨音频直接转 MIDI

错误
上传一首完整歌曲(人声+吉他+鼓+贝斯)到 WAV→MIDI,期望输出分轨 MIDI
修复
先分离出单乐器音轨(如纯钢琴独奏),再转 MIDI

FFmpeg 的音频→MIDI 转换基于单声道/单音色音高检测。多乐器混音中多个音高重叠,算法无法区分,输出会变成混乱的单一音轨。

5. MIDI→MP3 后音量极低,以为是工具故障

错误
转换后播放,发现音量比正常音频文件小很多,认为工具输出有问题
修复
在 MIDI 编辑软件中检查各轨道的 velocity(力度)值,或使用音频编辑软件(如 Audacity)对输出做归一化处理

MIDI 的力度值(0-127)直接映射到合成音量的振幅。很多 MIDI 文件默认力度偏低(如 64),FFmpeg 合成时不会自动增益。

6. 上传非标准 MIDI 文件(如 Type 0/1 混淆)

错误
上传一个 Type 0 格式(单轨)的 MIDI 文件,期望输出多个独立音轨
修复
确认 MIDI 文件类型:Type 0 是单轨,Type 1 是多轨。转换前用 MIDI 查看器检查轨道数

FFmpeg 会按 MIDI 文件的实际轨道结构合成。Type 0 所有乐器挤在一轨,输出就是单声道混合,无法分离。

7. 期望 MP3→MIDI 能完美还原复杂和弦

错误
上传一段包含密集和弦(如钢琴柱式和弦、吉他扫弦)的音频,期望输出 MIDI 准确记录每个音符
修复
优先上传单音旋律或简单双音(如人声哼唱、单音口哨),和弦部分手动转录

FFmpeg 的音高检测算法对同时发声的多个频率(和弦)识别准确率很低,常会漏音或产生错误泛音。单音识别最可靠。

8. 把 MIDI 文件拖入工具后直接点击转换,忽略采样率设置

错误
不检查输出采样率(默认 44100Hz),直接转换用于专业编曲
修复
根据用途选择采样率:CD 音质 44100Hz,专业录音 48000Hz,电影 96000Hz

FFmpeg 合成时默认输出 44100Hz。若用于视频或专业音频项目,采样率不匹配会导致播放时音高/时长偏移。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

f(t) = A(t) \cdot \sin(2\pi \cdot \text{pitch}(t) \cdot t + \phi(t))

变量说明

  • f(t) — 时刻 t 的音频采样值
  • A(t) — 时刻 t 的音量包络(振幅)
  • pitch(t) — 时刻 t 的音高(频率,Hz)
  • t — 时间(秒)
  • ϕ(t) — 时刻 t 的相位偏移

示例

MIDI 音符 C4(pitch=261.63Hz)持续 1 秒,音量恒定 A=0.8,相位 ϕ=0。采样率 44100Hz,t 从 0 到 1 秒。第 0.5 秒处:f(0.5) = 0.8 × sin(2π × 261.63 × 0.5 + 0) = 0.8 × sin(821.86) ≈ 0.8 × 0.309 ≈ 0.247。所有采样点合成后得到该音符的 WAV 波形。

适用范围

适用于 MIDI 音符到 PCM 音频的合成,基于加法合成原理。不适用于包含复杂音色(如人声、真实乐器采样)的音频,此时需使用波表合成或物理建模。来源:MIDI 标准(MMA/AMEI)及数字音频基础理论。

原理图

上传 / 选择文件MIDI 或 MP3/WAVFFmpeg 引擎解码 / 编码 / 重采样音色映射 → PCM 流生成目标文件MP3 / WAV 或 MIDI↔ 双向转换:MIDI → 音频 或 音频 → MIDI翻唱伴奏 / 钢琴谱 互转所有处理在浏览器本地完成,文件不上传服务器
用户输入 FFmpeg 核心处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import subprocess
import os

# MIDI → WAV 转换(使用 FluidSynth,需安装 fluidsynth 和 SoundFont)
midi_file = "input.mid"
wav_file = "output.wav"
soundfont = "/usr/share/sounds/sf2/FluidR3_GM.sf2"  # 常见 SoundFont 路径

# 调用 fluidsynth 渲染 MIDI 为音频
result = subprocess.run([
    "fluidsynth",
    "-ni", soundfont,
    midi_file,
    "-F", wav_file,
    "-r", "44100"  # 采样率
], capture_output=True, text=True)

if result.returncode != 0:
    print(f"转换失败: {result.stderr}")
else:
    print(f"已生成 {wav_file}")

# WAV → MP3 编码(使用 FFmpeg)
mp3_file = "output.mp3"
subprocess.run([
    "ffmpeg", "-i", wav_file,
    "-codec:a", "libmp3lame",
    "-b:a", "192k",
    mp3_file
], check=True)
print(f"已生成 {mp3_file}")
package main

import (
	"fmt"
	"os/exec"
)

func main() {
	// MIDI → WAV(依赖 fluidsynth 命令行工具)
	midiFile := "input.mid"
	wavFile := "output.wav"
	soundfont := "/usr/share/sounds/sf2/FluidR3_GM.sf2"

	cmd := exec.Command("fluidsynth",
		"-ni", soundfont,
		midiFile,
		"-F", wavFile,
		"-r", "44100",
	)
	if err := cmd.Run(); err != nil {
		fmt.Printf("MIDI→WAV 失败: %v\n", err)
		return
	}
	fmt.Println("WAV 生成成功:", wavFile)

	// WAV → MP3(依赖 ffmpeg)
	mp3File := "output.mp3"
	cmd = exec.Command("ffmpeg",
		"-i", wavFile,
		"-codec:a", "libmp3lame",
		"-b:a", "192k",
		mp3File,
	)
	if err := cmd.Run(); err != nil {
		fmt.Printf("WAV→MP3 失败: %v\n", err)
		return
	}
	fmt.Println("MP3 生成成功:", mp3File)
}
// 浏览器端 MIDI → 音频(使用 Web Audio API + MIDI 解析)
// 需要先加载 midi-parser-js 和 soundfont-player

async function midiToAudio(midiArrayBuffer) {
  // 解析 MIDI 文件
  const MidiParser = require('midi-parser-js');
  const midi = MidiParser.parse(new Uint8Array(midiArrayBuffer));
  
  // 创建音频上下文
  const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
  
  // 加载 SoundFont(使用 tonejs 的通用音色库)
  const Soundfont = require('soundfont-player');
  const instrument = await Soundfont.instrument(audioCtx, 'acoustic_grand_piano');
  
  // 按 MIDI 事件播放(简化示例:仅播放第一个轨道的前几个音符)
  const track = midi.track[0];
  const noteEvents = track.event.filter(e => e.type === 9); // Note On 事件
  
  noteEvents.slice(0, 5).forEach(event => {
    const note = event.data[1];  // MIDI 音符编号
    const velocity = event.data[2] / 127;  // 力度
    const startTime = event.deltaTime / 1000;  // 秒
    
    instrument.play(note.toString(), audioCtx.currentTime + startTime, {
      duration: 0.5,
      gain: velocity
    });
  });
  
  // 渲染为 WAV(需要 AudioBuffer → WAV Blob 转换)
  // 此处省略具体编码实现,通常使用 offlineAudioContext 渲染
  console.log('MIDI 已解析,音频播放中...');
}

// 使用示例:从文件输入获取 ArrayBuffer
// const fileInput = document.getElementById('midiFile');
// fileInput.addEventListener('change', async (e) => {
//   const buffer = await e.target.files[0].arrayBuffer();
//   midiToAudio(buffer);
// });

常见问题

8 个高频疑问

我有个 MIDI 文件,怎么转成 MP3 听?
直接上传 MIDI 文件,选择输出格式为 MP3,点击转换按钮即可。转换由服务端的 FFmpeg 完成,MIDI 本身不包含真实音频,工具会先调用系统音色库(默认 GM 音色)合成音频再编码为 MP3。如果上传后没声音,可能是浏览器没选对文件,或者 MIDI 文件本身是空的(只有控制信息没有音符)。建议先用其他播放器确认 MIDI 能正常发声。
为什么转出来的 MP3 音质很差,像电子琴玩具声?
MIDI 转音频的音质取决于两个因素:一是 MIDI 文件本身编曲的精细度(简单单音轨听起来就是电子琴声),二是服务端使用的音色库。本工具使用 FFmpeg 默认的 FluidSynth 音色库,是通用 GM 音色,相当于 1990 年代声卡软波表水平。如果追求真实乐器质感,建议在 DAW(如 FL Studio 或 Cubase)中加载高质量 VST 音源重新导出,本工具更适合快速预览或翻唱伴奏制作。
上传 MP3 转 MIDI,能直接把歌谱转出来吗?
可以转,但结果通常不理想。MP3/WAV 转 MIDI 本质是音频转 MIDI(音高识别),FFmpeg 使用 aubio 库做基频检测,对单音旋律(如人声清唱、单一乐器 Solo)识别率尚可,但对多声部混合音频(如流行歌曲带伴奏)效果很差——会识别出大量杂音、倍频和错误音符。建议只上传纯人声或单乐器录音,不要直接传成品歌曲。如果转出来的 MIDI 全是错音,是音频复杂度的限制,不是工具坏了。
转换后 MIDI 文件在音乐软件里打开,音符位置和原曲对不上?
这是正常现象。MIDI 记录的是音高、力度和时长,不含原曲的节奏网格(网格感)。从 MP3 转 MIDI 时,aubio 按检测到的基频起点切分音符,如果原曲有轻微变速(人声自由节奏)或混响尾音,切分点会偏移。要修齐,需要在 DAW 里手动量化(Quantize)音符。反过来 MIDI 转 MP3 则不会出现节拍偏差,因为 MIDI 自带拍号。
MIDI 转 MP3 和在线钢琴翻弹录制有什么区别?
两者产出都是音频,但流程完全不同。本工具直接解析 MIDI 指令(音符、控制器、力度),用合成引擎实时生成音频,没有录音过程。在线钢琴翻弹录制是真实乐器演奏后录成音频,音色是真实物理振动。前者适合从乐谱/编曲文件快速出伴奏,音色偏电子;后者适合保留演奏细节和真实乐器质感。如果你需要钢琴弹奏的 MP3,建议用 MIDI 转 MP3 后再用音源替换音色,或直接录制真实钢琴。
上传的 MP3 文件超过 10MB 转不了怎么办?
本工具对上传文件大小有限制(单文件最大 50MB),超过会提示错误。可以先用音频编辑软件(如 Audacity)把 MP3 裁剪到 5 分钟以内再上传,或者降低比特率(比如从 320kbps 降到 128kbps)减小文件体积。如果文件超过 50MB,建议直接使用桌面端软件(如 MuseScore 或 FL Studio)处理,在线工具受带宽和服务器处理时间限制,不适合大文件。
为什么上传 WAV 文件后转出来的 MIDI 全是同一个音?
这通常是音频本身的问题。如果 WAV 文件里包含的是持续低音或噪声(比如电流声、风扇声、或者只有低频嗡嗡声),FFmpeg 的 aubio 基频检测会锁定在某个固定频率上,输出 MIDI 就全是同一个音符。建议先确认 WAV 文件里的声音是否清晰可辨的音高变化(比如人声哼唱旋律),不要传白噪声、纯鼓点或静音文件。可以用 Audacity 查看频谱图,如果全是平直线条就是噪声。
转换后下载的 MP3 播放时卡顿或断断续续?
卡顿一般不是工具问题,是网络下载不稳定或浏览器缓存不足。可以尝试:1. 切换浏览器(Chrome 或 Edge 兼容性最好);2. 清除浏览器缓存后重试;3. 下载后不要直接在浏览器内播放,保存到本地用播放器(如 VLC)打开。如果文件本身转换成功了但播放卡,说明传输过程损坏,重新转换一次即可。若反复出现,检查电脑内存是否不足(FFmpeg 处理大文件时浏览器标签页可能被系统回收)。
选择 打开 +新窗口 esc关闭