
Generating Sounds With Ai
- 120 installs
- 32 repo stars
- Updated March 17, 2026
- raphaelsalaja/skill
Audit Web Audio API and procedural UI sound code so synthesis stays performant, musical, and browser-safe before you ship.
About
Generating Sounds with AI is a checker skill for solo builders shipping web apps, games, or extensions that use procedural UI audio. Install it when you or your agent need a structured pass over Web Audio API usage—shared AudioContext lifecycle, envelopes, oscillator design, and parameter sweeps—instead of subjective listening alone. The workflow reads target files (or asks you for paths), applies four prefixed rule families, and emits actionable file:line violations with pass/fail examples in the skill doc. It suits intermediate front-end devs who already wrote synthesis code and want review parity before merge. It does not generate sample libraries or replace a sound designer; it enforces best practices for in-browser synthesis. Pair it with implementation work in the Build phase, then run it again in Ship before release.
- Reviews Web Audio API code and returns findings in file:line format
- 4 prioritized rule categories: Context Management, Decay & Envelope, Sound Design, Parameters
- Context rules enforce single AudioContext reuse and resume-before-play
- Envelope and parameter rules catch clicks, runaway oscillators, and harsh transients
- Use when implementing UI sounds or auditing procedural audio in TypeScript/JavaScript
Generating Sounds With Ai by the numbers
- 120 all-time installs (skills.sh)
- +8 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #419 of 1,352 Code Review & Quality skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/raphaelsalaja/skill --skill generating-sounds-with-aiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 120 |
|---|---|
| repo stars | ★ 32 |
| Security audit | 3 / 3 scanners passed |
| Last updated | March 17, 2026 |
| Repository | raphaelsalaja/skill ↗ |
What it does
Audit Web Audio API and procedural UI sound code so synthesis stays performant, musical, and browser-safe before you ship.
Files
Generating Sounds with AI
Review Web Audio API code for sound synthesis best practices.
How It Works
1. Read the specified files (or prompt user for files/pattern) 2. Check against all rules below 3. Output findings in file:line format
Rule Categories
| Priority | Category | Prefix |
|---|---|---|
| 1 | Context Management | context- |
| 2 | Decay & Envelope | envelope- |
| 3 | Sound Design | design- |
| 4 | Parameters | param- |
Rules
Context Management Rules
context-reuse-single
Reuse a single AudioContext instance; do not create new ones per sound.
Fail:
function playSound() {
const ctx = new AudioContext();
// Creates new context every call
}Pass:
let audioContext: AudioContext | null = null;
function getAudioContext(): AudioContext {
if (!audioContext) {
audioContext = new AudioContext();
}
return audioContext;
}context-resume-suspended
Check and resume suspended AudioContext before playing.
Fail:
function playSound() {
const ctx = getAudioContext();
// Plays immediately without checking state
}Pass:
function playSound() {
const ctx = getAudioContext();
if (ctx.state === "suspended") {
ctx.resume();
}
}context-cleanup-nodes
Disconnect and clean up audio nodes after playback.
Fail:
source.start();
// Nodes remain connected after sound endsPass:
source.start();
source.onended = () => {
source.disconnect();
gain.disconnect();
};Envelope Rules
envelope-exponential-decay
Use exponential ramps for natural decay, not linear.
Fail:
gain.gain.linearRampToValueAtTime(0, t + 0.05);Pass:
gain.gain.exponentialRampToValueAtTime(0.001, t + 0.05);envelope-no-zero-target
Exponential ramps cannot target 0; use 0.001 or similar small value.
Fail:
gain.gain.exponentialRampToValueAtTime(0, t + 0.05);Pass:
gain.gain.exponentialRampToValueAtTime(0.001, t + 0.05);envelope-set-initial-value
Set initial value before ramping to avoid glitches.
Fail:
gain.gain.exponentialRampToValueAtTime(0.001, t + 0.05);
// No setValueAtTime before rampPass:
gain.gain.setValueAtTime(0.3, t);
gain.gain.exponentialRampToValueAtTime(0.001, t + 0.05);Sound Design Rules
design-noise-for-percussion
Use filtered noise for clicks/taps, not oscillators.
Fail:
// Click sound using sine oscillator
const osc = ctx.createOscillator();
osc.type = "sine";
// Results in tonal "beep" not "click"Pass:
// Click sound using noise burst
const buffer = ctx.createBuffer(1, ctx.sampleRate * 0.008, ctx.sampleRate);
const data = buffer.getChannelData(0);
for (let i = 0; i < data.length; i++) {
data[i] = (Math.random() * 2 - 1) * Math.exp(-i / 50);
}design-oscillator-for-tonal
Use oscillators with pitch movement for tonal sounds (pops, confirmations).
Fail:
// Confirmation sound using static frequency
osc.frequency.value = 400;Pass:
// Confirmation sound with pitch sweep
osc.frequency.setValueAtTime(400, t);
osc.frequency.exponentialRampToValueAtTime(600, t + 0.04);design-filter-for-character
Apply bandpass filter to shape percussive sounds.
Fail:
// Raw noise without filtering
source.connect(gain).connect(ctx.destination);Pass:
const filter = ctx.createBiquadFilter();
filter.type = "bandpass";
filter.frequency.value = 4000;
filter.Q.value = 3;
source.connect(filter).connect(gain).connect(ctx.destination);Parameter Rules
param-click-duration
Click/tap sounds should be 5-15ms duration.
Fail:
const buffer = ctx.createBuffer(1, ctx.sampleRate * 0.1, ctx.sampleRate);
// 100ms is too long for a clickPass:
const buffer = ctx.createBuffer(1, ctx.sampleRate * 0.008, ctx.sampleRate);
// 8ms is appropriate for a clickparam-filter-frequency-range
Bandpass filter for clicks should be 3000-6000Hz.
Fail:
filter.frequency.value = 500; // Too low, sounds muffledPass:
filter.frequency.value = 4000; // Crisp, presentparam-reasonable-gain
Gain values should not exceed 1.0 to prevent clipping.
Fail:
gain.gain.setValueAtTime(1.5, t);Pass:
gain.gain.setValueAtTime(0.3, t);param-q-value-range
Filter Q for clicks should be 2-5 for focused but not harsh sound.
Fail:
filter.Q.value = 15; // Too resonant, harshPass:
filter.Q.value = 3; // Focused but naturalOutput Format
When reviewing files, output findings as:
file:line - [rule-id] description of issue
Example:
lib/sounds.ts:23 - [envelope-exponential-decay] Using linearRampToValueAtTime instead of exponential
lib/sounds.ts:45 - [context-reuse-single] Creating new AudioContext on each callSummary Table
After findings, output a summary:
| Rule | Count | Severity |
|---|---|---|
context-reuse-single | 1 | HIGH |
envelope-exponential-decay | 3 | MEDIUM |
param-click-duration | 1 | LOW |
Parameter Translation Table
When user describes issues, translate to parameter changes:
| User Says | Parameter Change |
|---|---|
| "too harsh" | Lower filter frequency, reduce Q |
| "too muffled" | Higher filter frequency |
| "too long" | Shorter duration, faster decay |
| "cuts off abruptly" | Use exponential decay |
| "more mechanical" | Higher Q, faster decay |
| "softer" | Lower gain, triangle wave |
References
Related skills
FAQ
Is Generating Sounds With Ai safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.