DAW FEATURES // ZPWR-DAW PORT REPORT

// The DAW capabilities the arranger & Premiere reports don’t cover — mixing console & routing, MIDI note tools, automation math, tempo/meter math, arrangement versioning, SMF interchange, the notation data-model, and MIDI-mapping state — each a pure, deterministic, host-agnostic module mapped to where it lives and the test that pins it.
// Every feature here is pure data/math with no audible, native, or hardware component, so a node:test unit test IS the verification — not a self-assigned score. The engine stays host-agnostic: these emit values / models; the host binds them to its UI, audio, MIDI-out, or file I/O.
39 features · 39 ported (cited + unit-tested) · 0 gap · generated 2026-07-11
Home

⚠ Read this first — what this report is, and isn’t

This is a citation-backed coverage map. Every row names the exact module:line where the function lives AND the grid/tests/*.test.mjs that asserts its behavior — both are the proof. Unlike the arranger report’s audio-clip rows (which stay GAP until a compiled JUCE build is heard), every feature here is a pure deterministic function with no audible/native/hardware component, so the unit test is a complete verification. Live capture (recording a gesture), physical controller I/O, and the audible render are the parts that stay host-side — noted per row. All 39 features are ported & tested; run node --test in libs/zpwr-clip-engine/webui/grid/tests to check.
39features
39PORTED (cited + tested)
0GAP
8modular files
155unit tests
100%pure / deterministic

By category

Mixing console & routing 8
8 ported · cited + unit-tested
MIDI note editing & tools 6
6 ported · cited + unit-tested
Automation 4
4 ported · cited + unit-tested
Tempo, meter & groove timing 4
4 ported · cited + unit-tested
Arrangement / session 2
2 ported · cited + unit-tested
Project interchange (data-format) 2
2 ported · cited + unit-tested
Score / notation data model 7
7 ported · cited + unit-tested
MIDI mapping / control-surface state 6
6 ported · cited + unit-tested

Every feature

featurecategoryDAW(s)statuswhere it lives (module:line) + test
VCA / DCA fader groupsMixing console & routingPro Tools·Logic·Cubase·SSLPORTEDmixer/console.js:98
group master trims member linear gain (fader*dbToGain(trim), 0 when muted) without touching stored fader values. Unit-tested in grid/tests/console.test.mjs (vcaMemberGain · vcaGroupGains).
Selectable pan lawMixing console & routingPro Tools·Cubase·Logic·ReaperPORTEDmixer/console.js:20
lin0 / -3 / -4.5 / -6 dB / equal-power / balance laws; 'cp' stays byte-identical to the existing panGains. Unit-tested in grid/tests/console.test.mjs (panLawGains).
Stereo width / mid-sideMixing console & routingAbleton·Logic·Waves S1PORTEDmixer/console.js:121
M-S encode/decode: mid±(side*width); width 1 identity, 0 mono, 2 wide; mono input invariant. Unit-tested in grid/tests/console.test.mjs (stereoWidth · widthScale).
Polarity invert + mono-sum compatibilityMixing console & routingevery console (Ø) + correlation metersPORTEDmixer/console.js:129
±1 polarity, per-leg mono-sum, and a [-1,1] correlation score flagging phase cancellation. Unit-tested in grid/tests/console.test.mjs (polarityGain · monoSum · monoCompatibility).
Pre-fader vs post-fader sendsMixing console & routingPro Tools·Logic·Cubase·AbletonPORTEDmixer/console.js:168
pre tap is independent of the fader (headphone/cue mixes); post == the existing busContribution. Unit-tested in grid/tests/console.test.mjs (sendContribution).
Cue bus solo modes (PFL / AFL / SIP)Mixing console & routingSSL·Neve·Pro Tools·CubasePORTEDmixer/console.js:179
which signal the control-room bus hears: PFL pre-fader, AFL post-fader, solo-in-place mutes the rest. Unit-tested in grid/tests/console.test.mjs (cueBusSignal).
Insert-chain ordering + per-insert bypassMixing console & routingLogic·Cubase·Pro Tools·AbletonPORTEDmixer/console.js:45
serial gain threaded through inserts in order (EQ-then-comp ≠ comp-then-EQ); reorder + bypass are pure array transforms. Unit-tested in grid/tests/console.test.mjs (serialChainGain · reorderInsert · toggleInsertBypass).
Sidechain key-input routingMixing console & routingAbleton·Logic·Cubase·Pro ToolsPORTEDmixer/console.js:229
reduction driven by an assigned SOURCE track's level (with key HPF), not the target's own level. Unit-tested in grid/tests/console.test.mjs (sidechainReduction · resolveSidechain).
Quantize with strength / swing / endsMIDI note editing & toolsLogic·Cubase·FL·Ableton·Studio OnePORTEDclip/note-tools.js:24
partial quantize s' = s + strength*(nearest-grid − s); swing offsets even slots; optional note-end snap. Unit-tested in grid/tests/notetools.test.mjs (quantizeNotes).
Humanize (timing / velocity / length)MIDI note editing & toolsLogic·Cubase·FL·AbletonPORTEDclip/note-tools.js:56
bounded jitter with an INJECTED rng (deterministic tests); velocity clamped 1..127, onsets never negative. Unit-tested in grid/tests/notetools.test.mjs (humanizeNotes).
Scale-lock / snap-to-scaleMIDI note editing & toolsAbleton·Logic·FL·CubasePORTEDclip/note-tools.js:37
constrains pitches to a key+scale (nearest in-scale, ties down), reusing the notes-domain CLIP_SCALES. Unit-tested in grid/tests/notetools.test.mjs (scaleLockNotes).
Strum (chord onset spread)MIDI note editing & toolsLogic·Cubase·FL·Ableton·BitwigPORTEDclip/note-tools.js:130
offsets simultaneous chord notes by pitch order, up or down; distinct onsets grouped independently. Unit-tested in grid/tests/notetools.test.mjs (strumNotes).
Chordify / harmonizeMIDI note editing & toolsAbleton·Logic·Cubase·FLPORTEDclip/note-tools.js:154
expands each note into a chord by interval offsets, MIDI-clamped and de-duplicated. Unit-tested in grid/tests/notetools.test.mjs (chordifyNotes).
Ratchet / note-repeatMIDI note editing & toolsBitwig·Ableton·FL·MaschinePORTEDclip/note-tools.js:175
subdivides a note into N back-to-back hits with optional per-repeat velocity decay; covered span preserved. Unit-tested in grid/tests/notetools.test.mjs (ratchetNotes).
Thinning / simplify (RDP)AutomationPro Tools·Cubase·Logic·AbletonPORTEDgrid/automation-tools.js:70
Ramer–Douglas–Peucker breakpoint reduction; endpoints kept, larger epsilon removes more, sort preserved. Unit-tested in grid/tests/autotools.test.mjs (thinKeyframes).
LFO-to-envelope bakeAutomationLFOTool·Ableton·Cubase·BitwigPORTEDgrid/automation-tools.js:88
samples sine/tri/saw/square/S&H into breakpoints; S&H uses a seeded LCG so the point list is reproducible. Unit-tested in grid/tests/autotools.test.mjs (lfoEnvelope).
Curve segment shapesAutomationAbleton·Logic·Cubase·Pro ToolsPORTEDgrid/automation-tools.js:127
sine/S-curve, exponential/log (curvature k), and stepped(N); all fix endpoints, unknown → linear. Unit-tested in grid/tests/autotools.test.mjs (curveShape).
Mode merge (read/write/touch/latch/trim)AutomationAbleton·Logic·Pro Tools·CubasePORTEDgrid/automation-tools.js:193
merges a recorded gesture into existing breakpoints per mode; touch rejoins prior value at release, trim is a reversible offset (the live capture that produces the gesture stays host-side). Unit-tested in grid/tests/autotools.test.mjs (mergeAutomationPass).
Tempo-map time integrationTempo, meter & groove timingLogic·Cubase·Pro Tools·ReaperPORTEDgrid/tempo-math.js:65
musical position ↔ absolute seconds over the stepped+linear-ramp tempo model; exact discrete inverses (round-trip). Unit-tested in grid/tests/tempomath.test.mjs (secondsAtStep · stepAtSeconds).
Beat-mapping from tapsTempo, meter & groove timingLogic·Cubase·Studio OnePORTEDgrid/tempo-math.js:191
derives a per-segment variable-tempo track from {beat,ms} taps, clamped 40..300; rejects non-monotonic taps. Unit-tested in grid/tests/tempomath.test.mjs (tempoMapFromTaps).
Metronome subdivision + accentsTempo, meter & groove timingPro Tools·Cubase·LogicPORTEDgrid/tempo-math.js:214
accent/beat/sub/null per step with custom accent beats + click subdivisions; reproduces metronomeAccent at subdiv 1. Unit-tested in grid/tests/tempomath.test.mjs (metronomeClick).
Non-linear tempo rampsTempo, meter & groove timingReaper·Studio OnePORTEDgrid/tempo-math.js:18
linear / ease-in / ease-out / exponential accel-rit shapes with exact endpoints. Unit-tested in grid/tests/tempomath.test.mjs (tempoRampBpm).
Arrangement alternatives / versionsArrangement / sessionLogic·Cubase·Pro ToolsPORTEDgrid/arrangement-versions.js:55
named, switchable full-arrangement snapshots with deterministic ids; delete-active reassigns, JSON round-trips. Unit-tested in grid/tests/altversions.test.mjs (createVersionStore · saveVersion · restoreVersion · renameVersion · deleteVersion · listVersions).
A/B arrangement compareArrangement / sessionLogic·Studio OnePORTEDgrid/arrangement-versions.js:149
structural diff of two snapshots keyed by clip id + (track,bar): a relocated clip is 'moved', not added+removed; order-independent. Unit-tested in grid/tests/altversions.test.mjs (diffArrangements · summarizeDiff).
SMF import (.mid → notes)Project interchange (data-format)all DAWs (Import MIDI)PORTEDgrid/export/smf-io.js:47
parses MThd + MTrk VLQ deltas / running status / note-on-vel0=off / FF meta; round-trips the existing patternToMidi export. Unit-tested in grid/tests/smfio.test.mjs (midiToPattern).
SMF Type-1 multitrack (stem) exportProject interchange (data-format)all DAWsPORTEDgrid/export/smf-io.js:162
format=1, conductor MTrk (tempo/meter) + one named MTrk per track (FF03); MTrk events reconstruct the Type-0 note set. Unit-tested in grid/tests/smfio.test.mjs (patternToMidiType1).
Pitch → diatonic spellingScore / notation data modelMuseScore·Sibelius·Finale·Dorico·Logic·CubasePORTEDnotation/notation-model.js:56
enharmonic spelling under a key context (C# in D major, D♭ in D♭ major) — letter + accidental + octave. Unit-tested in grid/tests/notation.test.mjs (spellPitch).
Key-signature modelScore / notation data modelMusicXML·Sibelius·Finale·DoricoPORTEDnotation/notation-model.js:38
root+mode → circle-of-fifths count (-7..+7) and ordered accidental letters. Unit-tested in grid/tests/notation.test.mjs (keyFifths).
Duration → notation valueScore / notation data modelLogic·Cubase·Studio One·MusicXMLPORTEDnotation/notation-model.js:136
greedy binary+dotted decomposition with tied remainder (2.5 beats → half-tied-eighth). Unit-tested in grid/tests/notation.test.mjs (durationToNotes · durationType).
Rest insertionScore / notation data modelevery notation editorPORTEDnotation/notation-model.js:149
fills inter-note gaps (incl. leading/trailing silence) with rest note-values via durationToNotes. Unit-tested in grid/tests/notation.test.mjs (restsForBar).
Beaming groupsScore / notation data modelMuseScore·Dorico·MusicXMLPORTEDnotation/notation-model.js:160
partitions 8th-and-shorter runs per beat unit, breaking at beat boundaries and quarter-or-longer notes (threes in 6/8). Unit-tested in grid/tests/notation.test.mjs (beamGroups).
Transposing-instrument displayScore / notation data modelSibelius·Finale·Dorico·MusicXMLPORTEDnotation/notation-model.js:80
concert↔written pitch + key shift (B♭ clarinet +2 → +2 sharps; E♭ sax +9 → +3 sharps); transpose 0 identity. Unit-tested in grid/tests/notation.test.mjs (writtenPitch).
MusicXML serialize (score-partwise)Score / notation data modelFinale·Sibelius·Dorico·MuseScore·LogicPORTEDnotation/notation-model.js:250
emits key/time + per-note pitch/rest/duration/type/dot/beam, composed from spellPitch/durationToNotes/restsForBar/beamGroups (the universal notation interchange). Unit-tested in grid/tests/notation.test.mjs (patternToMusicXML).
MIDI-learn binding tableMIDI mapping / control-surface stateAbleton·Logic·Bitwig·ReaperPORTEDmapping/midi-map.js:27
CC/note/PB source → target-param table with 1:1 reassign + serialize/deserialize persistence (the live hardware I/O stays host-side). Unit-tested in grid/tests/midimap.test.mjs (createMidiMap · assignMapping · removeMapping · lookupTarget · lookupSource).
Value-transform math (min/max/invert)MIDI mapping / control-surface stateAbleton·Reaper·BitwigPORTEDmapping/midi-map.js:157
0-127 → [min,max] with invert + clamp, deterministic. Unit-tested in grid/tests/midimap.test.mjs (ccToParam).
Relative-encoder decodeMIDI mapping / control-surface stateReaper·Ableton·Mackie/HUIPORTEDmapping/midi-map.js:80
endless-encoder byte → signed delta across two's-complement / signed-bit / binary-offset encodings, integrated + clamped. Unit-tested in grid/tests/midimap.test.mjs (decodeRelative · applyRelative).
Toggle / momentary switchMIDI mapping / control-surface stateAbleton·Reaper·LogicPORTEDmapping/midi-map.js:167
note/CC-over-threshold either latches (toggle on rising edge) or holds while pressed (momentary). Unit-tested in grid/tests/midimap.test.mjs (applySwitch).
Macro control fan-outMIDI mapping / control-surface stateAbleton·Bitwig·Logic·NIPORTEDmapping/midi-map.js:178
one macro 0..1 drives N target params, each through its own [min,max]/invert range. Unit-tested in grid/tests/midimap.test.mjs (createMacro).
Soft-takeover / pick-upMIDI mapping / control-surface stateAbleton·Reaper·TraktorPORTEDmapping/midi-map.js:135
suppresses param jumps until the incoming controller value brackets the current value, then engages. Unit-tested in grid/tests/midimap.test.mjs (softTakeover · createTakeover).