Skip to content

spessasus/spessasynth_lib

Repository files navigation

SpessaSynth logo

A powerful SF2/DLS/MIDI JavaScript library for the browsers.

This is a WebAudioAPI wrapper for the spessasynth_core library.

It allows you to:

  • Play MIDI files using SF2/SF3/DLS files!
  • Read and write MIDI files!
  • Write SF2/SF3 files!
  • Convert DLS to SF2! (and back!)
  • and more!

The next major update (4.0) will include many breaking changes. The documentation will be updated when the update releases. The migration guide will be published here.

SpessaSynth Project index

TIP: Looking for a bare JS version that works without WebAudioAPI? Try spessasynth_core!

npm install --save spessasynth_lib

Made with spessasynth_lib

Basic example: play a single note

import { Synthetizer } from "spessasynth_lib"

const sfont = await (await fetch("soundfont.sf3")).arrayBuffer();
const ctx = new AudioContext();
// make sure you copied the worklet processor!
await ctx.audioWorklet.addModule("./worklet_processor.min.js");
const synth = new Synthetizer(ctx.destination, sfont);
document.getElementById("button").onclick = async () =>
{
    await ctx.resume();
    synth.programChange(0, 48); // strings ensemble
    synth.noteOn(0, 52, 127);
}

Audio may sometimes sound distorted in Chromium-based browsers: Chrome, Edge, Brave, etc. due to a Chromium Bug. I can't do anything about it, only hope that it gets fixed. Please consider voting for it on the bug tracker to get it fixed!

Current Features

On top of that...

  • Modular design: Easy integration into other projects (load what you need)
  • Detailed documentation: With examples!
  • Easy to Use: Basic setup is just two lines of code!
  • No external dependencies: Just spessasynth_core!
  • Reverb and chorus support: customizable!
  • Export audio files using OfflineAudioContext
  • Written using AudioWorklets:
    • Runs in a separate thread for maximum performance
    • Does not stop playing even when the main thread is frozen
    • Supported by all modern browsers
  • High-performance mode: Play Rush E! note: may kill your browser ;)

TODO

  • Enhance the built-in chorus and reverb effects (suggestions welcome!)

Special Thanks

  • FluidSynth - for the source code that helped implement functionality and fixes
  • Polyphone - for the soundfont testing and editing tool
  • Meltysynth - for the initial low-pass filter implementation
  • RecordingBlogs - for detailed explanations on MIDI messages
  • stbvorbis.js - for the Vorbis decoder
  • fflate - for the MIT DEFLATE implementation
  • foo_midi - for useful resources on XMF file format
  • Falcosoft - for help with the RMIDI format
  • Christian Collins - for various bug reports regarding the synthesizer
  • And You! - for checking out this project. I hope you like it :)

License

Copyright © 2025 Spessasus Licensed under the Apache-2.0 License.

SoundFont® is a registered trademark of Creative Technology Ltd.