🎵 修复验证报告
修复的问题
1. BPM 未正确提取 ✅ 已修复
问题: 解析 MIDI 时没有读取 Tempo 信息,导致输出 MIDI BPM 不正确
解决方案:
- 扫描 MIDI 音轨中的 Set Tempo 元事件 (0xFF 0x51)
- 提取微秒/拍的值
- 自动转换为 BPM 显示给用户
- 在输出 MIDI 中保留原始 BPM
// 修复后的代码:
const microsecondsPerBeat = (trackData[i] << 16) | (trackData[i+1] << 8) | trackData[i+2];
const bpm = Math.round(60000000 / microsecondsPerBeat);
验证方法:
- 上传一个已知 BPM 的 MIDI 文件(例如 120 BPM)
- 在分析结果中检查显示的 BPM 是否正确
- 下载改编后的 MIDI 并在编辑器中检查 BPM
2. 音符在转调时丢失 ✅ 已修复
问题: 转调/八度调整后,某些音符消失了
根本原因:
- 音符匹配算法在处理同一音符的多个 note-on 时只保存最后一个
- 无 note-off 的音符(未正常关闭)被完全丢弃
- 某些和弦或重叠音符被覆盖
修复方案:
// 原来(错误):
activeNotes[event.note] = event; // 覆盖之前的
// 修复后(正确):
if (!activeNotes[event.note]) {
activeNotes[event.note] = [];
}
activeNotes[event.note].push(event); // 保留所有
// 处理无 note-off 的音符
for (const noteNum in activeNotes) {
for (const noteOnEvent of activeNotes[noteNum]) {
notes.push({...noteOnEvent}); // 保留所有音符
}
}
验证方法:
- 使用 debug-advanced.html 上传 MIDI
- 记录适配前的音符数:
X 个音符
- 应用转调/八度调整
- 验证适配后的音符数是否相同或接近
3. MIDI 输出缺少 Tempo ✅ 已修复
问题: 下载的改编 MIDI 失去了原始的 BPM
修复: 在生成输出 MIDI 时,在首个音轨的开始添加 Set Tempo 元事件
// 在转换到 buffer 时:
if (trackIdx === 0 && midiData.tempo) {
trackChunk.push(0); // Delta time
trackChunk.push(0xFF, 0x51, 0x03); // Set Tempo
trackChunk.push((tempo >> 16) & 0xFF);
trackChunk.push((tempo >> 8) & 0xFF);
trackChunk.push(tempo & 0xFF);
}
改进的功能
| 功能 |
改进内容 |
状态 |
| BPM 显示 |
分析结果中显示原始 MIDI 的 BPM |
✅ 已实现 |
| 音符总数 |
显示 MIDI 中的总音符数 |
✅ 已实现 |
| 适配日志 |
记录转调/八度调整时的具体操作 |
✅ 已实现 |
| BPM 保留 |
输出 MIDI 保持原始 BPM |
✅ 已实现 |
| 多音符处理 |
正确处理同时演奏的相同音符 |
✅ 已实现 |
| 未关闭音符 |
保留没有 note-off 的音符 |
✅ 已实现 |
测试工具
技术细节
修改的文件
| 文件 |
修改内容 |
行数 |
| js/midi-parser.js |
添加 tempo 提取、改进音符匹配 |
+50 |
| js/midi-adapter.js |
改进适配方法、保留所有音符、保留 BPM |
+70 |
| js/app.js |
显示 BPM 和音符总数 |
+10 |
| debug-advanced.html |
新增完整调试工具 |
+450 |
验证清单
常见问题
Q: 为什么下载的 MIDI 和原文件音符数不一样?
A: 这是正常的。如果您使用了「移除」方法,超出范围的音符会被删除。使用「转调」或「八度调整」时,音符数应该相同。
Q: 如何验证 BPM 是否正确?
A:
- 在分析结果中记下显示的 BPM
- 下载改编的 MIDI
- 用 MIDI 编辑器(如 MuseScore、FL Studio)打开
- 检查文件属性或 Properties,看 BPM 是否匹配
Q: 音符仍然丢失怎么办?
A:
- 访问 debug-advanced.html 上传相同的 MIDI
- 下载调试日志
- 检查日志中的具体错误信息
- 提供 MIDI 文件和日志给开发者
修复完成时间: 2024 年 2 月 19 日
所有已知问题已修复 ✅