为什么我的microbit调用startMelody函数仅能播放2至3个节拍?
micro:bit 自定义旋律无法完整播放修复方案
问题根因
你遇到的播放中断问题核心是两个原因:一是部分音符格式不符合MakeCode音乐API的解析规则,只要有一个音符解析失败,后续所有旋律都会被截断;二是startMelody是异步播放接口,没有加等待逻辑的话,程序运行到末尾就会终止播放进程。
修复后的可运行代码
let amongUs = ['c3:0.5', 'd#3:0.5', 'f3:0.5', 'f#3:0.5', 'f3:0.5', 'd#3:0.5', 'c3:1.5', 'a#3:0.25', 'd3:0.25', 'c3:1', 'r:1', 'c2:0.5', 'g2:0.5'] music.startMelody(amongUs, false) // 等待整首旋律播放完成,避免程序提前终止 music.melodyPlayedUntil(amongUs.length)
同类场景通用修复规则
- 严格遵守音符格式要求:
- 统一使用升号
#表示半音,不要使用eb、bb这类降号写法,降号可以转换为对应前一个音的升号(比如eb3对应d#3、bb3对应a#3),避免API识别失败 - 时长必须补全前导0,
0.5不能简写为.5,休止符统一按r:[时长]格式书写
- 统一使用升号
- 必须添加播放等待逻辑:
异步调用startMelody后,添加music.melodyPlayedUntil(旋律数组.length)代码,等待旋律全部播放完成后再执行后续逻辑,避免播放被强制中断 - 显式指定BPM:
播放前调用music.setTempo(你需要的BPM数值),避免默认BPM和预期不符,导致你误判播放进度 - 快速定位错误音符:
如果修改后还是播放不全,可以把旋律数组拆分为2-3个音符的小段逐一测试,快速定位到格式错误的音符位置
内容的提问来源于stack exchange,提问作者Ametrine
相关产品推荐
相关产品推荐

