- TestScenario: parses a JSON file describing sample rate/block size/
duration, an input signal config (silence/sine/noise/impulse), and a
timed sequence of events (noteOn/noteOff/controller/param/loadPatch/
loadBank/savePatch/saveBank), sorted by sample position. Relative
file paths inside the JSON resolve against the scenario file's own
directory, not the process cwd, so scenario files are portable.
Nothing here is JaySynth-specific: an event type a given plugin
doesn't care about (e.g. MIDI sent to a plugin with no MIDI input)
is simply inert, since AudioProcessor/MidiBuffer already tolerate
that generically.
- main.cpp: unified the ad-hoc CLI flags (--note/--param/--input/etc.)
and --scenario JSON files through one render loop, by synthesizing
a TestScenario from the CLI flags when no JSON file is given. Added
--bank/--savePatch/--saveBank for the ad-hoc path (loadPatch/wav
already existed). Non-MIDI events (param/patch/bank) scheduled
inside a block apply at the start of that block; MIDI events keep
full per-sample timing via MidiBuffer's own offset parameter.
- PerformanceStats: wraps each processBlock call with a high-resolution
timer, reports min/mean/max render time and a real-time factor
(audio seconds rendered / wall-clock seconds), plus optional
per-block CSV export for tracking regressions over time. Never
paces the loop to real-time - the point is to run faster than that.
Verified end-to-end:
- Ad-hoc CLI path against JaySynth.so still renders correctly and now
reports performance (e.g. ~74x real-time on this machine).
- A JSON scenario driving JaySynth (timed noteOn/param/noteOff/
savePatch) produces correct WAV output and a valid saved patch file.
- That saved patch round-trips back in via --patch and renders
cleanly (proves the save/load path is consistent, not just
one-directional).
- A JSON scenario driving a real third-party effect (ZamComp-vst.so,
2 in/1 out - a genuinely asymmetric channel count, not just "0 in"
or "stereo") with generated pink noise and a param event produces
correct mono output at >1000x real-time.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