---
# System prepended metadata

title: Softsynth Proposal

---

# What I'm Asking For

A [softsynth](https://en.wikipedia.org/wiki/Software_synthesizer) that uses [sample-based synthesis](https://en.wikipedia.org/wiki/Sample-based_synthesis) to render notes into audio. For use in WebView2's [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API).

I would prefer a softsynth that uses a SoundFont file.

# TL;DR

- SoundFonts > Individual Instrument Audio Files
- Better timing
- Can play notes programmatically
- Can add/change audio effects live
- MIDI file support
- Variable note length
- Supported instruments can sustain indefinitely

# Why Use a Softsynth?

- Provides a more flexible way to time notes, not being limited to increments of `world.tick_lag`
- Typically provides support for programmatically turn notes on and off
    - I can make a parser for Player Piano notes and play it like this
- Ability to add/change audio effects live
    - e.g. chrous, reverb, or filter
- May provide support for playing MIDI files
  - **If** this is allowed, I would like to reccomend a MIDI file limit of around 500 KB
  - Though that's just me setting an arbitrary limit

## Variable Note Length

- Instruments notes can be played longer or shorter without audio cliping
- Supported instruments (e.g. organ, trombone) can be sustained indefinitely
- Allows the following instruments work as intended:
  - `outbackcatgirl` attempted to do sustained organs, which didn't work well due to audio cliping
  - `ithebinman` wants to have sustained trombones to make a manual trombone instrument with sliding

# Why Use a SoundFont?

## Takes Up Less Space

- For instance, `GeneralUser GS v1.471.sf2` includes around 128 instruments while being around 29.8 MB
- While the 12 insturments Goonstation currently has are collectively around 5.6 MB
- Goonstation Instrument List: saxophone, tambourine, triangle, trumpet, banjo, bass, cowbell, elecguitar, fiddle, guitar, organ, piano
- SoundFont files can be edited to remove unnecessary instruments, reducing file size

# Softsynth List

## JavaScript

### SpessaSynth

- https://github.com/spessasus/SpessaSynth
- License: MIT (one file under Apache 2.0)

Possibly the best fit when looking at features, license, and language.

### webaudiofont

- https://github.com/surikov/webaudiofont
- License: GPL3

Has the necessary features, but the license is possibly an issue.

## WASM

These would need to be converted to WASM to be used. Would likely use [Audio Worklets](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API#audio_processing_in_javascript).

### TinySoundFont

- Language: C
- https://github.com/schellingb/TinySoundFont
- License: MIT

Would need to be ported for use.

### RustySynth

- Language: Rust
- https://github.com/sinshu/rustysynth
- License: MIT

Would need to be ported for use. Probably easier to port than a C library.

### fluidsynth-emscripten

- Language: C
- https://github.com/jet2jet/fluidsynth-emscripten
- License: LGPL2.1

Porting the original [fluidsynth](https://github.com/FluidSynth/fluidsynth) library is likely beyond my ability, so this is probably a better alternative.

It's forked from an older version of fluidsynth, but appears to still work without issue in a [project's](https://github.com/jet2jet/js-synthesizer?tab=readme-ov-file) [demo](https://www.pg-fl.jp/music/js-synthesizer/index.en.htm) that uses it.
