npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@8bitforge/chiptune-synth

v2.0.1

Published

8-bit chiptune synthesizer — zero dependencies, 4 tracks, 12 instruments, 10 SFX presets, MIDI support, unison, filters, LFOs. Retro game audio in 3 lines of code.

Readme

ChiptuneSynth

Retro game audio in 3 lines of code.

npm license size deps

A zero-dependency Web Audio synthesizer with serious chiptune capabilities. 4 tracks, 12 instrument presets, 10 game SFX presets, unison voices, 3 LFOs, per-track filters, pitch bend, glide, and full MIDI controller support. Works in any browser.

const synth = new ChiptuneSynth();
await synth.init();
synth.playPreset('coin');  // ding!

Features

  • 4 Tracks — Lead (square), Bass (triangle), Drums (noise/sine), FX (sawtooth)
  • 12 Instrument Presets — Piano, Violin, Cello, Flute, Organ, Brass, Harmonica, Synth Lead, Synth Pad, Synth Bass, Marimba, Electric Guitar
  • 10 Game SFX Presets — laser, coin, jump, explosion, powerup, hit, blip, bass, shoot, 1up
  • 5 Waveforms — Square (PWM), Triangle, Sawtooth, Sine, Noise
  • ADSR Envelopes — Per-track attack, decay, sustain, release
  • Unison Voices — 1-16 voices per track with detune & stereo spread
  • 3 LFOs per Track — Filter LFO, tremolo LFO, vibrato
  • Per-track Filters — Lowpass/highpass/bandpass with cutoff, resonance, key tracking, and filter envelope
  • Glide / Portamento — Smooth pitch transitions between notes
  • Pitch Bend & Mod Wheel — Real-time performance controls
  • MIDI Controller Support — Plug in your MIDI keyboard and play (Web MIDI API)
  • Waveform Visualization — Analyser data for canvas rendering
  • Zero Dependencies — Pure Web Audio API, ~15KB
  • Universal — UMD module (Node.js, AMD, browser global)

Install

npm:

npm install @8bitforge/chiptune-synth

CDN:

<script src="https://unpkg.com/@8bitforge/chiptune-synth"></script>

Direct:

<script src="path/to/chiptune-synth.js"></script>

ES Module / CommonJS:

import ChiptuneSynth from '@8bitforge/chiptune-synth';
// or
const ChiptuneSynth = require('@8bitforge/chiptune-synth');

Quick Start

Play a game SFX

const synth = new ChiptuneSynth();
await synth.init();
synth.playPreset('laser');

Load an instrument and play notes

synth.loadInstrument('violin', 0);  // Load violin on track 0
synth.playNoteByName('A', 4, 0, 1.5);  // Play A4 for 1.5s

Enable MIDI controller

const devices = await synth.enableMIDI({
    track: 0,
    onConnect: (name) => console.log('Connected:', name),
    onNoteOn: (note, vel) => console.log('Note on:', note)
});

API Reference

Lifecycle

| Method | Description | |--------|-------------| | new ChiptuneSynth() | Create a synth instance | | synth.init() | Initialize audio engine (async, call after user gesture) | | synth.dispose() | Release all audio resources | | synth.resetToDefaults() | Reset all tracks to factory settings |

Playing Notes

| Method | Description | |--------|-------------| | synth.playNote(freq, track, duration?, startTime?) | Play a note by frequency (Hz). Returns noteId | | synth.playNoteByName(note, octave, track, duration?) | Play by name (e.g. 'C#', 5). Returns noteId | | synth.stopNote(noteId) | Stop a sustained note | | synth.stopAllNotes() | Emergency stop |

Sustained notes: Pass duration >= 10 to hold a note indefinitely. Stop it later with stopNote(noteId).

SFX Presets

| Method | Description | |--------|-------------| | synth.playPreset(name) | Load preset + play it in one call | | synth.loadPreset(name) | Load preset config without playing | | ChiptuneSynth.getPresetNames() | Get array of all preset names |

Instrument Presets

| Method | Description | |--------|-------------| | synth.loadInstrument(name, trackIndex) | Load an instrument preset onto a track | | ChiptuneSynth.getInstrumentNames() | Get array of all instrument names | | ChiptuneSynth.getInstruments() | Get full instrument definitions object |

MIDI

| Method | Description | |--------|-------------| | synth.enableMIDI(options?) | Enable MIDI input. Returns Promise<string[]> (device names) | | synth.disableMIDI() | Disconnect all MIDI inputs | | synth.setMIDITrack(trackIndex) | Change which track MIDI controls | | synth.setMIDIChannel(ch) | Set MIDI channel filter (0-15, default 0) | | synth.isMIDIEnabled() | Check if MIDI is active |

enableMIDI options:

synth.enableMIDI({
    track: 0,         // Target track index (default: 0)
    channel: 0,       // MIDI channel 0-15 (default: 0)
    onConnect: (name) => {},     // Device connected
    onDisconnect: (name) => {},  // Device disconnected
    onNoteOn: (note, velocity, channel) => {},
    onNoteOff: (note, channel) => {},
    onCC: (cc, value, channel) => {}
});

Supported MIDI messages:

  • Note On / Note Off (velocity-sensitive)
  • CC1 — Mod Wheel (adds vibrato depth)
  • CC7 — Volume
  • CC64 — Sustain pedal
  • CC120 — All Sound Off
  • CC123 — All Notes Off
  • Pitch Bend (±1 semitone range)

