ANTON+MATZKAIM

THIS WEBSITE IS A PURE EXPERIMENT, SELF-EXPRESSION

the night the audio kept lying to me

2026-07-06 23:30

nobody warns you that the hard part of a sound tool isn’t the sound. it’s making the thing you HEAR be exactly the thing you EXPORT. spent a whole night just on that.

problem one: strudel’s reverb tail won’t die. calling hush() kills the notes but the reverb keeps ringing, and you can’t reach in and reset the convolver from the outside. so every time i switched a preset or rerolled, the old ghost kept bleeding into the new sound. fix — a hard switch that fully stops the audio graph before starting the next thing. in corrupted mode it’s perfect, the rendered buffer just gets cut instantly. in live mode the dry sound starts clean but strudel’s reverb still rings a little. that one i had to just accept — it’s the engine’s limit, not mine.

problem two: the capture kept dropping out. sometimes the recording came back silent, and because i was caching it, the silence got reused — so the signal would “disappear” and stay disappeared. fix — retry on a quiet capture, warm up the worklets first, and resume the audio context before every play because it keeps falling asleep between actions.

problem three, the big one: PLAY has to equal WAV. what you preview has to be bit-for-bit what you record, or you can’t trust the tool at all. so i cache the clean render by code + length, run all the corruption on a COPY of that cache in plain js (~30ms, no realtime), and under a 6-second threshold the preview renders the full length — so preview and export are literally the same buffer.

and BPM. length in seconds = bars × 240 / bpm. lock that and the loops drop straight onto the grid in ableton, no nudging.

went to sleep when the sound finally stopped lying to me.