Launching gd-empd


LAUNCHING gd-empd v1.0: Pure Data Meets Godot

November 23, 2025

We're excited to announce gd-empd - a GDExtension that brings the full power of Pure Data into Godot Engine, with first-class WebAssembly support!

RUN PURE DATA EVERYWHERE

gd-empd lets you run Pure Data patches directly in Godot - on desktop and web browsers. Same patches, same behavior, no compromises.

THE PROBLEM WE SOLVED

Game audio middleware is expensive and restrictive. Pure Data is free and powerful, but integrating it into game engines has been painful - especially for web. We fixed that.

HOW IT'S DIFFERENT

There are other Pure Data integrations for Godot (godot-pd, godot-pure-data), and we appreciate their pioneering work! Here's what makes gd-empd unique:

  • FIRST-CLASS WEB SUPPORT - Only implementation with working WebAssembly exports using threaded WASM + SharedArrayBuffer
  • 3-LINE INTEGRATION - PdNode handles everything automatically: initialization, audio pumping, cleanup
  • AUTO-GENERATED UI - Patches define their own interface via metadata. Zero manual UI coding required
  • UNIVERSAL RESOURCE ACCESS - Patches load from res:// on ALL platforms, including web exports
  • TOUCH-OPTIMIZED UI - Responsive controls that work great on desktop and touch devices

PLATFORM SUPPORT

Desktop: macOS (Universal arm64+x86_64), Linux (x86_64, arm64), Windows (x86_64) Web: Chrome, Firefox, Safari (with SharedArrayBuffer) Mobile: iOS and Android (experimental - not yet fully tested)

KEY FEATURES

AUTO-UI SYSTEM Add metadata to your Pure Data patch: #X text 20 20 @ui-param slider:Volume vol 0.0 1.0 0.5;

Set one property in Godot: pd.ui_auto_parent = "Parent"

Get: Modern responsive UI, inspector-editable parameters, automatic reset buttons, 7 control types, mobile-first design

DEAD SIMPLE CODE Traditional approach (30+ lines): var instance = PdInstance.new() instance.load_patch("res://patch.pd")

manual audio setup, UI creation, cleanup...

PdNode approach (3 lines): var pd = PdNode.new() pd.patch_path = "res://patch.pd" add_child(pd) # Done!

FULL PD VANILLA SUPPORT All 200+ Pure Data objects, arrays/tables, MIDI I/O, audio file operations ([readsf], [writesf]), sample-accurate timing

TECHNICAL ACHIEVEMENTS

HYBRID ARCHITECTURE Native builds use libpd with direct C++ binding. Web builds use Pure Data compiled to WebAssembly via Emscripten. Result: Perfect behavioral parity everywhere.

WEBASSEMBLY BREAKTHROUGH Getting file I/O working in browsers was the hardest challenge:

  1. Threaded WASM builds with SharedArrayBuffer
  2. Automatic PCK extraction - files transparently copied to Emscripten filesystem
  3. Universal patch extraction works on ALL platforms

Result: [readsf] and [writesf] just work in browsers. No hacks.

MEMORY SAFETY Comprehensive lifecycle documentation prevents memory leaks and duplicate callbacks. See INSTANCE_LIFECYCLE.md for details.

TRY THE EXAMPLES

Interactive demo includes:

  • Auto UI Synth - See the UI system in action
  • MIDI Echo Test - Hardware MIDI integration
  • Simple Synth - Basic parameter control
  • Array Example - Wavetable synthesis
  • Sampler - Audio file loading with [readsf~]

Play now: https://gllmar.itch.io/gd-empd-examples

Leave a comment

Log in with itch.io to leave a comment.