Skip to content

BREAKING: Re-port MIDI, faster and lower memory, ESP32#790

Merged
earlephilhower merged 3 commits intomasterfrom
newmidi
Oct 21, 2025
Merged

BREAKING: Re-port MIDI, faster and lower memory, ESP32#790
earlephilhower merged 3 commits intomasterfrom
newmidi

Conversation

@earlephilhower
Copy link
Owner

@earlephilhower earlephilhower commented Oct 21, 2025

  • Pull untouched upstream TinySoundFont

Start from the upstream TinySoundFont by @schellingb at https://github.com/schellingb/TinySoundFont and rearchitect the MIDI processing.

  • Convert to PROGMEM-based SoundFont structures.

This makes it much faster to access the SoundFont and also removes all the static RAM usage. The samples, the regions, the instruments are all now in ROM. Only the dynamic voices and related info takes up RAM. No caching.

  • (Re)convert to fixed point math.

TSF upstream is built for systems with real floating point units (and produces great sound with it!), but processors like the Pico, ESP8266, and several models of ESP32 don't have one so emulate FP in extremely slow SW. Use fixed point (integer) represntations for the inner loop and wherever possible to avoid float math.

For processors like the Pico 2 or original ESP32 with hardware FPUs this still increases performance since integer is still much faster.

  • ESP32 (Xtensa) support

The new TSF doesn't hit the compiler bug the earlier version did, so now Xtensa-based ESP32 boards can run MIDI

  • Redo the example and add default SF2s

Rewrite the 2 MIDI examples to use PROGMEM for both SF2 and MID file. It simplifies life for the casual user and me.

  • Breaking change

The MIDI object now has a midi::SetSoundFont(tsf *) instead of a midi::SetSoundfont(AudioFileSource *). It no longer supports reading SF2 from LittleFS or SD.

* Pull untouched upstream TinySoundFont

Start from the upstream TinySoundFont by @schellingb at
https://github.com/schellingb/TinySoundFont and rearchitect the MIDI
processing.

* Convert to PROGMEM-based SoundFont structures.

This makes it much faster to access the SoundFont and also removes all the
static RAM usage.  The samples, the regions, the instruments are all now
in ROM.  Only the dynamic voices and related info takes up RAM.  No caching.

* (Re)convert to fixed point math.

TSF upstream is built for systems with real floating point units (and
produces great sound with it!), but processors like the Pico, ESP8266,
and several models of ESP32 don't have one so emulate FP in *extremely*
slow SW.  Use fixed point (integer) represntations for the inner loop
and wherever possible to avoid `float` math.

For processors like the Pico 2 or original ESP32 with hardware FPUs this
still increases performance since integer is still much faster.

* Redo the example and add default SF2s

Rewrite the 2 MIDI examples to use PROGMEM for both SF2 and MID file.
It simplifies life for the casual user and me.

* Breaking change

The MIDI object now has a `midi::SetSoundFont(tsf *)` instead of a
`midi::SetSoundfont(AudioFileSource *)`.  It no longer supports reading
SF2 from LittleFS or SD.
@earlephilhower earlephilhower changed the title BREAKING: Re-port MIDI, faster and lower memory BREAKING: Re-port MIDI, faster and lower memory, ESP32 Oct 21, 2025
@earlephilhower earlephilhower merged commit 7d99e6b into master Oct 21, 2025
22 checks passed
@earlephilhower earlephilhower deleted the newmidi branch October 21, 2025 01:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant