MIDI音乐只播放1个音符就停止
广告
{{v.name}}
📋 原始需求(task.md):
http://localhost:8030/api/projects/4/midi 这个MIDI音乐只播放1个音符就停止。
这个音乐下载后播放正常,所以应该是前端的播放有问题。
不要让前端算这么复杂的数据。
改成点击播放按钮后,前端发送当前的工程文件参数,让后端按当前参数生成MIDI音乐,前端直接用浏览器的API播放音乐,就不会播放出错。
改之后,播放按钮相当于预览,把下载按钮改成保存并下载,防止前端和后端数据不一致。
并且在本次修改中加入只在前端记录的操作历史,增加撤销和重做按钮,避免保存之后无法恢复之前的操作。
http://localhost:8030/api/projects/4/midi 这个MIDI音乐只播放1个音符就停止。
这个音乐下载后播放正常,所以应该是前端的播放有问题。
不要让前端算这么复杂的数据。
改成点击播放按钮后,前端发送当前的工程文件参数,让后端按当前参数生成MIDI音乐,前端直接用浏览器的API播放音乐,就不会播放出错。
改之后,播放按钮相当于预览,把下载按钮改成保存并下载,防止前端和后端数据不一致。
并且在本次修改中加入只在前端记录的操作历史,增加撤销和重做按钮,避免保存之后无法恢复之前的操作。
重新设计播放流程:前端发送工程参数给后端生成MIDI,浏览器原生播放。增加撤销重做功能。
问题分析
- 问题现象:播放时只播放1个音符就停止
- 根本原因:前端解析MIDI二进制数据的逻辑存在bug,无法正确解析所有音符
- 正确逻辑:不要在前端解析MIDI,直接让浏览器播放MIDI音频数据
解决方案
- 前端发送POST请求到/api/projects/{id}/preview,后端生成MIDI并返回二进制数据
- 前端使用浏览器Audio API播放返回的音频数据
- 下载按钮改为"保存并下载",调用/api/projects/{id}/midi下载完整MIDI文件
- 添加前端撤销重做栈,记录音符修改操作