该技能用于设计一套紧凑、具有年代真实感的街机音效套件,并验证其始终保持在“事件音效”层面,而不会演变成背景音乐。它假设采用事件边界架构:游戏逻辑发出抽象事件名,独立的音频层将每个事件解析为一个程序并播放。
核心规则
事件边界。游戏代码发出抽象事件名(例如 emit("laser"));它从不直接实例化或调用合成器。音频层负责事件到程序的映射与播放。
从玩法时刻出发设计,而非从合成器预设出发。先列出玩家必须听到的时刻,再决定哪些需要声音。
将每个时刻分类为音效、短过场音乐或不加声音。不要为每个状态转换都配声音。
音效 = 短促、重复的玩法反馈:玩家动作(射击、冲刺、放置、旋转、确认)、结果(命中、格挡、收集、未命中、分裂、占领)、警告(计时不足、附近威胁、无效操作),以及影响玩法的环境事件(生成、波次推进)。
短过场音乐 = 罕见的、应被听作乐句的状态变化:开始/准备、奖励或重大奖励、波次/关卡通过、危险进入新阶段、最终未命中/游戏结束。
在高负载下保持可辨识。当多个音效在同一帧触发时,重复音效之间必须保持区分;罕见的短过场音乐不得掩盖玩家控制的反馈。
在编写每个声音前,先写一行声音目标(例如 // 波次通过:上升的 5 音玻璃质感琶音)。按目标创作,而非按合成器恰好产生的结果创作。
每款游戏的独立身份。每款游戏自带一套音效套件;不要原样复用示例套件,变体应来自你自己的程序,而非另一款游戏的。
时代真实性。通过一条固定且限幅的主链路,重组固定的基础原语集合(振荡器、LFSR/金属噪声、失真、位压缩)。不新增合成原语、不采样、不做长篇现代曲目。正是这条固定主链路,无论套件如何构建,都能保持“1980 主板”的特征。
工作流
从游戏设计中列出玩家必须听到的时刻。
将每个时刻分类为音效/短过场音乐/无。
为每个选中的声音写一行声音目标。
选择事件名:在合适时复用共用的街机词汇(coin/start/hit/warning/jingle:bonus);当游戏特定名称(gun:fire、window:clean)能让代码更清晰时使用它们,并通过别名映射到本地程序。
用基础原语集合创作每个程序;为套件设定限幅的主音色。
在完成前,依据下方的预算与响度检查进行验证。
验证(必需)
只有通过以下检查,音效套件才算完成:
预算,由自动化测试强制执行。限制音效与短过场音乐的长度和步数,使音效不会漂移成背景音乐。起始上限:音效 <= 约 0.6 秒,短过场音乐 <= 约 1.6 秒,每个程序 <= 约 24 步。将其接入测试套件,而不仅是手动检查。
相对响度。在同一套件内,针对同级事件调校每个音效,而非孤立调校。前景动作(射击、命中、警告)在游玩过程中必须保持可辨识;街机提示音(投币/开始/游戏结束)略靠后于前景玩法。最频繁的反馈声音(拾取、脚步、射击)最常被掩盖:直接将其与它播放时所处的音乐或引擎底噪比较,若仅靠电平无法从底噪中清晰分离,就给它独立的音区。
演示/吸引模式静音。吸引模式的声音传递演示标志(或等效机制),以便被演示声音设置抑制。
输出电平,需测量。通过真实输出链路渲染或捕获每个声音并检查其峰值;一套普通声音峰值仅为满刻度几个百分点的套件是听不见的,保守的主增益通常是原因。将最响的事件瞄准削波上限附近但低于上限,并让其他事件在其下方各就其位。用作限幅器的动态压缩器会比对长音更多地压制短音;通过它测量,或使用只圆化峰值的削波器。
音高集合。当游戏同时有音乐时,逐个事件决定其是否意在音乐调内。标记那些在调内的(通常是频繁的反馈与奖励声音),并断言其音高(包括链路或电平变体)属于该音阶;按固定音程上升的步进会无意中偏离调性,因此应让这类声音沿音阶步进。不谐和、半音上升和警报是合理的选择:将其声明为有意例外并附一行理由,而非强行纳入音阶。测试捕获的是未声明的冲突,而非有意为之的冲突。
安全。对于激进的失真/噪声程序,以低扬声器/耳机音量试听。安全决定你如何聆听,而非套件有多安静。
参考资料
references/sound-kit-reference.md — 音效与短过场音乐对照表、起始响度范围、预算上限,以及一个广义的完整套件示例。在创作套件时阅读。
references/reference-implementation.md — 事件边界运行时的一个具体实现(四层结构、程序即数据、固定限幅主链路、总线级防护、模拟适配器测试、数据驱动验证)。在构建或评估播放套件的系统时阅读,而非在创作单个套件时阅读。