如何基于新BPM调整.mboy文件中的音符pos与len参数?
解决方法
要让原128 BPM的.mboy谱面适配240 BPM(保持音频实际播放时间不变),核心是基于时间等价原则转换音符的pos和len参数,步骤如下:
1. 明确转换比例
BPM代表每分钟拍数,相同实际播放时间下,新BPM对应的总拍数是原BPM的 目标BPM/原BPM 倍:
转换比例 ratio = 240 / 128 = 1.875
2. 单个音符的参数转换逻辑
对于每个音符,需要先计算它在原谱面中对应的总拍数,再转换为新BPM下的总拍数,最后拆分回bar.index和pos:
步骤分解:
- 原总拍数计算:
// bar.quarters_count 是每个小节的拍数(比如4/4拍就是4) const originalTotalBeats = bar.index * bar.quarters_count + (note.pos / 1500) * bar.quarters_count; - 新总拍数计算:
const newTotalBeats = originalTotalBeats * ratio; - 转换为新的小节索引和位置:
const newBarIndex = Math.floor(newTotalBeats / bar.quarters_count); // 新pos = 剩余拍数 × 每拍对应的pos单位(1500是单小节的pos范围) const newPos = (newTotalBeats % bar.quarters_count) * (1500 / bar.quarters_count); - 音符长度
len直接按比例缩放:const newLen = note.len * ratio;
3. 批量转换注意事项
- 确保谱面文件中的全局BPM字段修改为240;
- 如果转换后
newPos + newLen超过单小节的pos上限(1500),部分音符可能需要拆分跨小节(具体需参考mboy editor的规则,若原谱面无跨小节音符,转换后大概率也不会出现); - 你提供的
getYPosition是渲染层的位置计算函数,无需修改——只要谱面文件的pos和bar.index正确,该函数会自动渲染出对应位置的音符。
内容的提问来源于stack exchange,提问作者Alen.Toma
相关产品推荐
相关产品推荐