Auto-init: The AudioContext initializes automatically on the first MIDI note, no need to call init() separately when using MIDI.

Configuration

| Method | Description | |--------|-------------| | synth.updateTrack(i, settings) | Merge partial settings into track config | | synth.updateEnvelope(i, env) | Merge partial ADSR into envelope | | synth.updateVibrato(i, vib) | Update vibrato { rate, depth } | | synth.setMasterVolume(vol) | Set master volume (0-1) | | synth.getMasterVolume() | Get current master volume | | synth.getWaveformData() | Get Uint8Array waveform for visualization |

Track properties: type, volume, dutyCycle, pitchEnv, glide, detune

Modulation properties (via updateTrack):

  • unisonVoices, unisonDetune, unisonSpread
  • filterEnabled, filterType, filterCutoff, filterQ, filterKeyTrack
  • filterEnvAmount, filterEnvAttack, filterEnvRelease
  • lfoFilterRate, lfoFilterDepth, tremoloRate, tremoloDepth

Envelope properties: attack, decay, sustain, release

Static Utilities

| Method | Description | |--------|-------------| | ChiptuneSynth.noteToFrequency(note, octave) | 'A', 4440 | | ChiptuneSynth.midiToFrequency(midi) | 69440 | | ChiptuneSynth.frequencyToMidi(freq) | 44069 | | ChiptuneSynth.TRACK_NAMES | ['Lead', 'Bass', 'Drums', 'FX'] |

Tracks

| # | Name | Default Waveform | Default Volume | |---|------|-----------------|----------------| | 0 | Lead | Square (50% duty) | 0.30 | | 1 | Bass | Triangle | 0.40 | | 2 | Drums | Noise | 0.50 | | 3 | FX | Sawtooth | 0.25 |

Instrument Presets

| Instrument | Waveform | Unison | Filter | Character | |------------|----------|--------|--------|-----------| | piano | Triangle | 2 voices | LP 6kHz | Bright percussive keys | | violin | Sawtooth | 2 voices | LP 5kHz | Expressive bowed strings | | cello | Sawtooth | 2 voices | LP 3kHz | Deep warm strings | | flute | Sine | 1 voice | Off | Airy with tremolo | | organ | Square | 3 voices | LP 8kHz | Full drawbar sound | | brass | Sawtooth | 2 voices | LP 2.5kHz | Punchy with filter sweep | | harmonica | Square | 1 voice | LP 4kHz | Reedy vibrato tone | | synthLead | Square | 4 voices | LP 4kHz | Fat detuned lead | | synthPad | Sawtooth | 8 voices | LP 3.5kHz | Lush evolving pad | | synthBass | Sawtooth | 2 voices | LP 1.2kHz | Squelchy acid bass | | marimba | Sine | 1 voice | Off | Woody percussive mallet | | electricGuitar | Square | 3 voices | LP 3.5kHz | Overdriven crunch |

Game SFX Presets

| Preset | Track | Description | |--------|-------|-------------| | laser | FX | Fast descending square zap | | coin | Lead | Classic collect-item ding | | jump | Drums | Short pitch-up bloop | | explosion | Drums | Noise burst with slow decay | | powerup | FX | Rising sweep with vibrato | | hit | Drums | Quick damage impact | | blip | Lead | Tiny menu select beep | | bass | Bass | Deep triangle thump | | shoot | FX | Pew-pew descending shot | | 1up | Lead | 3-note extra life arpeggio |

Examples

  • Interactive Demo — Full synth with piano keyboard, instruments, MIDI, and waveform visualizer
  • Getting Started — Step-by-step tutorial with runnable code snippets
  • Basic — Waveforms, chords, unison voices, and LFOs
  • Game SFX — All 10 SFX presets as clickable cards
  • Melodies — 4 playable songs with multi-track arrangements
  • Instruments — 12 instrument presets with keyboard, MIDI, and musical demos
  • Mini Game: Catcher — Coin-catcher game with real-time SFX
  • Mini Game: Platformer — Mario-style platformer with jump, coins, enemies
  • Soundboard — Tap pads with keyboard shortcuts + build custom sounds
  • Sound Design — Real-time parameter tweaking with waveform + FFT visualization
  • API Docs — Full technical documentation

Want More?

ChiptuneSynth Free is great for games, prototypes, and creative projects. Need a full DAW-grade audio engine?

| Feature | Free | 8BitForge Pro | |---------|:----:|:-------------:| | Tracks | 4 | 8 | | Instrument Presets | 12 | Unlimited | | SFX Presets | 10 | Unlimited | | Unison Voices (1-16) | ✓ | ✓ | | Per-track Filters & LFOs | ✓ | ✓ | | Glide / Portamento | ✓ | ✓ | | Pitch Bend / Mod Wheel | ✓ | ✓ | | MIDI Controller Support | ✓ | ✓ | | Mixer (EQ, Pan, Solo/Mute) | — | ✓ | | Effects (Delay, Reverb, Chorus) | — | ✓ | | FFT Analyser / Per-track Metering | — | ✓ | | Mastering Engine (Compressor, Limiter) | — | ✓ | | Export (WAV, MP3, OGG) | — | ✓ |

Get 8BitForge Pro →

License

ChiptuneSynth uses a dual license:

  • Non-Commercial — Free for personal projects, education, open-source, and game jams. Attribution required.
  • Commercial — Any project generating revenue requires a commercial license.

See LICENSE for full terms.


Built with care by 8Binami