Help us improve
Share bugs, ideas, or general feedback.
From game-creator
Implements procedural background music and sound effects for browser games using Web Audio API. Zero dependencies; use when adding BGM sequencers or SFX.
npx claudepluginhub playableintelligence/game-creator --plugin game-creatorHow this skill is triggered — by the user, by Claude, or both
Slash command
/game-creator:game-audio [topic][topic]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an expert game audio engineer. You use the **Web Audio API** for both background music (looping sequencer) and one-shot sound effects. Zero dependencies — everything is built into the browser.
Adds synthesized background music and sound effects to browser games using Web Audio API. Implements looping BGM sequencer and one-shot SFX with zero dependencies or audio files.
Game audio systems, music, spatial audio, sound effects, and voice implementation. Build immersive audio experiences with professional middleware integration.
Defines a game's sonic identity by building an audio bible at .summer/audio-bible.md. Pins music style, SFX vocabulary, dynamic music plan, and spatial/mix rules from reference tracks and art direction.
Share bugs, ideas, or general feedback.
You are an expert game audio engineer. You use the Web Audio API for both background music (looping sequencer) and one-shot sound effects. Zero dependencies — everything is built into the browser.
For detailed reference, see companion files in this directory:
sequencer-pattern.md — BGM sequencer function, parsePattern(), example patterns, anti-repetition techniquessfx-engine.md — playTone(), playNotes(), playNoise(), all SFX presetsmute-button.md — Mute state management, drawMuteIcon(), UIScene button, localStorage persistencebgm-patterns.md — Strudel BGM pattern examplesstrudel-reference.md — Strudel.cc API referencemixing-guide.md — Volume levels table and style guidelines per genre| Purpose | Engine | Package |
|---|---|---|
| Background music | Web Audio API sequencer | Built into browsers |
| Sound effects | Web Audio API one-shot | Built into browsers |
| Synths | OscillatorNode (square, triangle, sawtooth, sine) | — |
| Effects | GainNode, BiquadFilterNode, ConvolverNode, DelayNode | — |
No external audio files or npm packages needed — all sounds are procedural.
src/
├── audio/
│ ├── AudioManager.js # AudioContext init, BGM sequencer, play/stop
│ ├── AudioBridge.js # Wires EventBus → audio playback
│ ├── music.js # BGM patterns (sequencer note arrays)
│ └── sfx.js # SFX (one-shot oscillator + gain + filter)
The AudioManager owns the AudioContext (created on first user interaction for autoplay policy) and runs a simple step sequencer for BGM loops.
// AudioManager.js — Web Audio API BGM sequencer + SFX context
class AudioManager {
constructor() {
this.ctx = null;
this.currentBgm = null; // { stop() }
this.masterGain = null;
}
init() {
if (this.ctx) return;
this.ctx = new (window.AudioContext || window.webkitAudioContext)();
this.masterGain = this.ctx.createGain();
this.masterGain.connect(this.ctx.destination);
}
getCtx() {
if (!this.ctx) this.init();
return this.ctx;
}
getMaster() {
if (!this.masterGain) this.init();
return this.masterGain;
}
playMusic(patternFn) {
this.stopMusic();
try {
this.currentBgm = patternFn(this.getCtx(), this.getMaster());
} catch (e) {
console.warn('[Audio] BGM error:', e);
}
}
stopMusic() {
if (this.currentBgm) {
try { this.currentBgm.stop(); } catch (_) {}
this.currentBgm = null;
}
}
setMuted(muted) {
if (this.masterGain) {
this.masterGain.gain.value = muted ? 0 : 1;
}
}
}
export const audioManager = new AudioManager();
See sequencer-pattern.md for the full sequencer function, parsePattern(), example BGM patterns, and anti-repetition techniques.
See sfx-engine.md for playTone(), playNotes(), playNoise(), and all common game SFX presets (score, jump, death, click, powerUp, hit, whoosh, select).
import { eventBus, Events } from '../core/EventBus.js';
import { audioManager } from './AudioManager.js';
import { gameplayBGM, gameOverTheme } from './music.js';
import { scoreSfx, deathSfx, clickSfx } from './sfx.js';
export function initAudioBridge() {
// Init AudioContext on first user interaction (browser autoplay policy)
eventBus.on(Events.AUDIO_INIT, () => audioManager.init());
// BGM transitions
eventBus.on(Events.MUSIC_GAMEPLAY, () => audioManager.playMusic(gameplayBGM));
eventBus.on(Events.MUSIC_GAMEOVER, () => audioManager.playMusic(gameOverTheme));
eventBus.on(Events.MUSIC_STOP, () => audioManager.stopMusic());
// SFX (one-shot)
eventBus.on(Events.SCORE_CHANGED, () => scoreSfx());
eventBus.on(Events.PLAYER_DIED, () => deathSfx());
}
See mute-button.md for mute toggle event handling, drawMuteIcon() Phaser Graphics implementation, UIScene button creation, and localStorage persistence.
src/audio/AudioManager.js — AudioContext + sequencer + master gainsrc/audio/music.js — BGM patterns as note arrays + sequencer callssrc/audio/sfx.js — SFX using Web Audio API (oscillator + gain + filter)src/audio/AudioBridge.js — wire EventBus events to audioinitAudioBridge() in main.jsAUDIO_INIT on first user click (browser autoplay policy)MUSIC_GAMEPLAY, MUSIC_GAMEOVER, MUSIC_STOP at scene transitionsAUDIO_TOGGLE_MUTE event, UI button, M key shortcutAUDIO_INIT event handles this.gain.value = 0 mutes all audio instantly.For richer procedural BGM with pattern language support, you can optionally install @strudel/web:
npm install @strudel/web
Note: Strudel is AGPL-3.0 — projects using it must be open source. See strudel-reference.md and bgm-patterns.md in this directory for Strudel-specific patterns.
The Strudel upgrade replaces the Web Audio sequencer for BGM only. SFX always use Web Audio API directly.