You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:30:51