Bytebeat Moog City Reconstruction v3.2 (JS-big) - 技术解析与实现

1. 项目概述

Bytebeat 版 Moog City 近似重构存档(含超时静音) 📌 本文为个人开发存档,记录一版基于 Bytebeat 的《Moog City》近似重建代码,使用 JavaScript 编写,可在 Bytebeat composer 中直接运行。后续有时间会继续打磨。

**《Moog City》**是 C418 为《Minecraft - Volume Alpha》创作的曲目,发行于 2011 年 3 月 4 日,曲长 02:40,风格为 Ambient。原曲特征为循环上行旋律 + Moog 风格合成器音色,中段加入钢琴,弦乐渐强后再收束。

Bytebeat 是一种极简的生成音乐形式:用一个关于时间变量 t 的表达式直接生成波形,通常以 8000Hz 采样输出 8bit 单声道音频。Dollchan Bytebeat Composer 是一个在线实时编辑播放器,支持多种模式:经典 Bytebeat(输出 0--255 整数)、Signed Bytebeat、Floatbeat(输出 -1.0 到 1.0)、以及 JS-big 模式(支持大于 1KB 的 JavaScript Bytebeat 代码)。本存档代码属于 JS-big / Floatbeat 风格,利用了 JS 的数组、浮点运算、Math.random() 等能力。

项目状态:可运行 / 开发中 (WIP),最后更新于 2026-07-22。

2. 核心架构与算法原理

2.1 时间与音高处理

  • 时间缩放t /= 6 将原始时间变量放慢,形成乐曲的基础速度。
  • 音高映射 :采用十二平均律 (12-TET) 公式 2**(p/12) 将半音序号转换为频率倍数。
  • 音高量化函数EqT = p => 32/d * round(d/32 * 2**(p/12 - 0.02)) 对计算出的频率进行量化对齐,确保音高稳定在网格上,同时微调 -0.02 半音以模拟模拟合成器的轻微失谐感。

2.2 波形生成与静音逻辑

  • 波形生成 :使用三角波算法 abs(modulation) % 4 - 2 的变体(代码中体现为 abs(t*M/8 % 4 - 2) - 1)生成主旋律与和声层的波形。
  • 微观休止 :在 8 步序列的第 7 步(R > 6)触发静音门控 (S = R > 6),为节奏注入呼吸感。
  • 全局静音门 :当样本计数 t 超过 MAX_T = 25000000 时,IS_SILENT 标志置为 true,所有信号路径乘以该标志,确保输出归零。

2.3 反馈延迟线 (Echo)

项目采用反馈延迟线 (FDL) 制造回声效果:

  • 延迟缓冲区a 是一个长度为 n ≈ d * 9 的环形数组,用于存储历史音频样本。
  • 反馈注入 :每帧计算出的混合信号 ev 会累加到缓冲区当前位置:a[T % n] += ev
  • 衰减 :缓冲区值随后除以 3 (a[T % n] /= 3),形成指数衰减的回声。
  • 混合输出 :最终输出 ev 是原始信号与衰减后延迟信号的混合。

3. 声部与旋律结构

3.1 主旋律 (Lead)

javascript 复制代码
M = EqT([5,10,12,17,20,24,27,32][c]) * (!S) * (!IS_SILENT)

主旋律音高数组 M[5,10,12,17,20,24,27,32](半音偏移)。索引 cint((t + random()*D) / d) % 8 决定,并加入随机抖动 random()*D 模拟模拟振荡器的不稳定性。

3.2 和声层 (Harmony)

javascript 复制代码
M2 = EqT([-7,-4,0,3,5,10,12,15][c]) * (!S) * (!IS_SILENT)

和声层音高数组 M2[-7,-4,0,3,5,10,12,15],与主旋律形成和弦进行。需注意在代码中 M2 必须在 ev 计算前定义,避免 ReferenceError。

3.3 低音/噪音层 (Bass/Noise)

javascript 复制代码
C = 8 * EqT([12,12,12,15,10,10,10,3,5,5,5,5,8,8,8,5,10,10,10,10,8,8,8,3,5,5,5,5,8,8,8,10][int((t + d*32 + random()*D) / d / 2) % 32]) * (!S) * (!IS_SILENT)

低音部分使用一个 32 步的复杂音序数组,步进速度是主旋律的一半 (/2),并加入固定偏移 d*32。乘以系数 8 增强低频能量。

