For this recovery, "100%" means every documented Studio13 MIDI acceptance-matrix workflow passes with evidence. It does not mean cloning every REAPER, Cubase, or openDAW feature. REAPER arrange editing, Cubase Key Editor workflows, and openDAW editor architecture remain the reference targets, but Studio13 ships only the workflows explicitly recorded in midi_editor_reference_matrix.md.
Completion rules:
midi_editor_reference_matrix.mdis the source of truth for MIDI editor completion.- Every matrix row must include a reference artifact, current Studio13 behavior, required Studio13 behavior, frontend owner, backend owner when applicable, automated test, browser/manual acceptance test, and status.
- Phase 4, Phase 5, Phase 7, and Phase 9 remain reopened until browser/WebView screenshots, pointer QA, automated tests, and explicit acceptance notes exist for every row in their area.
- Store-only tests cannot prove pointer behavior. Timeline and piano-roll gesture acceptance requires real browser/WebView pointer input.
- Prior checked boxes under historical Phase 4, Phase 5, Phase 7, and Phase 9 are partial implementation evidence only. They are not completion claims after this recovery reset.
100% completion phases:
- Phase A0: Acceptance contract update. Add this section, expand
midi_editor_reference_matrix.md, and keep historical claims as evidence only. - Phase A1: Reference matrix expansion. Add rows for REAPER arrange item move, resize, trim, slip, loop, copy-drag, split, glue, mute, lock, snap, context actions; Cubase Key Editor tools, info line, inspector, controller display, velocity editing, line/parabola tools, quantize, lane management; and openDAW-inspired separated shell/gesture/property architecture.
- Phase A2: Repeatable browser/WebView QA harness. Add reusable scripts that seed a MIDI acceptance fixture, run pointer gestures, capture screenshots/logs under
qa/midi-editor/<date>/implementation/, and fail if undo/redo or state changes are wrong. 2026-05-13 update:tools/midi-editor-acceptance-harness.mjs --scenario allincludespiano-source-headerin addition to the prior app, MIDI FX, timeline, piano-roll, controller-lane, project, render/export, visual viewport, and backend-payload scenarios; full matrix acceptance remains open under later phases. - Phase A3: MIDI model and command contract hardening. Stabilize MIDI event, clip, lane, gesture, and track metadata types; ensure every data-changing gesture commits exactly one
commandManagerundo entry; preserve old-project migration defaults. - Phase A4: REAPER-style timeline MIDI items. Complete shared audio/MIDI gestures for select, multi-select, move, snap move, cross-track move, copy-drag, left trim/source slip, right resize/loop extension, Alt-slip, split, duplicate, delete, mute, lock, context actions, visible handles, source-window indicators, and loop feedback.
- Phase A5: Cubase-style piano-roll architecture. Split the editor into shell, tool strip, info line, ruler/grid, piano keyboard, note canvas, inspector, lane stack, and status strip; replace monolithic handlers with
MidiEditorGestureSession; finish select/draw/erase/resize/split/glue/mute/range/zoom/pan tools and active/ghost multi-item editing. - Phase A6: Full controller lane stack. Support velocity, note-off velocity, chance, velocity variance, pitchbend, program/bank, channel pressure, poly pressure, arbitrary 7-bit CC, and 14-bit CC with lane menus, hide/remove, clear, copy/paste, presets, height resize, interpolation, line/curve/parabola/LFO generation, scale/tilt/compress/stretch/thinning, and no
window.promptworkflows. - Phase A7: Backend/frontend parity. Verify source-resolved serialization, backend parsing, diagnostics, muted external MIDI suppression, deterministic chance/variance, sampler/SoundFont state, MIDI FX state, render/freeze parity, and project reload diagnostics for the acceptance fixture. 2026-05-12 automated pass: native headless regression now covers scheduler parsing, exact pitchbend/program/bank-select/CC/channel-pressure/note chase at sample zero, saved MIDI playback, add-track no-spike/no-nonfinite callback guards, fallback-instrument render/freeze with pitchbend, MIDI export including bank select, combined-project render, and project-load browser sync repair; browser E2E proves MIDI FX plus chance/variance and program/bank select are resolved in the backend-bound render/export input. Manual DAW workflow acceptance remains under Phase A9.
- Phase A8: Visual polish and DAW feel. Compare Studio13 screenshots against local REAPER/Cubase captures at 1440x900, 1280x720, 1024x720, and short lower-zone height; fix layout density, contrast, handles, selected/ghost hierarchy, lane headers, and active tool states.
- Phase A9: Final acceptance pass. Run TypeScript, full Vitest, C++ Debug build, browser/WebView pointer QA for every matrix row, save/reload/render/freeze fixture QA, final screenshots/logs, and only then update reopened phase statuses. 2026-05-12 automated pass complete: TypeScript, full Vitest, production frontend build, C++ Debug build, native headless regression, and full browser/CDP acceptance all pass; manual REAPER/Cubase acceptance notes remain before reopened phase statuses can close.
Completed acceptance evidence:
- Acceptance contract and matrix source-of-truth added to this plan and
midi_editor_reference_matrix.md. - Repeatable browser/CDP harness added at
tools/midi-editor-acceptance-harness.mjs. - Timeline MIDI item select, Ctrl multi-select, move with undo/redo, snap move, right-edge loop resize with undo/redo, left trim/source slip with backend-visible source-window serialization and undo/redo, Alt-slip with backend-visible source-window serialization and undo/redo, same-track copy-drag with undo/redo, compatible cross-track move with undo/redo, compatible cross-track copy-drag with undo/redo, incompatible audio-target suppression, ghost MIDI-track creation with undo/redo, split with undo/redo, context duplicate/delete with undo/redo, prompt-free repeat dialog with undo/redo, keyboard Ctrl+D duplicate with undo/redo, keyboard Delete with undo/redo, app-level Ctrl+Z undo, app-level Ctrl+Y redo, mute-tool click with undo/redo, context lock with undo/redo, locked-item move suppression, source-offset reset with undo/redo, source-length-to-item with undo/redo, source-length-to-content with undo/redo, and custom source-length dialog with undo/redo have browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json. - Docked Piano Roll active-item focus has app-level browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json: Piano Roll remains docked under the timeline, and clicking selected arrange MIDI items retargets the active editor clip while preserving the multi-selection. This behavior is superseded by the 2026-05-13 multi-session rule below, where a second different MIDI clip opens in a window instead of retargeting the existing dock. - Timeline backend-payload proof after a real right-edge loop resize has browser/CDP evidence: the bridge payload exactly matches
serializeMIDIClipsForBackend, remains inside the visible item window, loop-resolves events past the source length, and preserves event channel, note-off release velocity, pitchbend, CC, probability, velocity variance, and play-count metadata. - Piano-roll shell render, lane presence, note drag with undo/redo, draw with undo/redo, erase with undo/redo, note resize with undo/redo, split with undo/redo, glue with undo/redo, mute with undo/redo, range select, velocity-lane edit with undo/redo, active/reference multi-item switching with isolated undo/redo edits, and inspector metadata edits for pitch, start, length, velocity, channel, note-off velocity, chance, velocity variance, play count, and cent offset with exact full-chain undo/redo have browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json. - CC#1 controller-lane direct draw, ramp, step, curve, parabola, value transform, stretch, thinning, copy, clear, same-lane paste, cross-lane paste, and sine LFO generation have browser/CDP evidence with undo/redo in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json. - Note-off velocity, chance/probability, and velocity-variance lanes have direct browser/CDP pointer-edit evidence, screenshots, and exact undo/redo evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json. - Controller lane hide-without-delete, CC14 lane add/configure/edit, lane height/interpolation controls, pitchbend line generation with undo/redo, direct snapped pitchbend pointer drawing with exact undo/redo, CC#1/CC#74 direct pointer drawing with exact undo/redo, 14-bit CC generation with undo/redo, program lane generation with undo/redo, bank-select CC0/CC32 lane generation with undo/redo, channel pressure lane generation with undo/redo, poly pressure lane generation with undo/redo, backend-bound serialization of those generated events, and linked/unlinked pitchbend range edits with undo/redo have browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json. - MIDI FX pitch, velocity, and time/groove controls use prompt-free numeric dialogs and have browser/CDP evidence that edits update
midiEffectsthrough the real component, undo/redo restores each effect-list step exactly, the actual App TCP rows for MIDI and instrument tracks omit theArp/Pit/Vel/Timmini-buttons, and the final effect chain is applied to the backend-bound MIDI payload. - Project save/reload persistence for the combined MIDI fixture has browser/CDP evidence: MIDI FX, sampler/SoundFont, instrument state, source-window metadata, pitchbend range, note probability/play-count/variance/cent metadata, release velocity, pitchbend, program/bank select, channel pressure/poly pressure, CC14, CC74 parabola interpolation, and load-time backend sync repair payloads survive the save/reload cycle.
- Native headless MIDI backend evidence exists:
--automated-regression-headlesswritesqa/midi-editor/2026-05-12/implementation/native-automated-regression.jsonwith passing scheduler, bank-select chase, saved-playback, add-track spike, render/freeze, bank-select export, and combined-project render suites. - Piano-roll visual viewport QA captures 1440x900, 1280x720, 1024x720, and short-zone screenshots and asserts the shell, tool strip, info line, editor pane, inspector, and lane stack are present without page overflow or editor/inspector overlap.
- Piano-roll dock layout/source-length slice completed on 2026-05-13: MIDI FX in the FX panel uses a dedicated aligned section; the docked Piano Roll observes its own container height, uses a viewport/workspace-aware lower-zone clamp, moves inspector/controller/source controls into a left sidebar whose width matches
tcpWidth, keeps sidebar wheel scrolling independent from the note grid, uses shared arrangepixelsPerSecond/scrollXfor horizontal note geometry, removes the visible Piano Roll horizontal zoom slider, and adds source length/item/content/loop controls that call undoablesetMIDIClipSourceWindow()without deleting out-of-range MIDI events or resizing the visible arrange item. Browser/CDP evidence lives inqa/midi-editor/2026-05-13/piano-layout-source/midi-editor-acceptance-report.jsonviaapp-docked-piano-focus,piano-visual-viewports,piano-source-header,piano-navigation-tools, and full--scenario all; focused unit coverage lives intimelinePianoGeometry.test.tsandmidiClipStoreActions.test.ts. - Piano-roll parity/usability pass completed on 2026-05-13: the vertical piano key strip is restored inside the
tcpWidthleft area without shifting the note grid, the key strip stays row-locked to the note grid and animates host-observable preview notes, a compact bar/beat ruler sits above the grid, horizontal and vertical scrollbars are visible, lower-zone resizing reaches 85% viewport height, the editor shows one selected controller lane at a time with a header lane selector, loop/source end markers are draggable through undoablesetMIDIClipSourceWindow(), a visible Quantize/Q control quantizes selected notes or the full active clip when nothing is selected, and a native detachedmidiEditorwindow role shares active-clip state with the main window. Browser/CDP evidence lives inqa/midi-editor/2026-05-13/piano-parity-pass-all/midi-editor-acceptance-report.json; focused unit coverage for no-selection quantize lives inmidiClipStoreActions.test.ts. - Multi-session MIDI editor and timeline-parity pass completed on 2026-05-13: MIDI editors now use
MidiEditorSessionstate instead of a singletonpianoRollTrackId/pianoRollClipIdmodel; the first MIDI clip opens docked, additional different clips open as windowed sessions, existing clips focus their current session, and docking replaces the current docked editor. Docked and detached headers showTrack Name - Clip Name; theWindowcommand is nowPop Out; native MIDI editor window APIs are session-aware; detached sync publishes lightweight per-session snapshots; the MIDI ruler/playhead follows global transport time; ruler clicks seek the shared playhead; and the piano-key strip supports pointer-captured drag audition with note-off cleanup. Browser/CDP evidence lives inqa/midi-editor/2026-05-13/multi-session-focused,qa/midi-editor/2026-05-13/multi-session-docked-focus, and fullqa/midi-editor/2026-05-13/multi-session-all-final; focused unit coverage lives inmidiEditorSessions.test.tsandtimelinePianoGeometry.test.ts. - MIDI recording visibility regression fixed on 2026-05-13: detached MIDI editor snapshots no longer replace the main window's full track object or overwrite main transport state. Main-window snapshot application now merges only the edited session clip, preserving newly recorded MIDI clips and live recording state. Focused regression coverage lives in
midiEditorSessions.test.ts,midiRecordingTransport.test.ts, and browser/CDPapp-midi-recording-visibilityevidence inqa/midi-editor/2026-05-13/recording-visibility. - Hardware MIDI recording input-default fix completed on 2026-05-13: empty MIDI input is now explicitly labeled
All Inputs; record start opens all available MIDI inputs for armed MIDI/instrument tracks in that mode, and the nativesetTransportRecording(true)path mirrors the same safety behavior before startingMIDIRecorder. Focused coverage lives inmidiRecordingTransport.test.tsand browser/CDPapp-midi-recording-visibility. - MIDI-only recording sync fix completed on 2026-05-13: record start now resyncs every armed track into the backend with
addTrack,setTrackType,setTrackRecordArm, monitor/input-channel state, and MIDI input state before transport recording starts. Native MIDI recording also gets an immediate timeline start time before the deferred audio-callback correction, so MIDI-only takes no longer depend on an armed audio track to establish recording timing. Focused coverage lives inmidiRecordingTransport.test.tsand browser/CDPapp-midi-recording-visibility. - Piano-roll insert velocity and acoustic-feedback controls have browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json: visible insert velocity drives drawn-note velocity, audition sends balanced note-on/note-off calls, inserted notes undo/redo correctly, and disabling audition suppresses preview calls while insertion and undo/redo still work. - Piano-roll navigation tools have browser/CDP evidence in
qa/midi-editor/2026-05-12/implementation/midi-editor-acceptance-report.json: zoom clicks change horizontal zoom, pan drag scrolls a long editable source window, and the line tool opens the visible controller dialog without prompt calls. - Piano-roll domain helpers are extracted out of
PianoRoll.tsx: MIDI note IDs/event sorting/note-pair parsing/selected-note rebuilds/note-metadata lane mutation live infrontend/src/utils/midiNotes.ts, note naming/scale-guide helpers live infrontend/src/utils/pianoRollPitch.ts, special lane sentinels/presets/scalar-event mappings live infrontend/src/utils/pianoRollLanes.ts, velocity color mapping lives infrontend/src/utils/pianoRollVelocity.ts, and tool-strip definitions live infrontend/src/utils/pianoRollTools.ts. The visible key strip now lives in statelessfrontend/src/components/PianoRollToolbar.tsx, the visible info/readout row lives in statelessfrontend/src/components/PianoRollInfoLine.tsx, the editor-pane status strip lives in statelessfrontend/src/components/PianoRollStatusStrip.tsx, the inspector summary/note-selection sections live in statelessfrontend/src/components/PianoRollInspectorSummary.tsxandfrontend/src/components/PianoRollNoteInspectorSection.tsx, and the controller-lane inspector sections live in statelessfrontend/src/components/PianoRollControllerLaneSection.tsx,frontend/src/components/PianoRollLaneEditorSection.tsx, andfrontend/src/components/PianoRollPitchBendSection.tsx. These have focused unit coverage plus browser/CDP regression coverage through the relevant piano scenarios. - Piano-roll stage capture now routes controller lanes, controller nodes, velocity lanes, grid starts, note starts, and loop-boundary starts through the shared
hitTestPianoRoll()/gestureKindForHit()target model. Range selection is explicitly allowed to start from grid, note, or loop-boundary targets, with browser proof inpiano-range. - Final automated QA pass for the current implementation completed on 2026-05-12:
npx tsc --noEmit, fullnpx vitest run(28 files / 151 tests),npm run build,cmake --build build --config Debug, native headlessOpenStudio.exe --automated-regression-headless --report qa/midi-editor/2026-05-12/implementation/native-automated-regression.jsonwithoverallPass=true,node --check tools/midi-editor-acceptance-harness.mjs, and full browser/CDPnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - Remaining timeline acceptance: manual REAPER workflow acceptance.
- Remaining piano-roll acceptance: manual Cubase workflow acceptance.
Detached MIDI Editor and Pop-Out Reliability Plan:
- Keep the detached MIDI editor as a secondary editor window, not a competing app instance with forked transport/project state.
- Main/native state remains authoritative for playback position, play/stop/record, MIDI clip data, source/loop limits, and undo history.
- Detached MIDI windows render synced per-session snapshots and route final edits, source changes, quantize, undo/redo, ruler seek, and transport commands back to the main/native authority.
- Keep only one warm MIDI editor shell, and only while a MIDI clip is open in the attached/docked editor. Do not prewarm one shell per MIDI track or per MIDI clip.
- Keep mixer/channel-strip pop-out to a single reusable mixer shell, never one hidden shell per track/channel.
- Detached snapshots must not own
currentTimeorisPlaying; all windows should use the shared transport event/command path with smooth visual interpolation from the latest native transport sample. - Detached MIDI ruler click/drag, Space, Stop, Ctrl+R, Q, Ctrl+Z, Ctrl+Y, and Ctrl+Shift+Z must route to shared commands so the main timeline, docked editor, and all detached editors agree.
- If an edited MIDI clip moves sideways on the same track, open editor sessions must re-read the new
clip.startTime, keep source-time notes unchanged, and update project-time note/ruler positions. - If an edited MIDI clip moves to another MIDI/instrument track, open editor sessions for that
clipIdmust update theirtrackId; detached snapshot merges must resolve the current clip location byclipIdand must not resurrect the clip onto a stale old track. - If the edited clip is deleted, converted, or moved to an incompatible/non-MIDI track, close or invalidate the editor session instead of rendering stale data.
- Preserve detached MIDI native close reasons end-to-end:
dockkeeps the session alive and hides/reuses the shell,closeremoves the session, andappQuitavoids re-opening or stale callback handling. - Add horizontal-resize cursor feedback for draggable source/loop start/end markers while keeping loop/source drag commits undoable through
setMIDIClipSourceWindow().
Findings captured before implementation:
- The first detached window is slow because a fresh WebView currently boots the frontend shell and hydrates its session. The warm-shell fix must create at most one hidden MIDI editor shell while the bottom/docked editor is open, then reuse it for pop-out.
- Detached MIDI and mixer windows currently receive lower-frequency transport samples than the main window, which explains laggy or apparently behind playheads. They need shared transport commands plus local visual interpolation from native samples.
- Detached ruler seek currently updates local editor state before the main timeline reliably receives the stopped-position update. Ruler seek must go through the shared seek path.
- Dock crashes are likely caused by native close reason loss and WebView teardown while the frontend expects a
docktransition. The mainmidiEditorWindowClosedhandler must branch on the preserved reason. - Same-track clip movement is conceptually source-time safe because notes remain relative to the MIDI source, but detached sessions must refresh from the current
clip.startTime. - Cross-track clip movement is not safe while sessions store stale
trackId; merges must resolve by currentclipIdlocation in the main store.
Required verification for this slice:
- Unit coverage for warm-shell lifecycle, transport fields excluded from MIDI snapshots, same-track and cross-track clip movement, stale detached snapshot merge prevention, deleted/incompatible clip invalidation, dock-vs-close reasons, detached undo/redo delegation, and loop-boundary hover cursor.
- Browser/CDP coverage for repeated pop-out/dock without crash, detached playhead smoothness/alignment, detached ruler seek updating the main timeline, main Stop stopping detached visuals, edited clip sideways/cross-track movement, detached Ctrl+Z/Ctrl+Y, loop/source hover cursor, and proof that many MIDI clips do not create many hidden warm shells.
- Before manual testing, run the latest code through
cmake --build build --config Debug; the user will test withpython build.py dev --run, so no Codex-started Vite/browser process should be left running.
This plan has been reopened as a recovery/rebuild tracker. The previous automated implementation pass did not meet hands-on acceptance: MIDI timeline clips cannot be reliably moved, resized, slipped, or loop-extended in the real UI, the piano roll still reads as an old prompt-heavy editor rather than a polished DAW key editor, and the prior test pass did not cover browser/WebView pointer behavior or visual quality.
midi_editor_reference_matrix.md is now a required companion deliverable before additional editor work is marked complete. It must document the REAPER arrange and Cubase Key Editor behaviors we are copying conceptually, Studio13's current behavior, the required Studio13 behavior, the owner area, and the acceptance test.
Research correction, 2026-05-11: visual research must show the actual DAW editor surfaces, not vendor websites or documentation chrome. The accepted local evidence is now captured in qa/midi-editor/2026-05-11/research/actual/, including REAPER MIDI editor/user-guide screenshots, Cubase Pro 15 Key Editor/controller-display screenshots, and openDAW source-file references. Future piano-roll/timeline work must cite those artifacts or new actual editor captures before claiming parity.
Superseded completion claims:
- Phase 4 timeline editing is reopened until real browser/WebView drag, resize, slip, loop-extension, split, duplicate, context, and undo acceptance passes.
- Phase 5 piano roll is reopened until the editor is rebuilt into a polished DAW-grade layout with reliable note tools, inspector, multi-item editing, and browser-tested interactions.
- Phase 7 controller lanes are reopened until controller lane rows, lane management, transforms, pitchbend ranges, and undoable editing are usable without prompt-driven workflows.
- Phase 9 QA is reopened until automated tests are backed by browser/WebView interaction QA, screenshots, and manual REAPER/Cubase workflow acceptance.
Rebuild Studio13 MIDI around a reliable DAW-grade signal path and editor model, using REAPER, Cubase, and openDAW as behavior references. Direct openDAW code copying is avoided by default because openDAW is AGPLv3; we will reimplement the concepts and UX patterns in Studio13's existing JUCE + React architecture.
This file is the execution tracker. Each phase is marked done only after implementation and verification for that phase pass.
Research sources:
- Cubase Quantize Panel and musical-grid options: https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/quantizing_midi_audio/quantizing_quantize_panel_c.html and https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/quantizing_midi_audio/quantizing_quantizing_panel_options_musical_grid_r.html
- Cubase controller, velocity, pitchbend, line-tool behavior: https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/midi_editors/midi_editors_controller_lanes_adding_t.html, https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/midi_editors/midi_editors_velocity_events_editing_t.html, https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/midi_editors/midi_editors_pitchbend_controller_lanes_r.html, https://www.steinberg.help/r/cubase-pro/15.0/en/cubase_nuendo/topics/midi_editors/midi_editor_line_tool_modes_r.html
- REAPER latest guide page and PDF: https://www.reaper.fm/userguide.php and https://www.reaper.fm/userguide/ReaperUserGuide772.pdf
- openDAW reference: https://github.com/andremichelle/openDAW
- User-provided REAPER MIDI workflow video: https://www.youtube.com/watch?v=Z4tfTzwlwyw. Direct transcript/video fetch may be blocked in the tool environment; when blocked, record that in
midi_editor_reference_matrix.mdand use visible/manual notes plus the related Reapertips MIDI editor workflow page.
- Replace the current flat MIDI clip/event scheduler with a canonical MIDI source model: MIDI item start/duration, source start, source length, loop enabled, loop offset, visible item window, note events, CC events, pitchbend events, channel data, muted/locked state, probability, velocity variance, and undo snapshots.
- Implement REAPER-style timeline MIDI items: resize-left trims/slips source, resize-right extends item, expansion beyond source loops by default, loop boundaries/notches are visible, and piano roll can edit source length separately from item length.
- Implement Cubase-style Key Editor behavior: double-click MIDI item opens piano roll, note insert/move/resize/split/glue/mute/delete, acoustic preview, multi-note selection, selected-note inspector, scale guides, pitch quantize to scale, and active/editable/visible multi-item editing.
- Implement controller lanes for Velocity, Note-Off Velocity, Velocity Variance, Pitchbend, Modulation CC1, Expression CC11, Sustain CC64, Program/Bank, Aftertouch, Poly Pressure, and arbitrary 7-bit/14-bit CCs.
- Controller lanes support Cubase/REAPER editing: add/remove lanes, lane presets, draw single events, paint sweeps, line/parabola/sine/triangle/square tools, step vs ramp/curve interpolation, curve handles, scale/tilt/compress/stretch selection editor, LFO generation, thinning/reducing dense CC data, copy/paste between lanes, and per-lane height controls.
- Pitchbend lane supports bipolar display, MIDI value mode, semitone/cents display, per-track pitchbend range up/down, linked/unlinked range, semitone grid, snap pitchbend events to semitone grid, and correct 14-bit MIDI pitch wheel serialization.
- Quantize supports Cubase and REAPER workflows: quantize note starts, note ends, note lengths, starts + ends, fixed lengths, soft/iterative strength, swing, tuplets, catch range, safe range/non-quantize zone, rough/randomize, move related controllers with notes, reset/unquantize, freeze quantize, groove presets, input quantize, and "quantize using last settings."
- Add humanize and performance tools: timing humanize, velocity humanize, velocity scale/compress/tilt, legato, remove overlaps, note length clamp, transpose/octave actions, step input, MIDI panic, chase note/CC/program/pitchbend on playback seek, and all-notes-off on stop/mute/delete/type change.
- Rebuild the MIDI signal path contract: project load and track creation must atomically sync backend track id, type, instrument, MIDI input/output, track FX, MIDI clips, controller data, and scheduler diagnostics before playback can report success.
- Fix saved MIDI projects going silent by explicitly syncing loaded
midiClipstosetTrackMIDIClips, restoring backend track type before arm/monitor state, restoring MIDI routing, and validatingscheduledMIDIClipCount/scheduledMIDIEventCountafter load. - Fix loud crack on adding MIDI/instrument tracks by adding an atomic backend track creation/config bridge, preventing default-audio half-initialized tracks from entering the realtime graph, clearing buffers, resetting plugin state, suppressing hardware input until type/routing sync completes, and sending all-notes-off/all-sound-off during transitions.
- Add openDAW-equivalent concepts where useful: loopable note regions, note chance/play count/velocity/cent metadata, MIDI Output device, SoundFont/basic sampler path, built-in MIDI FX for Arpeggio, Pitch, Velocity, Time/Groove, and a scriptable MIDI transform foundation.
- Phase 0: Create this plan file with research links, checklist, current repo findings, and a phase log format.
- Phase 1: Build MIDI regression fixtures for fresh MIDI track playback, instrument track playback, saved-project reload playback, looped item playback, controller playback, pitchbend playback, and add-track crack detection.
- Phase 2: Repair backend/frontend MIDI signal path first: atomic track creation/config, project-load MIDI resync, scheduler diagnostics, all-notes-off handling, MIDI output routing, offline render/freeze MIDI parity, and crack prevention.
- Phase 3: Replace the MIDI clip data model and migration layer with source/loop/item semantics while preserving old project compatibility through a deterministic migration on load.
- Phase 4: REOPENED - Rebuild timeline MIDI item editing with REAPER-style resize, trim, slip, loop expansion, source-length editing, loop notches, context actions, and single undo command per drag gesture. Mark done only after real browser/WebView pointer acceptance.
- Phase 5: REOPENED - Rebuild Piano Roll / Key Editor with reliable note editing, source extension from the editor, multi-item editing, scale/chord helpers, note inspector, preview, selection tools, and viewport ergonomics. Mark done only after visual and interaction acceptance.
- Phase 6: Implement Cubase/REAPER quantize, humanize, fixed length, groove, input quantize, reset/freeze quantize, and "move controllers with notes."
- Phase 7: REOPENED - Implement controller lanes, velocity tools, pitchbend semitone grid, modulation/CC tools, curve editor, lane presets, LFO, 14-bit CC, and controller chase. Mark done only after prompt-free lane workflow acceptance.
- Phase 8: Implement instrument-track completeness: built-in MIDI FX, MIDI output device, SoundFont/basic sampler support if no instrument plugin is loaded, robust plugin state restore, and MIDI render/freeze.
- Phase 9: REOPENED - Full QA pass: Vitest, TypeScript no-new-errors check, C++ Debug build, headless MIDI render harnesses, saved-project reload tests, crack/spike detection, browser/WebView pointer tests, screenshots, manual Cubase/REAPER parity checklist, then mark all phases done in this file.
- Create and maintain
midi_editor_reference_matrix.mdwith REAPER arrange, Cubase Key Editor, Reapertips/video, openDAW visual reference, current Studio13 gaps, required behavior, owner area, and acceptance tests. - Replace the MIDI clip interaction path with a shared audio/MIDI timeline gesture path that does not lose state on global mouseup and commits one undoable command per completed gesture.
- Browser-test MIDI clip select, move, snap move, copy-drag, left resize/source slip, right resize/loop expansion, Alt-slip, split, duplicate, delete, context actions, and Ctrl+Z/Ctrl+Y. 2026-05-12 partial pass: browser/CDP pointer QA verified MIDI item select, Ctrl multi-select, move with undo/redo, snap move, compatible cross-track move to an instrument track with undo/redo, compatible cross-track copy-drag with undo/redo, incompatible audio-target suppression, ghost MIDI-track creation with undo/redo, right-edge loop resize with undo/redo, left trim/source slip with backend-visible source-window serialization and undo/redo, Alt-slip with backend-visible source-window serialization and undo/redo, same-track copy-drag with undo/redo, split with undo/redo, context duplicate/delete with undo/redo, prompt-free repeat dialog with undo/redo, keyboard Ctrl+D duplicate with undo/redo, keyboard Delete with undo/redo, app-level Ctrl+Z undo, app-level Ctrl+Y redo, mute-tool click with undo/redo, context lock with undo/redo, locked-item move suppression, source-offset reset with undo/redo, source-length-to-item with undo/redo, source-length-to-content with undo/redo, custom source-length dialog with undo/redo, backend bridge payload serialization after a loop-resize, and native render proof for a combined resolved MIDI payload. Manual acceptance remains open.
- Rebuild the piano roll into a polished Cubase-style key editor surface with tool strip, grid, piano keyboard, note inspector, controller lane stack, and status/readout strip. 2026-05-12 partial pass: shell, stateless visible toolbar/info-line/status-strip/inspector-summary/note-inspector/controller-lane/lane-editor/pitchbend component splits, lane stack controls, lane hit testing, shared stage capture for grid/note/loop/controller/velocity targets, MIDI note-model/pitch-scale/lane-mapping/velocity-color/tool-registry helper extraction, note drag undo/redo, draw/erase/resize/split/glue/mute/velocity undo-redo QA, range select, active/reference multi-item browser QA with isolated undo/redo, inspector pitch/start/length/metadata full-chain undo-redo and batch undo-redo QA, velocity-lane direct and ramp/undo-redo QA, CC#1/CC#74 controller direct/ramp/step/curve/parabola/transform/compress/stretch/thin/copy/clear/paste/cross-lane-paste/LFO browser QA, 14-bit CC edit QA, pitchbend line/direct snap QA, program/channel pressure/poly pressure lane QA, lane hide/add/configure QA, pitchbend range-control undo/redo QA, project save/reload QA, MIDI FX/chance/variance backend-bound render/export-input QA, MIDI FX header-to-FX-panel placement QA, native backend chase/render/freeze/export/combined-render QA, and viewport screenshot QA are implemented; remaining gap is complete DAW workflow parity.
- Replace prompt-based piano-roll MIDI/controller transforms with popovers, menus, numeric inputs, segmented controls, sliders, lane menus, and icon buttons.
- Capture screenshots and manual acceptance notes before marking reopened phases complete. 2026-05-12 automated screenshots/reports live under
qa/midi-editor/2026-05-12/implementation/; manual acceptance notes remain open.
Implementation target for the next acceptance slice:
- Replace the old toolbar-first piano roll with a Cubase-style Key Editor shell: icon tool strip, editor grid, persistent right inspector, controller lane stack, and status/readout strip.
- Add frontend editor state for expanded tools, visible lane rows, active lane selection, lane heights, interpolation, and lane presets.
- Route note metadata editing through the inspector, including batch edits for velocity, channel, release velocity, chance, variance, play count, and cent offset.
- Formalize note/grid/lane hit testing and gesture session classification so pointer behavior can be browser-tested instead of inferred from store-only tests.
- Keep reopened Phase 5 and Phase 7 incomplete until browser/WebView screenshots and manual interaction checks pass.
Phase 1 regression fixtures:
- Native MIDI scheduler fixture for scheduled notes, CC, pitchbend, program change, channel pressure, finite output, and no audio spike on plain MIDI tracks.
- Native fallback instrument fixture for finite nonzero instrument-track audio without a plugin.
- Frontend saved-project reload schedule-repair fixture for missing backend MIDI clips/events.
- Native add-track first-block silence fixture for newly added MIDI and instrument tracks.
- Saved-project reload playback fixture.
- Dedicated add-track crack/spike fixture while audio callback is active.
Phase 2 signal path:
- Atomic backend track creation with explicit
audio/midi/instrumenttype. - Project-load MIDI clip resync and scheduler mismatch repair.
- Expanded MIDI diagnostics with scheduled clip/event counts, routing, devices, and fallback instrument state.
- MIDI panic/all-notes-off/all-sound-off/reset-controller handling.
- MIDI chase for notes, CC, pitchbend, pressure, and program state.
- Compact per-track MIDI output routing UI.
- Offline render/freeze MIDI parity validation.
- Crack/spike harness and threshold reporting.
Phase 3 MIDI source model:
- Source length/source start/loop offset/loop length metadata for MIDI clips.
- Legacy source-length inference for old projects.
- Backend serialization respects visible item windows and loop expansion.
- Full deterministic saved-project migration test matrix.
Phase 4 timeline editing:
- Live resize preview with one undoable commit per drag gesture.
- REAPER-style loop expansion preservation and loop-notch rendering.
- MIDI slip editing and source-window context actions.
- More loop/trim edge-case regressions.
Phase 5 Piano Roll:
- Note add/move/resize/delete, source-length extension, velocity editing, range editing, and step input.
- Pitchbend lane draw/edit and pitchbend semitone grid/snap.
- Multi-clip ghost rendering groundwork.
- Single-note inspector for pitch, start, length, and velocity edits.
- Editable/visible multi-item editing controls.
- Deeper scale/chord assistant polish.
Phase 6 quantize/humanize:
- Quantize starts, ends, starts+ends, length, fixed length, strength, swing, randomize, and move related controllers.
- MIDI input quantize for completed recordings.
- Quantize using last MIDI settings.
- Reset/unquantize and freeze quantize for MIDI clips with undoable quantize backups.
- Humanize timing and velocity, velocity set/scale/randomize, legato, mute, transpose, invert, reverse, mirror.
- Tuplet quantize, catch range, and safe/non-quantize zones.
- Groove presets.
Phase 7 controller lanes:
- Pitchbend as correct 14-bit MIDI pitch wheel events.
- Arbitrary 7-bit CC lane selection.
- 14-bit CC MSB/LSB lane mode for CC0-31.
- Line, sine, triangle, square, saw-up, and saw-down controller generation.
- Controller thinning/reduction for CC and pitchbend.
- Copy/paste between controller lanes with normalized values across CC, 14-bit CC, and pitchbend targets.
- Program change and channel pressure lanes with draw, line/LFO generation, thinning, copy/paste, backend scheduling, and MIDI export parsing.
- Bank select lane presets and poly pressure backend scheduling/export parsing.
- Velocity/controller lane height controls.
- Lane add/remove controls, curve handles, and piano-roll poly pressure note-specific lane editing.
Phase 8 instrument tracks:
- Built-in fallback
Studio13 Basic Synthfor instrument tracks with no plugin. - Fallback synth exposed in track header, channel strip, FX chain, and diagnostics.
- Per-track MIDI output device selection.
- MIDI FX: arpeggiator, pitch, velocity, time/groove, exposed through the track FX panel instead of compact TCP buttons.
- SoundFont/basic sampler support and instrument render/freeze QA.
- Frontend Vitest: MIDI migration, clip serialization, loop expansion, timeline hit/resize behavior, quantize algorithms, controller lane editing, project load resync, undo/redo grouping.
- Browser/WebView QA: create or load MIDI clips and verify actual pointer gestures for select, move, snap, copy-drag, left/right resize, slip edit, loop extension, split, duplicate, undo, and redo.
- C++/headless tests:
setTrackMIDIClipsscheduling, loop expansion, note/CC/pitchbend chase, all-notes-off, MIDI output routing, instrument render, freeze, and no duplicate track IDs. - Integration fixtures: save a project with MIDI clips + instrument + CC/pitchbend, reload it, assert backend diagnostics show scheduled MIDI events and render contains non-silent output.
- Crack regression: add MIDI and instrument tracks while audio callback is active and assert no non-finite samples, no oversized transient, no stale reusable buffer leakage, and no hardware input read before type sync.
- Manual acceptance: reproduce REAPER resize/loop behavior, Cubase quantize panel behavior, velocity lane editing, modulation drawing, pitchbend snapping, project reload playback, and add-track silence.
- Studio13 may replace the current MIDI implementation completely, but unrelated user changes in the dirty worktree must not be reverted.
- Direct AGPL openDAW code copying is not the default; implementation will copy concepts and UX behavior unless the project explicitly accepts AGPL obligations.
- MIDI and instrument reliability is higher priority than preserving the current broken MIDI editor internals.
- Existing known TypeScript errors outside the touched MIDI path are not blockers, but no new MIDI-related TypeScript errors should be introduced.
- Automated QA alone is not complete for this feature; browser/WebView pointer QA, screenshots, and subjective DAW feel remain required acceptance gates.
- 2026-05-14: Completed the Detached MIDI Editor and Pop-Out Reliability slice. Native MIDI editor windows now preserve close reasons (
dock,close,appQuit, warm-shell disposal); docking hides/reuses the session shell instead of destroying the session; the main window prewarms only the current docked MIDI editor session; detached snapshots excludecurrentTime/isPlaying; detached transport/ruler/hotkey commands route to the main/native authority; detached and mixer windows use shared 60fps transport interpolation; MIDI clip moves update open editor sessions byclipId; stale detached snapshots merge into the clip's current track instead of resurrecting old-track data; deleted MIDI clips close their editor sessions; detached clip-data snapshots create main undo/redo entries; and loop/source boundaries expose a horizontal resize cursor. Verification passed:npx tsc --noEmit, fullnpx vitest run(31 files / 170 tests),node --check tools/midi-editor-acceptance-harness.mjs, focused browser/CDPapp-midi-multi-sessioninqa/midi-editor/2026-05-14/detached-midi-reliability-focused-final, full browser/CDP--scenario allinqa/midi-editor/2026-05-14/detached-midi-reliability-all-final,npm run build, andcmake --build build --config Debugafter the frontend build so the Debug app output contains the latest packaged frontend. The temporary Vite server used for browser QA was stopped before handoff. - 2026-05-13: Fixed a MIDI recording visibility regression introduced by the multi-session editor sync. Detached editor snapshots now merge only the session clip into the main window track instead of replacing the whole track, and main-window transport is no longer overwritten by stale detached snapshots while recording. Added focused regression coverage proving a live MIDI recording item appears at record start and a completed backend MIDI recording is appended to
track.midiClipson stop. Verification passed:npx vitest run src/__tests__/midiRecordingTransport.test.ts src/__tests__/midiEditorSessions.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, and browser/CDPnode tools/midi-editor-acceptance-harness.mjs --scenario app-midi-recording-visibility --out qa/midi-editor/2026-05-13/recording-visibility. - 2026-05-13: Fixed the hardware MIDI input default that could make Komplete M32/Komplete Kontrol style recording appear to do nothing. The track input selector now says
All Inputsinstead ofNo Device; frontend record start opens every available MIDI input for armed MIDI/instrument tracks using that empty-input mode; and the C++ record-start path opens the explicit track input or all available inputs before starting the in-memory MIDI recorder. Verification passed: focusedmidiRecordingTransport.test.tsandnode --check tools/midi-editor-acceptance-harness.mjs. - 2026-05-13: Fixed MIDI-only recording where a freshly added/armed MIDI track could fail unless an audio track was also armed. Record start now forces backend track/type/arm/input sync for all armed tracks before recording starts, and native MIDI recorder start time is initialized immediately from the transport position. Verification passed: focused
midiRecordingTransport.test.ts, browser/CDPapp-midi-recording-visibilityinqa/midi-editor/2026-05-13/recording-midi-only-sync,npx tsc --noEmit, fullnpx vitest run(31 files / 166 tests),npm run build, andcmake --build build --config Debug. - 2026-05-13: Completed the Multi-Session MIDI Editor and Timeline Parity pass. Replaced singleton Piano Roll state with
MidiEditorSessionrouting, kept one docked editor while opening additional clips in detached session windows, added session-aware native MIDI editor window callbacks/snapshots, retitled docked/windowed headers toTrack Name - Clip Name, renamed the toolbar action toPop Out, added MIDI ruler playhead continuity and ruler-click seek, and made piano-key drag audition pointer-captured with cleanup note-offs. Verification passed:npx tsc --noEmit, fullnpx vitest run(30 files / 163 tests),node --check tools/midi-editor-acceptance-harness.mjs, focused browser/CDPapp-midi-multi-sessionandapp-docked-piano-focus, full browser/CDPnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-13/multi-session-all-final,npm run build, andcmake --build build --config Debug. The temporary Vite server used for browser QA was stopped before handoff. - 2026-05-13: Completed the Piano Roll parity/usability pass requested after REAPER comparison and manual review. Restored piano keys inside the TCP-width left area while keeping the note grid aligned under the arrange timeline, added a compact ruler, visible grid scrollbars, 85% lower-zone resize cap, single selected controller lane rendering with a header lane selector, visible Quantize/Q controls, draggable source loop end markers, tooltip/aria coverage for the touched controls, and a native detached
midiEditorwindow role with active-clip snapshot sync. Verification passed:npx tsc --noEmit, fullnpx vitest run(29 files / 157 tests),node --check tools/midi-editor-acceptance-harness.mjs, focused browser/CDPapp-docked-piano-focus,piano-visual-viewports,piano-source-header,piano-controller-lane,piano-cc-direct,piano-pitchbend-direct,piano-tools,piano-range,piano-audition-insert, fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-13/piano-parity-pass-all,npm run build, andcmake --build build --config Debug. The temporary Vite server used for browser QA was stopped before handoff. - 2026-05-12: Completed code-review cleanup for the MIDI/instrument implementation slice. Added
/qa/to.gitignoreso generated browser screenshots, reports, native regression JSON, and research captures stay local instead of entering git. Replaced the instrument-track sampler root-notewindow.promptwith an in-app numeric dialog and extendedmidi-fx-placementto verify the dialog flow does not callwindow.prompt. Fixed instrument plugin remove/undo so instrument tracks remain instrument tracks and continue using the fallback synth path after a plugin is removed. Added store regressions for instrument plugin load undo and remove undo/redo. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(28 files / 153 tests), focusedmidi-fx-placement, full browser/CDPnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 32 scenarios, andcmake --build build --config Debug. - 2026-05-12: Addressed manual TCP parity feedback for MIDI/instrument tracks. Removed the always-visible
Arp/Pit/Vel/TimMIDI FX buttons fromTrackHeaderand movedMIDIFXControlsinto the normal track FX chain panel so the header stays closer to REAPER/Cubase track controls while MIDI FX remains available. Added browser/CDPmidi-fx-placementacceptance to verify the header has no MIDI FX mini-buttons and the FX panel exposes them. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(28 files / 151 tests), focusedmidi-fx-placement, focusedmidi-fx-controls, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 32 scenarios. - 2026-05-12: Strengthened
midi-fx-placementafter manual App retest feedback. The scenario now checks both the standaloneTrackHeaderfixture and the actual App TCP with one MIDI track plus one instrument track; both rows must omitArp/Pit/Vel/Tim, while the FX panel still exposes MIDI FX. Verification passed:node --check tools/midi-editor-acceptance-harness.mjsandnode tools/midi-editor-acceptance-harness.mjs --scenario midi-fx-placement --out qa/midi-editor/2026-05-12/header-recheck-app. - 2026-05-12: Tightened
python build.py dev --runfreshness after the same retest feedback. Vite is now launched with--strictPorton127.0.0.1, so an old server on port 5173 cannot silently satisfy the readiness check while a new Vite process moves to another port. Verification passed:python -m py_compile build.py. - 2026-05-12: Completed the final automated QA pass for the current MIDI editor implementation slice before manual acceptance. Verification passed:
npx tsc --noEmit, fullnpx vitest run(28 files / 151 tests),npm run build(passed with existing Vite chunk/dynamic-import warnings only),cmake --build build --config Debug, native headlessbuild/OpenStudio_artefacts/Debug/OpenStudio.exe --automated-regression-headless --report qa/midi-editor/2026-05-12/implementation/native-automated-regression.jsonwithoverallPass=true,node --check tools/midi-editor-acceptance-harness.mjs, and full browser/CDPnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. Reopened acceptance phases remain open only becausemidi_editor_reference_matrix.mdrequires explicit manual REAPER/Cubase acceptance notes before rows becomeaccepted. - 2026-05-13: Tightened manual-test handoff rules after stale packaged UI was seen during manual retest. The attempted
build.py/MainComponent.cppdev-server fallback guard was reverted as too broad for this feature work. The standing rule is documented inAGENTS.mdandWORKFLOWS.md: before manual testing, completecmake --build build --config Debug, make sure latest assets are current when packaged fallback could be used, require no pre-running server from the user, and stop any Codex-started Vite/npm/browser harness processes. - 2026-05-13: Completed the Piano Roll layout/alignment/source-length control slice requested after manual UI review. The FX panel MIDI FX strip now uses
.fx-midi-sectionspacing aligned with loaded FX cards. The docked Piano Roll left sidebar sits under the TCP at exactlytcpWidth, the editor canvas starts after the same 6px timeline divider, containerResizeObserverupdates canvas height when the lower zone grows, sidebar wheel scrolling is isolated from grid scrolling, and horizontal Piano Roll geometry now follows arrangepixelsPerSecond/scrollXin project-time coordinates. Added visible source controls for active clip name, source length, item length,Source = Item,Source = Content, andLoop; source edits use undoablesetMIDIClipSourceWindow()and preserve events beyond the shortened source end. Verification passed:npx tsc --noEmit, fullnpx vitest run(29 files / 156 tests), focused browser scenariosapp-docked-piano-focus,piano-visual-viewports,piano-source-header,piano-navigation-tools,midi-fx-placement, fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-13/piano-layout-source, andcmake --build build --config Debug. - 2026-05-12: Completed the remaining Piano Roll inspector component split. Controller lane rows/add controls now live in stateless
frontend/src/components/PianoRollControllerLaneSection.tsx, lane selection/CC14/poly-pressure/line/LFO/transform/copy/paste/clear controls live infrontend/src/components/PianoRollLaneEditorSection.tsx, and pitchbend range/snap controls live infrontend/src/components/PianoRollPitchBendSection.tsx; the parent keeps state, command, and undo-bound callbacks. Addedfrontend/src/__tests__/pianoRollLaneInspectorSections.test.tsusing server-side React rendering for lane rows, add controls, lane editor commands, poly-pressure note selection, and pitchbend fields. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollLaneInspectorSections.test.ts src/__tests__/pianoRollInspectorSections.test.ts src/__tests__/pianoRollLanes.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, focused browserpiano-lane-management,piano-controller-lane,piano-cc-direct,piano-pitchbend-direct, andpiano-advanced-lanes, fullnpx vitest run(28 files / 151 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Started the Piano Roll inspector split. The top inspector summary now lives in stateless
frontend/src/components/PianoRollInspectorSummary.tsx, and the note-selection editor section now lives in statelessfrontend/src/components/PianoRollNoteInspectorSection.tsx, keeping note pitch/start/length/velocity/channel/release/chance/variance/play-count/cent-offset handlers in the parent. Addedfrontend/src/__tests__/pianoRollInspectorSections.test.tsusing server-side React rendering for summary fallbacks, selected-note fields, and the empty-selection hint. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollInspectorSections.test.ts src/__tests__/pianoRollInfoLine.test.ts src/__tests__/pianoRollStatusStrip.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, focused browserpiano-inspector,piano-visual-viewports, andpiano-note-metadata-lanes, fullnpx vitest run(27 files / 147 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Split the Piano Roll editor-pane status strip out of
PianoRoll.tsxinto statelessfrontend/src/components/PianoRollStatusStrip.tsx, covering Tool, Snap, Cursor, Source, and Lane display fields while reusing the tested tool registry for labels. Addedfrontend/src/__tests__/pianoRollStatusStrip.test.tsusing server-side React rendering to assert field values, order, and empty-cursor formatting. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollStatusStrip.test.ts src/__tests__/pianoRollInfoLine.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, focused browserpiano-visual-viewports,piano-navigation-tools, andpiano-basic, fullnpx vitest run(26 files / 144 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Split the visible Piano Roll info/readout row out of
PianoRoll.tsxinto statelessfrontend/src/components/PianoRollInfoLine.tsx, covering Type, Start, Length, Value, Channel, Chance, Lane, and Curve display fields. Addedfrontend/src/__tests__/pianoRollInfoLine.test.tsusing server-side React rendering to assert the field order and aria label. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollInfoLine.test.ts src/__tests__/pianoRollTools.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, focused browserpiano-visual-viewports,piano-inspector, andpiano-basic, fullnpx vitest run(25 files / 142 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Split the visible Piano Roll key strip out of
PianoRoll.tsxinto statelessfrontend/src/components/PianoRollToolbar.tsx, keeping the store subscriptions and DAW editing commands in the parent while the component owns the tool buttons, scale controls, zoom slider, audition/insert velocity controls, step input controls, clip selector, and ghost/reference toggles. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollTools.test.ts src/__tests__/pianoRollInteraction.test.ts,node --check tools/midi-editor-acceptance-harness.mjs, focused browserpiano-tools,piano-navigation-tools,piano-audition-insert, andpiano-basic, fullnpx vitest run(24 files / 141 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened explicit piano-roll capture targets.
handleStageMouseDown()now dispatches controller, controller-node, velocity-lane, grid, note, and loop-boundary starts from the sharedhitTestPianoRoll()target instead of falling back to raw y/x checks; range selection now explicitly starts from grid, note, or loop-boundary targets. The first full browser pass caught apiano-rangeregression at the source loop boundary, which was fixed and rerun. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollInteraction.test.ts, focused browserpiano-range,piano-tools,piano-navigation-tools,piano-cc-direct, andpiano-note-metadata-lanes, fullnpx vitest run(24 files / 141 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Extracted piano-roll tool-strip definitions from
PianoRoll.tsxintofrontend/src/utils/pianoRollTools.ts, keeping tool order, labels, shortcuts, and icon components in a tested registry. AddedpianoRollTools.test.ts. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollTools.test.ts src/__tests__/pianoRollVelocity.test.ts src/__tests__/pianoRollInteraction.test.ts, focused browserpiano-basic,piano-tools, andpiano-navigation-tools, fullnpx vitest run(24 files / 141 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Extracted piano-roll velocity color helpers from
PianoRoll.tsxintofrontend/src/utils/pianoRollVelocity.ts, covering the note fill heat gradient and thresholded note outline colors. AddedpianoRollVelocity.test.ts. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollVelocity.test.ts src/__tests__/pianoRollPitch.test.ts src/__tests__/pianoRollLanes.test.ts, focused browserpiano-basic, focused browserpiano-toolsandpiano-velocity-lineafter rerunning solo to avoid CDP contention, fullnpx vitest run(23 files / 139 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Extracted piano-roll lane sentinel and mapping helpers from
PianoRoll.tsxintofrontend/src/utils/pianoRollLanes.ts, including special negative lane IDs, CC presets, scalar MIDI event lane mapping/naming, and note-metadata lane mapping. AddedpianoRollLanes.test.ts. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollLanes.test.ts src/__tests__/pianoRollPitch.test.ts, focused browserpiano-advanced-lanes, focused browserpiano-note-metadata-lanes(after rerunning solo to avoid CDP contention), fullnpx vitest run(22 files / 137 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Extracted piano-roll pitch and scale helpers from
PianoRoll.tsxintofrontend/src/utils/pianoRollPitch.ts, including note names, scale display names, MIDI pitch label formatting, and scale-guide membership. AddedpianoRollPitch.test.ts. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/pianoRollPitch.test.ts src/__tests__/midiNotes.test.ts, focused browserpiano-basic, focused browserpiano-visual-viewports(after rerunning solo to avoid CDP contention), fullnpx vitest run(21 files / 134 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Continued the piano-roll architecture extraction.
PianoRoll.tsxnow reusesfrontend/src/utils/midiNotes.tsfor note IDs, event sorting, note-pair parsing, and selected-note drag rebuilds with audition-pair output instead of keeping duplicated note-model logic locally. Focused utility coverage now asserts rebuilt audition-pair identity. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/midiNotes.test.ts src/__tests__/pianoRollInteraction.test.ts, focused browserpiano-basic, focused browserpiano-tools, fullnpx vitest run(20 files / 132 tests),node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Began the next piano-roll architecture extraction. Note-metadata lane helpers for value display, lane metadata, and note event mutation moved from
PianoRoll.tsxintofrontend/src/utils/midiNotes.ts, with focused utility coverage added inmidiNotes.test.ts. Verification passed:npx tsc --noEmit, focusednpx vitest run src/__tests__/midiNotes.test.ts, fullnpx vitest run(20 files / 132 tests), focusedpiano-note-metadata-lanes, focusedpiano-controller-lane,node --check tools/midi-editor-acceptance-harness.mjs, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened piano inspector history acceptance.
piano-inspectornow verifies the full single-note inspector sequence for pitch, start, length, velocity, channel, note-off velocity, chance, velocity variance, play count, and cent offset can be undone back to the original MIDI note state and redone back to the edited state exactly before the mixed multi-note batch-velocity undo/redo check. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs, focusedpiano-inspector,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened controller-lane workflow history acceptance.
piano-controller-lanenow verifies curve generation, value/time transform, stretch transform, thinning, cross-lane paste, clear, same-lane paste, and sine LFO generation each undo to the prior CC state and redo to the edited state. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-controller-lane, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened timeline ghost-track drop acceptance.
timeline-drop-targetsnow verifies dragging a MIDI item into the ghost lane creates a new MIDI track and moves the item, undo removes the ghost track and restores the clip to the source track, and redo recreates the compatible MIDI target and move. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-drop-targets, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened advanced lane generated-event history acceptance.
piano-advanced-lanesnow verifies pitchbend line, 14-bit CC line, program line, bank MSB/LSB lines, channel pressure line, and poly pressure line each undo to the prior generated-event state and redo to the generated state before backend-bound serialization is checked. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-advanced-lanes, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened note metadata lane undo/redo acceptance.
piano-note-metadata-lanesnow verifies note-off velocity, chance/probability, and velocity-variance direct lane drags each undo and redo exactly across their MIDI metadata fields. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-note-metadata-lanes, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened direct controller lane redo acceptance.
piano-cc-directnow verifies CC#1 and arbitrary CC#74 direct pointer draws undo exactly and redo exactly while preserving backend-bound serialization, andpiano-pitchbend-directnow verifies direct snapped pitchbend drawing redoes exactly after undo. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-cc-directandpiano-pitchbend-direct, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened Piano Roll lane-management pitchbend range history acceptance.
piano-lane-managementnow verifies linked toggle undo/redo, linked range edit undo/redo, unlinked toggle undo/redo, and unlinked down-range edit undo/redo around the pitchbend range controls. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-lane-management, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened Piano Roll insert/audition history acceptance.
piano-audition-insertnow verifies insert-velocity note drawing with audition enabled undo/redoes the inserted note, and drawing while audition is disabled undo/redoes the inserted note without emitting preview calls. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-audition-insert, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened active/reference multi-item Piano Roll history acceptance.
piano-multi-itemnow verifies undo/redo of the first active clip drag restores/reapplies only that clip while preserving the reference item, then verifies undo/redo of the switched active reference clip drag preserves the previously edited clip. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-multi-item, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened Piano Roll tool history acceptance.
piano-toolsnow verifies draw, erase, note resize, split, glue, mute, and velocity-lane edits each undo back to the previous note-pair state and redo to the edited state inside one live browser session. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-tools, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened Piano Roll basic note-drag history acceptance.
piano-basicnow verifies a real note drag changes the selected note start, undo restores the original note start/duration, and redo reapplies the moved start while preserving duration. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-basic, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened MIDI FX history acceptance.
midi-fx-controlsnow verifies prompt-free pitch, velocity, and time/groove edits undo and redo themidiEffectslist exactly before rechecking backend-bound resolved MIDI serialization. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedmidi-fx-controls, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened basic timeline move/resize history acceptance.
timeline-basicnow verifies body-drag undo/redo restores/reapplies MIDI item start/duration and right-edge resize undo/redo restores/reapplies the loop extension. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-basic, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened keyboard and source-context history acceptance.
timeline-keyboard-actionsnow verifies Ctrl+D duplicate undo/redo and Delete undo/redo through real key events, whiletimeline-source-contextverifies reset source offset, source length=item/content, and custom source length undo/redo. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-keyboard-actionsandtimeline-source-context, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened timeline action history acceptance.
timeline-actionsnow verifies mute-tool undo/redo, context lock undo/redo while still proving locked MIDI items cannot move, and prompt-free repeat-dialog undo/redo. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-actions, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened split and context-action timeline history acceptance.
timeline-arrangenow verifies same-track copy-drag undo/redo, split-tool undo/redo, context duplicate undo/redo, and context delete undo/redo through real browser gestures and context menus. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-arrange, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened Alt-slip source-window timeline acceptance.
timeline-arrangenow verifies Alt-drag changes only MIDI source offset, backend sync payload matchesserializeMIDIClipsForBackend, serialized events stay inside the visible item window, slipped note content starts at item time 0, and undo/redo restores/reapplies the slip. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-arrange, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened left-trim/source-slip timeline acceptance.
timeline-arrangenow verifies left-edge trim source-slips the MIDI item, backend sync payload matchesserializeMIDIClipsForBackend, serialized events stay inside the visible item window, slipped note/pitchbend content starts at item time 0, loop-resolved content remains after the slipped window, and undo/redo restores/reapplies the trim. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-arrange, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Strengthened REAPER-style timeline cross-track acceptance.
timeline-cross-tracknow verifies compatible MIDI-to-instrument move undo/redo and compatible Control-drag copy to an instrument track, including original item preservation, undo removing only the copied item, and redo restoring it. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedtimeline-cross-track, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Completed program/bank automated proof for bank select.
piano-advanced-lanesnow drives the visible Lane Editor to generate CC#0 Bank MSB and CC#32 Bank LSB lines with screenshots and verifies backend-bound serialization;midi-project-persistenceverifies bank select survives save/reload and backend sync;midi-export-payloadverifies export payload parity for bank select; nativemidi_pitchbend_chase_fixtureandmidi_export_fixturenow assert bank MSB/LSB chase/export inqa/midi-editor/2026-05-12/implementation/native-automated-regression.json. Verification passed:node --check tools/midi-editor-acceptance-harness.mjs,npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), C++ Debug build, native headless regression, focused browser scenarios, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementationwith 31 scenarios. - 2026-05-12: Completed Piano Roll navigation-tool browser coverage and fixed pan tool behavior. Pan now uses a ref-backed drag session so immediate Konva pointer moves scroll the editor reliably;
piano-navigation-toolsverifies zoom, pan, and controller line-dialog activation through real pointer input against a long editable source window. Verification passed:npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-navigation-tools, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementation. - 2026-05-12: Moved Piano Roll from a blocking modal into a resizable docked lower zone and added arrange-click active item retargeting while preserving selected MIDI item groups. Added
app-docked-piano-focusbrowser/CDP QA, which seeds the real App shell with two selected MIDI items, verifies the docked editor is below a clickable timeline, clicks selected arrange clips in both directions, and asserts the active Piano Roll clip changes without clearing selection. Verification passed:npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedapp-docked-piano-focus, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementation. - 2026-05-12: Added compact Piano Roll insert velocity and audition controls. Draw, step input, and context-menu insertion now use the configured insert velocity, and the audition toggle stops/suppresses preview MIDI calls when disabled. Added
piano-audition-insertbrowser/CDP QA, which patchesnativeBridge.sendMidiNote, sets velocity through the visible input, draws notes with audition enabled/disabled, verifies balanced note-on/note-off calls and disabled-preview suppression, and captures screenshots. Verification passed:npx tsc --noEmit, fullnpx vitest run(20 files / 131 tests), focusedpiano-audition-insert, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-12/implementation. - 2026-05-11: Fixed and covered MIDI export paths. Project MIDI export now uses
serializeMIDIClipsForBackend()so source windows, MIDI FX, probability/variance decisions, CC lanes, pitchbend, program, pressure, channels, and release velocity are included in export payloads. The native WebViewexportMIDIFilebridge now accepts the frontend's two-argument clip-export shape as well as the older five-argument backend helper. Added nativeexportProjectMIDI()andmidi_export_fixture, which writes and re-reads a.midfile and verifies note/noteOff, CC1/CC33, pitchbend, program change, channel pressure, and poly pressure. Addedmidi-export-payloadbrowser QA to verify frontend export payload parity. Verification passed: C++ Debug build, native headless suite exit code 0, focusedmidi-export-payload, and full browser harness. - 2026-05-11: Strengthened
midi-fx-controlsbrowser QA into a backend-bound render-input test. The scenario now seeds a MIDI clip, drives the visible pitch/velocity/time MIDI FX dialogs, interceptsnativeBridge.setTrackMIDIClips, and verifies the payload matchesserializeMIDIClipsForBackend()with pitch-shifted notes, velocity scaling/offset, time/swing offsets on notes and CC, probability-0 note filtering, and deterministic velocity variance across repeated serialization. Focused verification passed:node --check tools/midi-editor-acceptance-harness.mjsandnode tools/midi-editor-acceptance-harness.mjs --scenario midi-fx-controls --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added a native headless automated regression entry point:
OpenStudio.exe --automated-regression-headless --report .... The C++ suite now runs without opening the app window and writesqa/midi-editor/2026-05-11/implementation/native-automated-regression.json. New/strengthened coverage includes exact pitchbend/program/CC/channel-pressure/active-note chase at sample zero, render/freeze with non-centered pitchbend through the fallback instrument path, saved MIDI playback with pitchbend, and add-track first-callback spike detection. This also fixed a real render bug where fallback instrument tracks were incorrectly sent through the simple audio-clip render loop, plus a first-callback spike risk from uncleared newly allocated send/sidechain buffers. Verification passed: C++ Debug build and native headless suite exit code 0. - 2026-05-11: Added
midi-project-persistencebrowser QA. The scenario patches the NativeBridge file/project methods in-page, saves a real project JSON throughsaveProject(true), reloads it throughloadProject(), and verifies MIDI FX, sampler/SoundFont, instrument state, source-window metadata, pitchbend ranges, note probability/play-count/variance/cent metadata, note-off release velocity, pitchbend, program/channel pressure/poly pressure, CC14, CC74 parabola interpolation, and load-time backend sync repair payloads survive. Verification passed:npx tsc --noEmit, fullnpx vitest run, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added
piano-cc-directbrowser QA. The scenario draws directly in the visible CC#1 lane, switches the same lane to arbitrary CC#74 and draws again, verifies both drawn controller sets are emitted intoserializeMIDIClipsForBackend(), captures before/after screenshots, and verifies undo restores the original controller event lists exactly. Verification passed:npx tsc --noEmit, fullnpx vitest run, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added explicit Parabola controller-line mode and
piano-controller-shapesbrowser QA. The scenario auditswindow.promptcall count, generates CC#1 ramp, step, and parabola lines through visible dialogs, captures screenshots, and verifies undo/redo restores and reapplies each generated shape exactly. Verification passed:npx tsc --noEmit, fullnpx vitest run, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Expanded inspector/controller E2E coverage.
piano-inspectornow verifies visible pitch/start/length edits, metadata edits, mixed multi-note inspector state, batch velocity, and undo/redo; newpiano-velocity-lineverifies velocity-lane ramp generation and undo/redo;piano-controller-lanenow verifies controller compression/stretch transforms plus cross-lane paste with undo/redo. Verification passed:npx tsc --noEmit, fullnpx vitest run, and full browser/CDP--scenario allwith 28 passing scenarios. - 2026-05-11: Added
piano-pitchbend-directbrowser QA. The scenario enables pitchbend semitone snap, draws directly in the visible pitchbend lane with real pointer events, verifies snapped +7 semitone bend events are emitted intoserializeMIDIClipsForBackend(), captures before/after screenshots, and verifies undo restores the original pitchbend event list exactly. Verification passed:npx tsc --noEmit, fullnpx vitest run, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added direct note metadata controller lanes for note-off velocity, chance/probability, and velocity variance. PianoRoll now maps those lane rows to editable note-aligned bars, prevents stale controller-drag sessions from mutating data after mouse release, adds prompt-free lane add buttons, and commits each pointer drag through one undoable MIDI event command. Added
piano-note-metadata-lanesbrowser/CDP QA with screenshots; it verifies note-off velocity 42->118, chance 92%->10%, velocity variance 7->114, and undo restoring variance to 7 exactly. Verification passed:npx tsc --noEmit, fullnpx vitest run, and fullnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added
piano-visual-viewportsbrowser QA. The harness captures the piano-roll shell at 1440x900, 1280x720, 1024x720, and 1024x560 short-zone sizes, and asserts the key strip, info line, editor pane, inspector, lane stack, and lane rows are present without page overflow or editor/inspector overlap. Latest--scenario alland fullnpx vitest runpass. - 2026-05-11: Added
piano-advanced-lanesbrowser QA. The scenario drives the visible controller-lane inspector to generate pitchbend line events, 14-bit CC#1/33 MSB/LSB pairs, program change events, channel pressure events, and note-specific poly pressure events, then verifiesserializeMIDIClipsForBackend()emits those backend-bound event types. Latest--scenario all,npx tsc --noEmit, and fullnpx vitest runpass. Native chase/render/export sanity is now covered by the headless C++ suite; manual Cubase acceptance remains open for these lanes. - 2026-05-11: Added native
midi_combined_project_render_fixtureto the headless C++ regression suite. The fixture parses a combined instrument/external-MIDI project payload, verifies program, CC14, pitchbend, channel pressure, poly pressure, note-on, and release-velocity note-off events in the scheduler, then renders a real WAV and asserts the output is readable, finite, and non-silent. Verification passed:cmake --build build --config DebugandOpenStudio.exe --automated-regression-headless --report qa/midi-editor/2026-05-11/implementation/native-automated-regression.json. - 2026-05-11: Replaced
MIDIFXControlspitch/velocity/timewindow.promptflows with a compact numeric dialog and addedmidi-fx-controlsbrowser QA. The scenario edits pitch semitones, velocity scale/offset, and time swing/offset through the visible controls, then verifiestrack.midiEffectsstate and undo availability. Latest--scenario all,npx tsc --noEmit, and fullnpx vitest runpass. - 2026-05-11: Added
piano-multi-itembrowser QA and made the standalone PianoRoll harness follow the store's active MIDI clip instead of a fixed prop. The scenario renders an active clip plus one reference clip, drags the active note while proving the reference note is unchanged, clicks a reference note to switch the active editable item, then drags the newly active note while proving the original item is unchanged. Latest--scenario allpass includes active/reference multi-item screenshots. - 2026-05-11: Replaced the timeline
Repeat Clip...context-menuwindow.promptwith an in-app numeric dialog and expandedtimeline-actionsbrowser QA to repeat a MIDI item twice through that dialog. The focused scenario and latest full--scenario allbrowser/CDP run passed;Timeline.tsxandPianoRoll.tsxnow have nowindow.prompt/prompt()usages. - 2026-05-11: Added
timeline-backend-payloadbrowser QA. The harness now performs a real right-edge loop resize, forcessyncMIDITrackToBackend, captures the exact bridge payload, and asserts it matchesserializeMIDIClipsForBackendwhile preserving visible-window bounds, loop-resolved events, event channels, note-off release velocity, pitchbend, CC, probability, velocity variance, and play-count metadata. Latest--scenario allpass includes this backend-payload proof; remaining timeline gate is backend playback/manual REAPER acceptance. - 2026-05-11: Added
app-shortcutsbrowser QA and registered Ctrl+Y as a redo alias. The harness now uses the real app shell/global shortcut dispatcher, creates an undoable MIDI source-length edit, sends real Ctrl+Z and Ctrl+Y key events, and verifies source/loop length undo/redo state transitions with screenshots. - 2026-05-11: Replaced the MIDI
Set Source Length...context-menuwindow.promptwith an in-app numeric dialog and expandedtimeline-source-contextbrowser QA to apply a custom 3.25s source length through that dialog. The action now has CDP proof for source/loop length updates and undo availability without a prompt-based workflow. - 2026-05-11: Expanded
timeline-source-contextbrowser QA to coverSource Length = Content. The context-menu action now has CDP proof that a MIDI item with a longer source window can setsourceLengthandloopLengthto the actual MIDI event content end while preserving undo availability. - 2026-05-11: Added
timeline-keyboard-actionsbrowser QA. The harness now sends actual key events into the timeline and verifies Ctrl+D duplicates the selected MIDI item, Delete removes the selected item, screenshots are captured, and undo availability is updated. Global Ctrl+Z/Ctrl+Y WebView routing remains open because the standalone Timeline harness does not include the app-level shortcut dispatcher. - 2026-05-11: Added
timeline-drop-targetsbrowser QA and repaired ghost-track hit detection. Timeline drag hit testing now treats pointer positions below the arranged track content as the ghost-track drop zone instead of clamping to the last real track. Browser/CDP QA verifies MIDI drops onto audio tracks stay on the original MIDI track, and dragging below the track list creates a new MIDI track and moves the item there with undo available. - 2026-05-11: Added
timeline-selectionbrowser QA and fixed a real Ctrl-click regression. Ctrl-click on a MIDI item was entering copy-on-drag mode and could duplicate or clear selection even without movement;finalizeTimelineClipGesturenow ignores copy gestures below a 4px movement threshold, and MIDI clip mousedown defers selection while copy-on-drag is pending so the click handler can perform Ctrl multi-select.timeline-selectionnow verifies single select and Ctrl multi-select screenshots. - 2026-05-11: Added
piano-lane-managementbrowser QA. The harness now verifies hiding a visible CC#1 lane does not delete CC data, adding a 14-bit CC#1/33 lane makes it active, lane height/interpolation controls persist in editor state, and linked/unlinked pitchbend range inspector controls update track state through undoable store actions. Phase 7 remains reopened for manual Cubase acceptance. - 2026-05-11: Added
piano-controller-lanebrowser QA. The harness now opens the real PianoRoll inspector, selects the CC#1 lane, generates a curve, applies a visible transform, thins dense controller data, copies/clears/pastes the lane, and generates a sine LFO without prompt dialogs. Scenario screenshots are saved underqa/midi-editor/2026-05-11/implementation/. Phase 7 remains reopened for manual Cubase acceptance. - 2026-05-11: Marked Phase A0, A1, and A2 complete. Expanded
tools/midi-editor-acceptance-harness.mjswithtimeline-snap-undoandtimeline-source-context; latest--scenario allpass verifies snap move, undo, redo, reset source offset, and source-length-to-item in addition to the prior timeline/piano-roll coverage. Added completed acceptance evidence checkboxes while keeping reopened Phase 4, 5, 7, and 9 open until the remaining matrix rows have browser, backend, screenshot, and manual acceptance proof. - 2026-05-11: Expanded
tools/midi-editor-acceptance-harness.mjswithpiano-tools; latest--scenario allpass verifies piano-roll draw, erase, note resize, split, glue, mute, and velocity-lane editing with screenshots. Phase 5 remains reopened because range selection, line/curve tools, active/ghost multi-item editing, visual polish, persistence, render/freeze, and manual Cubase acceptance remain open. - 2026-05-11: Fixed piano-roll split/glue correctness. The split tool now removes the original note by matching note/channel/timestamps instead of relying on object identity, and the glue tool now merges selected same-pitch/channel fragments into one undoable note instead of acting as plain legato. Updated
piano-toolsbrowser QA to assert split leaves no original long note and glue restores one merged note. Verification passed:npx tsc --noEmit, fullnpx vitest run, andnode tools/midi-editor-acceptance-harness.mjs --scenario all --out qa/midi-editor/2026-05-11/implementation. - 2026-05-11: Added
piano-rangebrowser QA to verify range-selection creates a MIDI edit range and selects notes through real pointer drag. Latest--scenario allbrowser/CDP harness pass includespiano-range; Phase 5 remains open for line/curve tools, multi-lane controller workflows, active/ghost multi-item editing, visual polish, persistence, render/freeze, and manual Cubase acceptance. - 2026-05-11: Expanded reusable browser/CDP MIDI acceptance harness at
tools/midi-editor-acceptance-harness.mjs. Current--scenario allcoverage seeds standalone Timeline and PianoRoll fixtures through the live Vite app, performs real pointer/menu/input gestures, captures before/after screenshots, and asserts state deltas plus undo availability for MIDI item move, snap move, compatible cross-track move to an instrument track, right-edge resize, left trim/source slip, Alt-slip, copy-drag, split, context duplicate/delete, mute-tool click, context lock, locked-item move suppression, source-offset reset, source-length-to-item, piano-roll note drag, and inspector edits for velocity, channel, note-off velocity, chance, velocity variance, play count, and cent offset. Latest run passed and wroteqa/midi-editor/2026-05-11/implementation/midi-editor-acceptance-report.json. Remaining matrix gaps include select/multi-select screenshots, incompatible/ghost-track moves, source-length-content/custom source-length UI, lane transforms, persistence, render/freeze, and manual acceptance coverage. - 2026-05-11: Added the 100% Acceptance-Matrix Completion Plan. "100%" is now defined as every documented Studio13 acceptance-matrix row passing with automated, browser/WebView, screenshot, and manual acceptance evidence; it is not literal cloning of every REAPER/Cubase/openDAW feature. Reopened phases remain open until the matrix rows in their area pass.
- 2026-05-11: DAW-level recovery implementation checkpoint. Added shared timeline gesture math in
frontend/src/utils/timelineClipGestures.ts, routed audio and MIDI arrange item drag/resize through the same finalizer, removed dead legacy drag-end blocks, and added browser/CDP pointer QA showing a MIDI item move changed start time from 1.000s to 1.545s with undo available and right-edge resize extended a looped item from 2.000s to 2.727s with undo available. Added piano-roll hit geometry for lane headers, lane resize handles, controller nodes, and loop boundaries; added lane-resize handling, per-lane interpolation controls, loop-boundary rendering, and browser/CDP note-drag QA showing a note start moved from 0.000s to 0.375s with undo available. Captured implementation screenshots inqa/midi-editor/2026-05-11/implementation/. Verification passed:npx tsc --noEmit, fullnpx vitest run(131 tests), andcmake --build build --config Debug. - 2026-05-11: Recovery initiated. Prior completion claims for timeline editing, piano roll, controller lanes, and final QA are superseded by user acceptance feedback. Added requirement for
midi_editor_reference_matrix.mdand browser/WebView interaction QA before reopened phases can be marked done again. - 2026-05-11: Recovery implementation slice started. Added
midi_editor_reference_matrix.md; repaired timeline drag-state handling so global mouseup no longer cancels Konva clip gesture commits; added gesture snapshots so timeline clip moves can be committed as one undoable command; added clearer MIDI item handles/selected affordances/source-slip readout; moved controller line/LFO/thin/transform workflows to modal-driven input instead of the primary prompt workflow; refreshed piano-roll toolbar/dialog styling. Frontendnpx tsc --noEmitand fullnpx vitest runpassed. Reopened phases remain open until browser/WebView pointer QA and manual REAPER/Cubase acceptance pass. - 2026-05-10: Phase 0 done. Plan file created and execution started with Phase 2 reliability work before larger editor rebuild.
- 2026-05-10: Phase 2 in progress. Added initial backend track type creation, project save/load MIDI routing resync, instrument state round-trip, pitchbend value serialization, looped MIDI clip backend expansion, quantize-with-related-controller movement, MIDI note/CC/pitchbend/program chase after seeks/schedule changes, all-notes-off on MIDI type/schedule changes, piano-roll pitchbend lane drawing, and focused MIDI regressions. Phase 2 remains open until the full signal-path and crack harness are complete.
- 2026-05-10: Phase 3 in progress. Added MIDI source-loop length inference/migration, timeline resize preservation of original MIDI source length, loop-notch rendering on expanded MIDI items, and piano-roll editing against the source loop length rather than the visible repeated item.
- 2026-05-10: Phase 2 in progress. Added user-facing MIDI Panic command/menu item/shortcut and expanded panic output to include sustain-off, all-sound-off, reset-controllers, all-notes-off, and pitchbend center per channel.
- 2026-05-10: Phase 3/5 in progress. Added explicit MIDI source metadata (
sourceLength,sourceStart,loopEnabled,loopOffset) for new/recorded/step MIDI clips, made piano-roll note/CC/pitchbend edits extend source length instead of clipping at the old item edge, kept looped visible item duration stable when source length grows, and added undo regressions for source-length extension. - 2026-05-10: Phase 4 in progress. Changed timeline audio/MIDI resize drags to preview live and commit through one undoable resize action on drag end, matching REAPER-style single gesture undo behavior.
- 2026-05-10: Phase 2 in progress. Expanded native MIDI diagnostics with scheduler totals, per-track MIDI routing/type/instrument fields, MIDI device lists, and a project-load verification pass that repairs any frontend/backend MIDI clip-event schedule mismatch after loading saved projects.
- 2026-05-10: Phase 6 in progress. Expanded piano-roll quantize toward Cubase behavior with starts, ends, starts+ends, length/fixed-length, strength, swing, randomize, and move-controllers options; added regressions for related controller movement, end quantize, and fixed-length quantize.
- 2026-05-10: Phase 1 in progress. Added a native automated MIDI scheduler fixture inside
runAutomatedRegressionSuite()that creates a temporary MIDI track, schedules note/CC/pitchbend data, processes a silent block, asserts scheduled/built event counts, checks finite samples, and verifies no audio spike from a plain MIDI track. - 2026-05-10: Phase 7 in progress. Added shared controller-lane helpers for 14-bit pitchbend semitone conversion/snap plus generated line/LFO events, added pitchbend range and semitone snap controls in the piano roll, rendered pitchbend semitone grid lines, and added controller line/sine/triangle LFO generation through the transform menu with undoable commits.
- 2026-05-10: Phase 7 in progress. Added controller-data thinning/reduction for CC and pitchbend lanes, including cents-based pitchbend tolerance, undoable commits, and regression coverage for preserving endpoints and important bends.
- 2026-05-10: Phase 8 in progress. Added a quiet built-in fallback synth for instrument tracks with no restored instrument plugin, surfaced
fallbackInstrumentActivein MIDI/audio diagnostics, and added a native regression fixture that verifies an instrument track can render finite nonzero audio from scheduled MIDI without a plugin. - 2026-05-10: Phase 8 in progress. Exposed the fallback synth in the track header, channel strip, and FX chain UI as
Studio13 Basic Synthso instrument tracks no longer look empty/silent when they are using the built-in fallback source. - 2026-05-10: Phase 6 in progress. Added MIDI input quantize preferences (enable, grid, strength) and applied them to completed recorded MIDI clips with note-duration preservation and related controller/pitchbend movement.
- 2026-05-10: Phase 7 in progress. Added arbitrary CC lane selection plus 14-bit CC MSB/LSB mode for CC0-31, including combined 14-bit display, draw/upsert, line/LFO generation, thinning, and split/combine regression coverage.
- 2026-05-10: Phase 2/8 in progress. Added compact per-track MIDI output selection beside MIDI input/channel selection and narrowed the MIDI device selector store subscription to avoid full-store re-renders.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed;npx tsc --noEmitpassed; focused Vitest MIDI/timeline suite passed (midiControllerLanes,midiNotes,midiClipStoreActions,timelineClipHitTest). - 2026-05-10: Phase 6/7 in progress. Added "MIDI quantize using last settings" to the store/action registry/piano-roll transform menu with regression coverage, and expanded controller LFO generation UI to square and saw up/down shapes.
- 2026-05-10: Phase 6 in progress. Added MIDI reset/unquantize and freeze-quantize actions with clip-level quantize backups, undo/redo support, piano-roll transform menu entries, command registry entries, and store regressions.
- 2026-05-10: Phase 7 in progress. Added controller lane copy/paste in the piano-roll transform menu, normalizing copied values so curves can move between 7-bit CC, 14-bit CC, and pitchbend lanes while preserving shape.
- 2026-05-10: Phase 7 in progress. Added program-change and channel-pressure lanes to the piano roll controller workflow, including draw/generate/thin/copy/paste support, scheduler parsing, MIDI export parsing, and regression coverage.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed;npx tsc --noEmitpassed; focused Vitest MIDI/timeline suite passed with 29 tests. - 2026-05-10: Phase 1/2 in progress. Added a saved-project reload regression that forces a backend MIDI schedule mismatch and asserts load-time repair resends serialized clips plus MIDI panic, then added a native first-block silence fixture for new MIDI/instrument tracks.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed;npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 30 tests. - 2026-05-10: Phase 6 in progress. Added explicit tuplet quantize divisions plus Cubase-style catch range and safe-zone options to MIDI quantize, surfaced them in the piano-roll quantize dialog, and covered them with store regressions.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 31 tests. - 2026-05-10: Phase 6 done. Added groove presets for straight, light/heavy swing, laid-back 16, and push 16 quantize targets, persisted them in last quantize settings, exposed them in the piano-roll quantize dialog, and added regression coverage.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 31 tests after Phase 6 completion. - 2026-05-10: Phase 1 done. Added native engine-callback fixtures for saved-project MIDI reload playback through an instrument track fallback synth and for add-track no-spike/no-nonfinite behavior on MIDI and instrument tracks immediately inside the audio callback.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed warning-clean after Phase 1 fixture completion. - 2026-05-10: Phase 2 done. Fixed MIDI/instrument track freeze range detection by using scheduled MIDI clips when no audio clips exist, then added native MIDI render/freeze validation that asserts both exported render and frozen track output are readable, finite, and non-silent.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed;npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 31 tests after Phase 2 completion. - 2026-05-10: Phase 4 in progress. Extended Alt-drag slip editing to MIDI clips, including live preview and undoable commit with backend MIDI resync, and added MIDI source-window context actions for offset reset and source-length edits.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 32 tests after MIDI slip/source-window work. - 2026-05-10: Phase 4 done. Added trim/loop-expansion edge-case regressions to ensure MIDI source and loop length metadata survives left trims, undo, and right-edge loop expansion.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 33 tests after Phase 4 completion. - 2026-05-10: Phase 3 done. Added deterministic migration coverage for legacy MIDI clips missing source/loop metadata, explicit loop-only clips, and explicit source-only clips.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 34 tests after Phase 3 completion. - 2026-05-10: Phase 7 in progress. Added bank-select CC0/CC32 lane presets and added poly-pressure event serialization plus backend scheduling/export parsing.
- 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed;npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 34 tests after bank/poly-pressure backend work. - 2026-05-10: Phase 5 in progress. Added a piano-roll single-note inspector for direct numeric pitch, start, length, and velocity edits using the existing undoable MIDI note actions.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 34 tests after note inspector work. - 2026-05-10: Phase 7 in progress. Added velocity and controller lane height controls to the piano roll and made lane hit-testing/rendering use the adjustable heights.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 34 tests after lane-height controls. - 2026-05-10: Phase 5 in progress. Added piano-roll multi-item controls for active MIDI clip selection, selected-clip reference visibility, ghost-note visibility, and click-to-focus editing from colored reference notes.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 34 tests after multi-item controls. - 2026-05-10: Phase 5 done. Added undoable snap-selected-notes-to-scale from the active piano-roll root/scale, added a diatonic triad chord insert mode, exposed the scale snap through toolbar/transform/action registry, and covered both behaviors with store regressions.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 36 tests after Phase 5 completion. - 2026-05-10: Phase 7 done. Added note-specific poly-pressure lane editing in the piano roll, made controller dots act as editable curve handles, and added a clear-current-lane control for removing controller/pitchbend/pressure data from the active edit range while arbitrary CC selection remains the lane-add path.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 36 tests after Phase 7 completion. - 2026-05-10: Phase 8 in progress. Added track-level MIDI FX for arpeggiator, pitch transpose, velocity scaling/offset, and time/groove swing/offset; effects are applied during MIDI backend serialization so playback, reload repair, render, and freeze receive the transformed event stream. Initially added compact TCP controls and undoable
setTrackMIDIEffects; TCP placement was later revised to the track FX panel on 2026-05-12 after manual DAW-parity feedback. - 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 39 tests after MIDI FX serialization and controls. - 2026-05-10: Verification checkpoint.
cmake --build build --config Debugpassed after the MIDI FX/frontend integration work. - 2026-05-10: Phase 8 done. Added a built-in basic sampler path for instrument tracks with no plugin: the backend loads an audio sample into an immutable realtime-safe sample buffer, maps it chromatically from a root MIDI note, uses it instead of the sine fallback, persists/restores the sample path/root note through project load, exposes load/clear controls in the TCP, and reports sampler state in MIDI/audio diagnostics.
- 2026-05-10: Verification checkpoint.
npx tsc --noEmitpassed; focused Vitest MIDI/timeline/project-load suite passed with 40 tests;cmake --build build --config Debugpassed after basic sampler support. - 2026-05-10: Phase 9 done. Completed final automated QA for the MIDI/instrument pass: full frontend Vitest suite passed with 112 tests, production frontend build passed, TypeScript passed, focused MIDI/timeline/project-load suite passed with 40 tests, and C++ Debug build passed. Vite emitted existing chunk/dynamic-import size warnings, not build failures.