All posts
v0.4.7
v0.4.7
Added
BUS_TRIMopcode — per-bus mixer fader. Multiplies a bus scratch pair in place by a host-poked gain, applied between themixer(N)closure and the sum into bus 0, so a fader reaches both the real master and the post-fader stem tap. Unity fallback when unpoked (exactly ×1.0, nondestructive); a ~5 ms one-pole ramp keeps moves click-free.- Friendly bus labels.
bus(),mixer()andmaster()take an optional trailing string label —mixer(1, (s) -> s, "drums")— that surfaces onBusBufferMappingso hosts can name stems and mixer strips. nkido render --stemsand--float32.--stemswrites one WAV per non-master bus next to the master file, tapped post-mixer and post-trim;--float32renders 32-bit float WAVs.- Per-bus hot-swap crossfade. The per-bus scratch pairs now crossfade across a hot-swap the same way the master always has, so stems stay glitch-free through a recompile.
IS_STUDIOstudio panels in the web bundle: mixer, transport, capture, render and takes.
Fixed
mixer()/master()silently dropped a non-string extra argument. The semantic analyzer accepted it onoptional_countand codegen only consumed a trailingStringLit, somixer(1, c, 5)compiled with the5thrown away. NowE260.BUS_TRIMwas reported as stateless byopcode_is_stateful()even thoughop_bus_trimowns aSlewState, causing WASM disassembly and state-id enumeration to under-report state.nkido render --stemsoverwrote colliding stems. Two buses sharing a label — or two labels sanitizing to the same filename — wrote to the same path, silently losing the earlier output. Colliding names now get a_busNsuffix.SequenceStatearena blocks are reclaimed on hot-swap re-init.- Void arguments coerce to silence instead of wiring the
0xFFFFsentinel into a buffer slot.