3.4 音量包络 (Volume Envelopes)

  • 主旋律音量MV = t < 54864 ? t/128E3 : .42,实现开场淡入。
  • 和声层音量MV2 = (t > 164592 && t < 219456 ? (t-164592)/128E3 : .42) * (!S) * (!IS_SILENT),在乐曲中段引入淡入。
  • 低音音量CV = (t > 274320 && !S) * .5 * (!IS_SILENT),在特定时间点切入。

4. 完整源代码

javascript 复制代码
d=1714.5,D=0,T=t,
MAX_T = 25000000,
IS_SILENT = t > MAX_T,
t?(t/=6,
  R=(0|t/d)%8,
  S=R>6,
  EqT=p=>32/d*round(d/32*2**(p/12-.02)),
  c=int((t+random()*D)/d)%8,
  M=EqT([5,10,12,17,20,24,27,32][c])*(!S)*(!IS_SILENT),
  M2=EqT([-7,-4,0,3,5,10,12,15][c])*(!S)*(!IS_SILENT),
  C=8*EqT([12,12,12,15,10,10,10,3,5,5,5,5,8,8,8,5,10,10,10,10,8,8,8,3,5,5,5,5,8,8,8,10][int((t+d*32+random()*D)/d/2)%32])*(!S)*(!IS_SILENT),
  MV=t<54864?t/128E3:.42,
  MV2=(t>164592&&t<219456?(t-164592)/128E3:.42)*(!S)*(!IS_SILENT),
  CV=(t>274320&&!S)*.5*(!IS_SILENT),
  ev=(abs(t*M/8%4-2)-1)*MV + (abs(t*M2/8%4-2)-1)*MV2/2 + t*C%256*CV/192 -.5 + a[T%n],
  a[T%n]+=ev,
  a[T%n]/=3,
  IS_SILENT ? 0 : ev/2
):(
  a=Array(n=round(d*6*1.5)).fill(0)
)

5. 已知问题与未来工作

5.1 已知问题

  • 宏观休止未实现:当前仅实现每周期的微观休止,缺少基于绝对时间的结构性静音(例如约 1:30 和 2:25 处的休止)。
  • 缺少钢琴音色层:原曲中的钢琴音色尚未合成。
  • 缺少弦乐渐强:原曲中的弦乐 crescendo 段落缺失。

5.2 未来工作计划

  • 实现基于绝对时间的结构性静音。
  • 添加第二遍合成通道,生成钢琴音色。
  • 重构音高数组,使其完全匹配 E 小调音阶的标准频率。
  • 优化代码结构,提高可读性与可维护性。

6. 运行与调试说明

将上述完整代码复制到 Dollchan Bytebeat Composer 的 JS-big 模式编辑器中,点击播放即可听到合成效果。注意调整浏览器音频上下文,避免自动暂停。

开发时建议:

  1. 使用 console.log 输出关键变量(如 R, S, M)以调试时序逻辑。
  2. 逐步注释掉 IS_SILENT 或音量包络,单独聆听每个声部。
  3. 尝试修改 d(基础速度除数)、延迟反馈系数(当前为 3)或音高数组,探索不同听感。
相关推荐
竹之却4 个月前
[特殊字符] PCL2单机世界转Paper/插件服 完整替换教程
我的世界·minecraft·存档·插件服
竹之却4 个月前
【Minecraft】无法连接至服务器,登录失败:无效会话(请尝试重启游戏及启动器)
运维·服务器·游戏·我的世界·minecraft
竹之却4 个月前
【Minecraft】我的世界 Windows 开服,内网穿透教程
frp·内网穿透·我的世界·minecraft·樱花穿透·sakurafrp·我的世界开服
wind_20676 个月前
Minecraft模组光影材质安装[纯净]
我的世界·minecraft
小草cys1 年前
Minecraft 1.18.2 或更高版本(如1.19.2、1.20.1)选择模组mod加载器
mod·minecraft
iCan_qi1 年前
【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
运维·服务器·macos·minecraft
zeruns8022 年前
如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程
android·java·智能手机·minecraft·mc
zeruns8022 年前
我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程
linux·运维·redis·fabric·我的世界·minecraft
BohouZhang2 年前
使用docker部署在MacOS上部署minecraft服务器
服务器·docker·minecraft