SpessaSynth is a SoundFont2-based real-time synthesizer and MIDI library written in vanilla JavaScript. It’s a powerful and versatile library that allows you to:
- Play MIDI files using SF2/SF3/DLS files
- Write MIDI files
- Write SF2/SF3 files
- Convert DLS to SF2 (and back)
- and more!
npm install --save spessasynth_lib
This repository contains both the library and a complete musical web application. See below:
A flexible, powerful, and feature-packed SoundFont synthesizer library for the WebAudio API. Comes with the ability to edit MIDIs and SoundFonts!
- 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 dependencies: batteries included!
- Suitable for both real-time and offline synthesis
- Excellent SoundFont support:
- Full Generator Support
- Full Modulator Support: First (to my knowledge) JavaScript SoundFont synth with that feature!
- GeneralUserGS Certified: See more here!
- SoundFont3 Support: Play compressed SoundFonts!
- Experimental SF2Pack Support: Play soundfonts compressed with BASSMIDI! (Note: only works with vorbis compression)
- Can load very large SoundFonts: up to 4GB! Note: Only Firefox handles this well; Chromium has a hard-coded memory limit
- Soundfont manager: Stack multiple soundfonts!
- DLS Level 1 and 2 Support: works with gm.dls!
- Reverb and chorus support: customizable!
- Export audio files using OfflineAudioContext
- Custom modulators for additional controllers: Why not?
- Written using AudioWorklets:
- Runs in a separate thread for maximum performance
- Supported by all modern browsers
- Unlimited channel count: Your CPU is the limit!
- Excellent MIDI Standards Support:
- MIDI Controller Support: Default supported controllers here
- MIDI Tuning Standard Support: more info here
- Full RPN and limited NRPN support
- Supports some Roland GS and Yamaha XG system exclusives
- High-performance mode: Play Rush E! note: may kill your browser ;)
- Supports MIDI formats 0, 1, and 2: note: format 2 support is experimental as it's very, very rare
- Multi-Port MIDI support: More than 16 channels!
- Smart preloading: Only preloads the samples used in the MIDI file for smooth playback (down to key and velocity!)
- Lyrics support: Add karaoke to your program!
- Raw lyrics available: Decode in any encoding! (Kanji? No problem!)
- Runs in Audio Thread as well: Never blocks the main thread
- Loop points support: Ensures seamless loops
- Smart name detection: Handles incorrectly formatted and non-standard track names
- Raw name available: Decode in any encoding! (Kanji? No problem!)
- Port detection during load time: Manage ports and channels easily!
- Used channels on track: Quickly determine which channels are used
- Key range detection: Detect the key range of the MIDI
- Easy MIDI editing: Use helper functions to modify the song to your needs!
- Loop detection: Automatically detects loops in MIDIs (e.g., from Touhou Project)
- First note detection: Skip unnecessary silence at the start by jumping to the first note!
- Write MIDI files from scratch
- Easy saving: Save with just one function!
Read and write RMID files with embedded SF2 soundfonts
- Level 4 compliance: Reads and writes everything!
- Compression and trimming support: Reduce a MIDI file with a 1GB soundfont to as small as 5MB!
- DLS Version support: The original legacy format with bank offset detection!
- Automatic bank shifting and validation: Every soundfont just works!
- Metadata support: Add title, artist, album name and cover and more! And of course read them too! (In any encoding!)
- Compatible with Falcosoft Midi Player 6!
- Easy saving: As simple as saving a MIDI file!
- Easy info access: Just an object of strings!
- Smart trimming: Trim the SoundFont to only include samples used in the MIDI (down to key and velocity!)
- sf3 conversion: Compress SoundFont2 files to SoundFont3 with variable quality!
- Easy saving: Also just one function!
- Same features as SoundFont2 but with now with Ogg Vorbis compression!
- Variable compression quality: You choose between file size and quality!
- Compression preserving: Avoid decompressing and recompressing uncompressed samples for minimal quality loss!
- Read DLS (DownLoadable Sounds) files as SF2 files!
- Works like a normal soundfont: Saving it as sf2 is still just one function!
- Converts articulators to both modulators and generators!
- Works with both unsigned 8-bit samples and signed 16-bit samples!
- Covers special generator cases: such as modLfoToPitch!
- Correct volume: looking at you, Viena and gm.sf2!
- Support built right into the synthesizer!
- Convert SF2 to DLS: with limitations;
- Save the MIDI file as WAV audio!
- Metadata support: Embed metadata such as title, artist, album and more!
- Cue points: Write MIDI loop points as cue points!
- Loop multiple times: Render two (or more) loops into the file for seamless transitions!
- That's right, saving as WAV is also just one function!
- Synth's performance may be suboptimal, especially on mobile devices.
- SF2 to DLS Conversion
- Audio may sometimes sound distored in Chrome, Edge, Brave, etc. due to a Chromium Bug. I can't do anything about it, only hope that it gets fixed.
npm install --save spessasynth_lib
- Clone this repository.
- Copy
src/spessasynth_lib
to your project. - Use the library
Tip
Looking for a Node.js version? Try spessasynth_core!
The complete GUI for spessasynth_lib, allowing remixing, experimenting, and playing MIDIs in the coolest way possible.
- Visualization of the played sequence: with cool effects like visual pitch bend and note-on effects!
- Playable keyboard with various sizes: mobile friendly!
- Integrated controller for the synthesizer with numerous options: Edit instruments, controllers, and more!
- Lyrics support: Karaoke!
- Music player mode: with support for album covers in .rmi files!
- Mobile-friendly UI (synthesizer performance not optimized for mobile... don't tell anyone!)
- Multiple language support:
- English
- Polish
- Japanese
- French (translated by Davy Triponney)
- Portugese (translated by Lucas Gabriel)
- Custom locale management system, created specifically for this project
- Description of buttons: Hover over the buttons to see what they do!
Web MIDI API
support: Use your physical MIDI devices!- WebMidiLink support
- Numerous exporting options:
- Render the MIDI file (modified or unmodified) to .wav
- Render each channel as a separate .wav file
- Export the modified MIDI file to .mid
- Export the trimmed SoundFont to .sf2
- Export a DLS file to .sf2
- Export an SF2 file to .dls
- Or compress it as .sf3!
- Bundle both as .rmi with metadata such as album cover!
- Comes bundled with a compressed GeneralUser GS SoundFont to get you started
- No additional dependencies!
Local edition comes with easier soundfont management than the demo version.
Important
Firefox is recommended for large SoundFonts due to memory constraints. A decent computer is also recommended for handling large SoundFonts.
Recommended high-quality SoundFont (better than the built-in one)
Local Edition requires Node.js
- Download the code as a ZIP file and extract, or use
git clone https://github.com/spessasus/SpessaSynth
. - Put your SoundFonts into the
soundfonts
folder (you can select SoundFonts in the program). - Double-click
start.bat
. - Enjoy!
- Clone the repository:
git clone https://github.com/spessasus/SpessaSynth cd SpessaSynth npm start
- Put your SoundFonts into the
soundfonts
folder (you can select SoundFonts in the program). - Enjoy!
If you would like to help translate SpessaSynth, please read this guide (and thank you!)
If you like this project, consider giving it a star. It really helps out!
- Improve the performance of the worklet system
- Potentially port the worklet system to Emscripten
- Enhance the built-in chorus and reverb effects (suggestions welcome!)
- 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
- OggVorbisEncoder - for the MIT Vorbis encoder
- Composers - for the demo songs
- Falcosoft - for help with the RMIDI format
- Christian Collins - for the bundled GeneralUserGS soundfont and various bug reports regarding the synthesizer
- And You! - for checking out this project. I hope you like it :)
- 0.0.1 - Initial release
- 1.0.0 - Removed the 2-sample limit
- 2.0.0 - Implemented the worklet system and added support for modulators
- 3.0.0 - Moved to audioWorkletGlobalScope for offline audio rendering
Copyright © 2024 Spessasus. Licensed under the MIT License.
Important
Please note that the bundled stbvorbis_sync.js is licensed under the Apache-2.0 license.
The license and the file can be found in the externals
folder in the spessasynth_lib directory.