SpessaSynth is a SoundFont2-based real-time synthesizer and MIDI player written in vanilla JavaScript. It’s a powerful library that allows you to read, write, or play MIDI files and read/write SF2/SF3 files with ease.
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:
- Generator Support
- Modulator Support: First (to my knowledge) JavaScript SoundFont synth with that feature!
- 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!
-
Reverb and chorus support: customizable!
-
Export audio files using OfflineAudioContext
-
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!
- 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!
- 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!
- Synth's performance may be suboptimal, especially on mobile devices.
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
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
-
- Or compress it as .sf3!
-
- Bundle both as .rmi with metadata such as album cover!
- Comes bundled with a compressed SGM 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
- Insignify Music - for the great arrangement of Field of Hopes and Dreams
- Falcosoft - for help with the RMIDI format
- 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.