All notable changes to DawDreamer are documented in this file.
The format is based on Keep a Changelog. DawDreamer uses effort-based versioning: version numbers reflect the scope of changes rather than strict semantic versioning rules. Breaking changes are called out explicitly in each release's notes.
- Faust soundfile loading supports newer runtimes that omit
Soundfile::shareBuffers, while retaining compatibility with older runtimes. - Agent build instructions moved from
CLAUDE.mdtoAGENTS.md.
0.9.0 - 2026-08-12
- Linux aarch64 and macOS Intel (x86_64) wheels, published alongside the existing Linux x86_64, macOS arm64, and Windows x86_64 wheels.
- Python 3.13 and 3.14 support, tested in CI.
- Pickling support for
RenderEngineand all processors (see PICKLE_FORMAT.md). - Comprehensive Sphinx documentation: user guide, Faust Box/Signal API reference, and content migrated from the GitHub Wiki.
- Pre-commit configuration (ruff, clang-format, codespell, shellcheck).
- Python bindings switched from pybind11 to nanobind (v2.14.0).
- The GIL is released during
RenderEngine.render,make_plugin_processor, plugin state/preset loading, and allFaustProcessorcompile methods, so other Python threads (including other engines rendering) can run concurrently. Faust compilation and plugin loading are internally serialized with a mutex because libfaust factory creation and JUCE plugin scanning are not thread-safe. - Faust and libfaust updated to 2.85.9, with the matching faustlibraries.
- The Sampler processor was updated for JUCE 8.
- Minimum Python version is now 3.11.
- Deprecated JUCE APIs were replaced; the C++ build compiles without warnings.
- Requesting a plugin parameter name or text for an out-of-range index now raises an exception instead of returning an empty string.
make_panner_processordid not clamp pan values below -1.load_graphnow validates input names immediately instead of failing later during render.- Passing non-2D audio data to the Playback, PlaybackWarp, or Sampler
processors now raises a
RuntimeErrorinstead of crashing, and zero-sample audio data renders silence (#219). set_busdeactivates the hosted plugin before changing the bus arrangement, as VST3 requires (#216).enable_all_busesanddisable_nonmain_busesnow affect the hosted plugin; previously they only touched the wrapper processor and were effectively no-ops.- Loading a plugin no longer probes the path with every plugin format, which
removes spurious stderr errors such as LV2's "attempt to map invalid URI"
for a
.vst3path (#218).
- Wheels no longer bundle faustlibraries documentation, tests, and mesh2faust
CAD sources (
modalmodels), or Faust architecture app-project scaffolding. Architecture wrapper files usable with-a(such asjax/minimal.py) are still included.
0.8.3 - 2024-09-09
PluginProcessor.get_parameter_range(index, search_steps=1000, convert=True)extracts parameter ranges with optional text-to-numerical conversion.FaustProcessor.opt_levelproperty to control the LLVM optimization level.FaustProcessor.faust_libraries_pathsandfaust_assets_paths(plural) for multiple search paths.boxFFunandsigFFunin the Box and Signal APIs.
- libfaust updated to 2.70.3.
- macOS builds require macOS 12 (Monterey) or later.
- All platforms require Python 3.10 or higher.
boxVGroupincorrectly referencedboxHGroup.
0.8.0 - 2023-11-17
- Breaking:
boxFromDSPreturns just aboxinstead of the tuple(box, inputs, outputs). Use the new.inputs/.outputsproperties. - libfaust updated to 2.69.3; JUCE updated to 7.0.8.
- Box objects gained
.valid,.inputs, and.outputsproperties. FaustProcessor.compile_boxsearches for library files in.faust_libraries_path.- Python 3.12 wheels on PyPI.
- Breaking:
getBoxTypewas removed. Use the Box properties instead.
0.7.4 - 2023-09-26
- MIDI notes now turn off properly when a render concludes before a Note Off event.
- Off-by-one sample error in the output size when the block size is 2.
- JUCE updated to 7.0.7; libfaust updated to 2.68.1; pybind11, rubberband, and libsamplerate updated.
- Python 3.8+ required for Windows/Linux wheels; Python 3.9+ for macOS.
- The Faust
soundfileprimitive can load directly from the filesystem, with automatic fallback to theset_soundfiles()dictionary. - Python numeric types implicitly convert in
boxReal/boxIntandsigReal/sigIntcontexts.
0.7.3 - 2023-09-18
- MIDI note handling between renders (notes turn off if a render ends before a Note Off event).
- Output render size calculation (off-by-one sample when the block size is 2).
- JUCE updated to 7.0.7; libfaust updated to 2.68.1; pybind11 updated.
- Refactored the Sampler processor plugin project and the libfaust Box/Signal API files.
0.7.1 - 2023-06-01
- Multiprocessing support, with tests and examples.
- Removed an unnecessary mutex in
PluginProcessor. - The JUCE
MessageManagerinstance is created before theAudioProcessorGraph.
0.7.0 - 2023-05-18
- Breaking: macOS wheels require Python 3.9+ and macOS 11.0+.
- Faust updated to 2.59.6 with the associated Faust libraries.
- libfaust is downloaded at build time instead of being vendored in the repository.
- Crash in
PluginProcessor.record_automation. - Several
isBoxfunctions in the Faust Box API.
0.6.3 - 2022-04-19
PluginProcessor.open_editor(),load_state(filepath),save_state(filepath),can_set_bus(inputs, outputs), andset_bus(inputs, outputs).
0.6.1 - 2022-04-04
PlaybackWarpProcessor.reset_warp_markers(bpm)and thewarp_markersproperty (#73).
PlaybackWarpProcessorbehavior when warping is disabled (#81).
0.6.0 - 2022-03-24
- Breaking: functions like
load_graph()throw exceptions instead of returning bools. - The render engine warns instead of erroring when too many signals connect to a node.
- JUCE, Faust, and pybind11 upgraded.
all_eventskeyword argument forPluginProcessor.load_midi()(default True for backwards compatibility).FaustProcessor.faust_libraries_pathfor custom.libfile locations.- Faust release-length property to avoid false-positive voice stealing warnings.
- Faust processor MIDI file loading.
- Add processor channel count (now always stereo).
0.5.8.1 - 2022-01-13
- Multi-channel support for VSTs, Faust, and other processors, with
get_num_input_channels()andget_num_output_channels().
- Better macOS support for Apple Silicon and Intel, and an improved
pip install dawdreamerexperience.
0.5.7.8 - 2021-10-09
- The Faust
soundfileprimitive, withset_soundfiles()for passing NumPy audio from Python.
0.5.7 - 2021-08-14
- Breaking:
PluginProcessor.set_automationidentifies parameters by index instead of name, because parameter names aren't always unique.
0.5.6 - 2021-05-09
- The Faust processor: real-time Faust DSP compilation and execution.
- JUCE from the global namespace.
0.5.0 - 2021-06-18
- Linux support (thanks @guillaumephd).
0.4.0 - 2020-12-08
- Parameter automation at audio rate and PPQN rate.
0.1.0 - 2020-08-14
- First public release: core RenderEngine, processor graph system, VST plugin hosting.