⚠ 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
| feature | category | DAW(s) | status | where it lives (module:line) + test |
|---|---|---|---|---|
| VCA / DCA fader groups | Mixing console & routing | Pro Tools·Logic·Cubase·SSL | PORTED | mixer/console.js:98group 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 law | Mixing console & routing | Pro Tools·Cubase·Logic·Reaper | PORTED | mixer/console.js:20lin0 / -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-side | Mixing console & routing | Ableton·Logic·Waves S1 | PORTED | mixer/console.js:121M-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 compatibility | Mixing console & routing | every console (Ø) + correlation meters | PORTED | mixer/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 sends | Mixing console & routing | Pro Tools·Logic·Cubase·Ableton | PORTED | mixer/console.js:168pre 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 & routing | SSL·Neve·Pro Tools·Cubase | PORTED | mixer/console.js:179which 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 bypass | Mixing console & routing | Logic·Cubase·Pro Tools·Ableton | PORTED | mixer/console.js:45serial 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 routing | Mixing console & routing | Ableton·Logic·Cubase·Pro Tools | PORTED | mixer/console.js:229reduction 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 / ends | MIDI note editing & tools | Logic·Cubase·FL·Ableton·Studio One | PORTED | clip/note-tools.js:24partial 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 & tools | Logic·Cubase·FL·Ableton | PORTED | clip/note-tools.js:56bounded 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-scale | MIDI note editing & tools | Ableton·Logic·FL·Cubase | PORTED | clip/note-tools.js:37constrains 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 & tools | Logic·Cubase·FL·Ableton·Bitwig | PORTED | clip/note-tools.js:130offsets simultaneous chord notes by pitch order, up or down; distinct onsets grouped independently. Unit-tested in grid/tests/notetools.test.mjs (strumNotes). |
| Chordify / harmonize | MIDI note editing & tools | Ableton·Logic·Cubase·FL | PORTED | clip/note-tools.js:154expands each note into a chord by interval offsets, MIDI-clamped and de-duplicated. Unit-tested in grid/tests/notetools.test.mjs (chordifyNotes). |
| Ratchet / note-repeat | MIDI note editing & tools | Bitwig·Ableton·FL·Maschine | PORTED | clip/note-tools.js:175subdivides 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) | Automation | Pro Tools·Cubase·Logic·Ableton | PORTED | grid/automation-tools.js:70Ramer–Douglas–Peucker breakpoint reduction; endpoints kept, larger epsilon removes more, sort preserved. Unit-tested in grid/tests/autotools.test.mjs (thinKeyframes). |
| LFO-to-envelope bake | Automation | LFOTool·Ableton·Cubase·Bitwig | PORTED | grid/automation-tools.js:88samples 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 shapes | Automation | Ableton·Logic·Cubase·Pro Tools | PORTED | grid/automation-tools.js:127sine/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) | Automation | Ableton·Logic·Pro Tools·Cubase | PORTED | grid/automation-tools.js:193merges 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 integration | Tempo, meter & groove timing | Logic·Cubase·Pro Tools·Reaper | PORTED | grid/tempo-math.js:65musical 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 taps | Tempo, meter & groove timing | Logic·Cubase·Studio One | PORTED | grid/tempo-math.js:191derives 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 + accents | Tempo, meter & groove timing | Pro Tools·Cubase·Logic | PORTED | grid/tempo-math.js:214accent/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 ramps | Tempo, meter & groove timing | Reaper·Studio One | PORTED | grid/tempo-math.js:18linear / ease-in / ease-out / exponential accel-rit shapes with exact endpoints. Unit-tested in grid/tests/tempomath.test.mjs (tempoRampBpm). |
| Arrangement alternatives / versions | Arrangement / session | Logic·Cubase·Pro Tools | PORTED | grid/arrangement-versions.js:55named, 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 compare | Arrangement / session | Logic·Studio One | PORTED | grid/arrangement-versions.js:149structural 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) | PORTED | grid/export/smf-io.js:47parses 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) export | Project interchange (data-format) | all DAWs | PORTED | grid/export/smf-io.js:162format=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 spelling | Score / notation data model | MuseScore·Sibelius·Finale·Dorico·Logic·Cubase | PORTED | notation/notation-model.js:56enharmonic 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 model | Score / notation data model | MusicXML·Sibelius·Finale·Dorico | PORTED | notation/notation-model.js:38root+mode → circle-of-fifths count (-7..+7) and ordered accidental letters. Unit-tested in grid/tests/notation.test.mjs (keyFifths). |
| Duration → notation value | Score / notation data model | Logic·Cubase·Studio One·MusicXML | PORTED | notation/notation-model.js:136greedy binary+dotted decomposition with tied remainder (2.5 beats → half-tied-eighth). Unit-tested in grid/tests/notation.test.mjs (durationToNotes · durationType). |
| Rest insertion | Score / notation data model | every notation editor | PORTED | notation/notation-model.js:149fills inter-note gaps (incl. leading/trailing silence) with rest note-values via durationToNotes. Unit-tested in grid/tests/notation.test.mjs (restsForBar). |
| Beaming groups | Score / notation data model | MuseScore·Dorico·MusicXML | PORTED | notation/notation-model.js:160partitions 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 display | Score / notation data model | Sibelius·Finale·Dorico·MusicXML | PORTED | notation/notation-model.js:80concert↔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 model | Finale·Sibelius·Dorico·MuseScore·Logic | PORTED | notation/notation-model.js:250emits 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 table | MIDI mapping / control-surface state | Ableton·Logic·Bitwig·Reaper | PORTED | mapping/midi-map.js:27CC/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 state | Ableton·Reaper·Bitwig | PORTED | mapping/midi-map.js:1570-127 → [min,max] with invert + clamp, deterministic. Unit-tested in grid/tests/midimap.test.mjs (ccToParam). |
| Relative-encoder decode | MIDI mapping / control-surface state | Reaper·Ableton·Mackie/HUI | PORTED | mapping/midi-map.js:80endless-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 switch | MIDI mapping / control-surface state | Ableton·Reaper·Logic | PORTED | mapping/midi-map.js:167note/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-out | MIDI mapping / control-surface state | Ableton·Bitwig·Logic·NI | PORTED | mapping/midi-map.js:178one 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-up | MIDI mapping / control-surface state | Ableton·Reaper·Traktor | PORTED | mapping/midi-map.js:135suppresses param jumps until the incoming controller value brackets the current value, then engages. Unit-tested in grid/tests/midimap.test.mjs (softTakeover · createTakeover). |