$ hdaw render landing.json a.wav
$ hdaw render landing.json b.wav --threads 1
$ hdaw render landing.json c.wav --threads 4
$ shasum -a 256 a.wav b.wav c.wav
c2fb3d872171448cc96abdc58d78fd8cd78b05dc1c3302194d8cfd4a03db3b07 a.wav
c2fb3d872171448cc96abdc58d78fd8cd78b05dc1c3302194d8cfd4a03db3b07 b.wav
c2fb3d872171448cc96abdc58d78fd8cd78b05dc1c3302194d8cfd4a03db3b07 c.wav
Serial, four threads, all cores. Thread count changes how long the render takes and nothing about what comes out.
→ {"method":"session.new","params":{"title":"landing"}}
← {"result":{"document_hash":"8e67a02f8ab8…"}}
→ {"method":"track.add","params":{"track":{
"id":"lead","kind":"midi","output":"master",
"instrument":{"format":"builtin","uid":"australis"}}}}
← {"result":{"document_hash":"c4ce6543b0e3…"}}
→ {"method":"clip.add_midi","params":{"track":"lead",
"clip":{"id":"riff","start":{"musical":"0/1"},"duration":"8/1"},
"notes_compact":[["0/1","1/2",57,104],["1/2","1/2",60,96]]}}
← {"result":{"document_hash":"925614bdfed5…"}}
→ {"method":"render","params":{"out_path":"mix.wav"}}
← {"method":"render.progress","params":{"frames_done":9728,
"frames_total":192000}}
← {"result":{"frames":192000,"realtime_ratio":2.94,
"analysis":{"integrated_lufs":-10.489,"true_peak_db":-7.328,
"clipped_samples":0}}}
JSON-RPC 2.0 over stdio. Every mutation returns the new canonical document hash, so a caller always knows which revision it is holding.
$ hdaw mcp
→ {"method":"tools/list"}
← {"result":{"tools":[ … 223 entries … ]}}
session_new Create a new empty session.
clip_add_midi Append a MIDI clip to a track.
analysis_report Render in memory and return the full report.
dmx_patch Patch one fixture profile mode at explicit
DMX universe, address, and break locations.
The 221 wire methods, plus two composite helpers for common setup. An agent gets the same surface a human does, with schemas attached.