跳到主要内容
RHYTHM GAME / 音乐 · 音游

霓虹音游(NEON PULSE)

参考 Phigros 玩法的浏览器音游,点开就能玩。音乐全部由内置合成器实时生成(无版权问题),谱面从音乐事件表派生——所以画面和声音是同一份数据的两个投影,音画同步是结构性保证,不存在对轴问题。零依赖、零构建。

玩法​

  • 2K – 12K 任意键数,键位为 Phigros 式家用布局(S D F J K L 等),按曲目难度自己选
  • 点按 / 长按 / 双押:长按条按住到消失为止,同一时刻多个 note 就是双押(两根手指同时按)
  • ESC / P 暂停继续,R 重开本曲;暂停菜单里可开自动演示预览谱面
  • 切到后台自动暂停,回来不会攒一堆 MISS

判定​

判定分数权重标准窗口
PERFECT100%±45ms
GREAT65%±90ms
GOOD30%±135ms
MISS0%断连击

设置里可切 严格 / 标准 / 宽松 三档窗口,满分 1,000,000 分。生命值归零判 Failed(可在设置里关掉)。成绩按 歌曲 + 难度 + 键数 分别记录。

内置曲目​

曲目BPM调式风格
Neon Drive 霓虹夜驰128A 自然小调Synthwave
Crystal Rain 水晶雨落138C 大调明快流行
Void Runner 虚空疾行148E 弗里几亚Dark / DnB

每首约 66–76 秒,结构为 intro → verse → build → drop → break → drop2 → outro。

谱面生成​

难度控制三件事:底鼓落点、参与的乐器、密度上限。

EASYNORMALHARD
底鼓1、3 拍1、3 拍每拍
参与乐器底鼓/军鼓/主旋律/琶音(稀疏)+ 踩镲(四分)/琶音(四分)+ 踩镲(八分)/琶音(八分)
双押比例18%22%32%
密度上限5 note/s6 note/s7.8 note/s

密度上限是硬保证:网格固定在十六分音符上,靠最小间隔限不住,所以额外加了一层滑动窗口——任何 1 秒窗口内不超过上限,超了就丢掉窗口里优先级最低的那个 note(双押整组一起删)。轨道分配用贪心打分:避免刚用过的轨道、优先左右手交替,多押以中心为基准向外对称展开。

导入自己的歌​

设置页 → 导入本地音频,自动扒谱:

  1. 下混单声道 → 512 采样窗的 RMS 包络 → 正向差分得到「新颖度」信号
  2. 节拍检测:归一化自相关 tempogram + 对数高斯先验(120BPM)找基线周期,再在 0.5×/1×/2× 三个倍频候选里用「拍点网格信息量」决胜
  3. 自适应阈值找起音点,量化到十六分网格;能量持续则转成长按

支持浏览器能解码的格式(mp3 / wav / ogg / m4a 等)。导入的曲目只存在于当前标签页,刷新后需重新导入。

延迟校准​

设置 → 开始延迟校准 → 跟着节拍敲 20 次空格,会算出平均偏移和离散度并写入设置。以 AudioContext.currentTime 为基准记录敲击与已调度节拍的时间差,包含了音频输出延迟,补偿的是你实际感知到的延迟。觉得偏早/偏晚也可以直接拖滑块。

触屏​

手机 / 平板直接用手指点轨道就能玩:

  • 判定区域是屏幕高度 22% 以下整条轨道,上方留白防误触
  • 判定用 PointerEvent.timeStamp(硬件时间戳)而非事件处理时刻,触屏判定不吃「一帧」的亏
  • 竖屏判定线压到 70%(拇指舒适区),横屏 58%,平板 62%;场地宽度、按键高度、note 尺寸、HUD 字号同步变化
  • 只认「主指针是触摸」的设备,触屏笔记本仍走桌面布局
  • 点按目标 ≥ 44px,env(safe-area-inset-*) 避让刘海与 home indicator

触摸输入延迟一般比键盘大,觉得判定偏可以先跑一次延迟校准,或把判定窗口调成宽松。

技术实现​

  • 纯静态 — 原生 HTML/CSS/JavaScript,无依赖、无构建,零版权风险
  • 作曲 — 给定调式、和弦进行和段落结构,用固定种子 PRNG 生成一整张音符事件表(时间/时值/音高/力度)
  • 合成 — 事件表交给前瞻调度器(25ms 轮询、280ms 预排),Web Audio 振荡器 + 合成器包络实时发声,主总线接压缩器 + 生成式混响 + 反馈延迟
  • 谱面 — 从同一张事件表派生(见上)
  • 渲染 — Canvas 场地 / note / 特效 / 背景,下落速度 0.4×–2.2×,背景亮度与泛光可调(低配可关)
  • 状态持久化 — 设置与成绩存 localStorage