DawDreamer 0.9.0 is on PyPI with wheels for Python 3.11–3.14 on Linux x86_64, Linux aarch64 (new), macOS arm64, macOS Intel (new), and Windows x86_64.
Highlights
- Free-threading-friendly rendering: the GIL is released during
RenderEngine.render,make_plugin_processor, plugin state/preset loading, and allFaustProcessorcompile methods, so multiple engines can render concurrently on Python threads (measured ~3.7x speedup with 4 threads). Faust compilation and plugin loading are internally serialized because libfaust factory creation and JUCE plugin scanning are not thread-safe. See the new threading guide. - Pickling for
RenderEngineand all processors (see PICKLE_FORMAT.md). - Python bindings switched from pybind11 to nanobind v2.14.0.
- Faust and libfaust updated to 2.85.9 with matching faustlibraries; Sampler updated for JUCE 8.
- Comprehensive Sphinx documentation: user guide, Faust Box/Signal API reference, and content migrated from the GitHub Wiki.
Breaking changes
- Minimum Python version is now 3.11.
- Requesting a plugin parameter name or text for an out-of-range index raises an exception instead of returning an empty string.
- nanobind converts arguments more strictly than pybind11; integer arguments must be real integers (implementing
__index__).
Fixes
- Non-2D audio data passed to Playback, PlaybackWarp, or Sampler processors raises
RuntimeErrorinstead of crashing, and zero-sample audio renders silence (#219). set_busdeactivates the hosted plugin before changing the bus arrangement, as VST3 requires;enable_all_busesanddisable_nonmain_busesnow actually reach the hosted plugin (#216).- Plugin loading only probes formats matching the file type, removing spurious stderr errors like LV2's "attempt to map invalid URI" (#218).
make_panner_processorclamps pan values below -1;load_graphvalidates input names immediately.
Full details in the CHANGELOG.
Full diff: v0.8.3...v0.9.0