phase information removal.

This commit is contained in:
Johannes Findeisen 2026-11-06 14:12:22 +01:00
commit dd32143bf8
45 changed files with 325 additions and 330 deletions

View file

@ -116,9 +116,9 @@ The project is scaffolded under the MIT License; see `LICENSE`. Review the licen
Audio timing, transitions, latency limits and listening previews are described
in [docs/AUDIO_QUALITY.md](docs/AUDIO_QUALITY.md). Human listening acceptance
for the Phase 12 transitions remains pending.
of the transitions remains pending.
Phases 13–15 add no-clobber recording/recovery, parameterized native C processors,
The engine adds no-clobber recording/recovery, parameterized native C processors,
and trusted in-process LADSPA hosting with persisted identity/control values.
See [RECOVERY.md](docs/RECOVERY.md), [NATIVE_API.md](docs/NATIVE_API.md) and
[PLUGIN_HOSTING.md](docs/PLUGIN_HOSTING.md) for commands and limits.
@ -127,33 +127,34 @@ For everyday use see [USER_MANUAL.md](docs/USER_MANUAL.md),
[KNOWN_LIMITATIONS.md](docs/KNOWN_LIMITATIONS.md) and
[MAINTENANCE.md](docs/MAINTENANCE.md). `xtc-check --diagnose` reports build features;
`make test-package` checks a local system-linked Linux binary archive.
Phases 16–20 add effect automation/controllers, editing commands, v7 project-folder
media paths, performance baselines and release/installation checks.
Effect automation/controllers, editing commands, v7 project-folder media paths,
performance baselines and release/installation checks are also supported.
Phase 22 adds non-destructive audio splitting, clip gain/fades and cached timeline
waveforms, with undo and v8 persistence (reading v1–v7). See
[AUDIO_FILES.md](docs/AUDIO_FILES.md#phase-22-non-destructive-clip-editing).
Non-destructive audio splitting, clip gain/fades and cached timeline waveforms
are supported, with undo and v8 persistence (reading v1–v7). See
[AUDIO_FILES.md](docs/AUDIO_FILES.md#non-destructive-clip-editing).
`make test-audio-editing` checks source preservation and exact boundary output.
Time stretching and independent pitch shifting remain deferred.
Phase 23 adds signal-flow graph layout, routing diagnostics, direction/role
indicators and atomic unity-gain insertion into a wire. See
Signal-flow graph layout, routing diagnostics, direction/role indicators and
atomic unity-gain insertion into a wire are supported. See
[ROUTING.md](docs/ROUTING.md); `make test-routing` verifies the C routing contract.
Phase 24 adds one-level mix buses, routing, coherent track/bus peaks and master
clipping indicators, persisted in v9 (reading v1–v8). See [MIXER.md](docs/MIXER.md).
One-level mix buses, routing, coherent track/bus peaks and master clipping
indicators are supported, persisted in v9 (reading v1–v8). See [MIXER.md](docs/MIXER.md).
Phase 25 adds LADSPA descriptor browsing, an identity/parameter editor with
reset, transactional replacement and insertion into graph wires. See
LADSPA descriptor browsing, an identity/parameter editor with reset,
transactional replacement and insertion into graph wires are supported. See
[PLUGIN_HOSTING.md](docs/PLUGIN_HOSTING.md) for compatibility and lifecycle limits.
Phase 26 adds common parameter targets, Linear/Hold mixer automation and saved
per-channel live MIDI CC bindings. Project v10 reads v1–v9. See
Common parameter targets, Linear/Hold mixer automation and saved per-channel
live MIDI CC bindings are supported. Project v10 reads v1–v9. See
[CONTROL.md](docs/CONTROL.md) for timing, precedence and qualification limits.
Phase 27 reserves undo storage before edits/publication, groups completed takes,
preserves surviving editor selections and improves context menus/focus feedback.
See [EDITING.md](docs/EDITING.md) for the workflow audit and failure boundaries.
Undo storage is reserved before edits/publication, completed takes are grouped,
surviving editor selections are preserved and context menus/focus feedback are
improved. See [EDITING.md](docs/EDITING.md) for the workflow audit and failure
boundaries.
Project troubleshooting: `xtc-check --validate PROJECT.xtc` reports metadata
errors with the expected record and syntax line. `xtc-check --inspect PROJECT.xtc`
@ -163,7 +164,7 @@ or unreadable references, 1 = metadata/I/O error. File availability does not
certify WAV contents or plugin compatibility. See [PROJECT_FORMAT.md](docs/PROJECT_FORMAT.md)
for the compatibility and relocation policy.
Phase 31: **File → Load plugin** supports LADSPA plus an initial Linux
**File → Load plugin** supports LADSPA plus an initial Linux
CLAP/VST2/VST3 effect subset. Select the actual module binary (`.clap` or `.so`,
including a VST3 bundle's inner binary). Modern effects require one mono input
and output, float32 and zero latency; they use default configuration. Instruments,
@ -172,17 +173,17 @@ implemented. Projects now save v11 and read v1–v11. See PLUGIN_HOSTING.md for
full contract and test/qualification limits.
Phases 80–89 add a compact sequencer Create menu, optional track inspector and
per-track modular effect chains. Open **View → Track inserts** (or Ctrl+5 for the selected track) to add,
A compact sequencer Create menu, optional track inspector and per-track modular
effect chains are supported. Open **View → Track inserts** (or Ctrl+5 for the selected track) to add,
search, reorder, bypass, inspect and mix mono LADSPA/VST2/VST3/CLAP effects or
internal devices. Chains support undo, presets, audio/MIDI rendering and export.
Projects save format 17 and read formats 1–17. See
[track insert workflows and limits](docs/TRACK_INSERTS.md) and the
[screenshot gallery](screenshots/README.md).
Phases 90–99 add direct selected-track inserts, effect duplication, chain copy/
Direct selected-track inserts, effect duplication, chain copy/
paste, A/B snapshots, three internal effect templates, bulk rack actions, insert
peak meters, tap tempo, audio crossfades and MIDI chord strumming. See
peak meters, tap tempo, audio crossfades and MIDI chord strumming are supported. See
[creative workflows and limits](docs/CREATIVE_WORKFLOWS.md).
MIDI devices and defaults are configurable in **Preferences → midi**, including

View file

@ -46,7 +46,7 @@ for the release/acquire protocol, bounded resource retention and recovery.
## GUI backend ownership
The Phase 3 window owns one C backend handle and serializes all control calls
The GUI window owns one C backend handle and serializes all control calls
on the GUI thread. A GUI timer reads snapshots and collects retired resources;
no audio callback calls FLTK. Successful window close first closes the JACK
client (synchronizing callbacks), then removes the GUI timer and hides the
@ -56,8 +56,8 @@ C commands and publish independent compiled snapshots. See GUI.md.
## Editable graph and canvas
Phase 4 adds read-only C snapshots, monotonic node IDs, and a small set of C
edit commands. The GUI owns an opaque graph handle, never private arrays.
Read-only C snapshots, monotonic node IDs, and a small set of C edit commands
are provided. The GUI owns an opaque graph handle, never private arrays.
An edit produces a candidate, and the GUI commits it only after backend submit
succeeds (or locally while offline). A busy pending slot or invalid edit leaves
the prior model/plan unchanged. Active/submitted revisions distinguish the
@ -72,8 +72,8 @@ GUI-owned state. Reconnect republishes the same retained editable graph.
## Project ownership and persistence
Phase 5 introduces a C-owned project containing the graph, bounded track/clip
arrays, stable ID allocators and constant tempo. Read APIs return copies;
A C-owned project contains the graph, bounded track/clip arrays, stable ID
allocators and constant tempo. Read APIs return copies;
GUI canvases borrow the opaque project/graph on the control thread. A graph
edit prepares a candidate project before submitting its graph, then commits
ownership only after acceptance. Arrangement edits currently change silent
@ -87,14 +87,14 @@ SequencerWidget owns selection, zoom and gestures only; musical range checks,
source-preserving trims and ID allocation remain C responsibilities.
## Phase 6 assets and recording
## Assets and recording
Audio paths are C clip metadata. A stopped preparation copies range/offset
information, deduplicates paths, validates and preloads bounded WAV assets into
an independent C audio plan. The backend owns that plan and a preallocated
timeline buffer until callback quiescence. A graph audio-source node consumes
the buffer, so effects/output routing remain graph operations. All tracks share
the mono source in this phase; no audio summation bypasses the graph.
the mono source; no audio summation bypasses the graph.
Arrangement edits stop transport; subsequent Play prepares the new snapshot.
Graph-only edits retain live plan publication. Missing assets preserve metadata
@ -107,7 +107,7 @@ the consumer writes WAV bytes; finalization follows successful callback stop.
No editable project pointer, GUI object or FILE is accessed by the producer.
See decision 0005 and AUDIO_FILES.md for format, limits and recovery contracts.
## Phase 7 MIDI source
## MIDI source
The C MIDI plan prepares bounded source-relative notes into sample spans and
renders a separate instrument buffer. `xtc_plan_process_sources` and
@ -119,7 +119,7 @@ requests and no callback allocation/I/O. Stop/seek clear live voices; scheduled
notes chase their absolute phase. See MIDI.md for event ordering, panic semantics,
capacities and test coverage. No new dependency is required.
## Phase 8 mix snapshots and history
## Mix snapshots and history
`src/mixer` owns validated per-track settings and bounded gain/pan automation.
Audio/MIDI preparation copies and indexes these into source snapshots; paired
@ -131,7 +131,7 @@ cursor only after successful GUI/backend installation. No samples or FLTK state
are stored in history. `mixer_widget.cpp` is only controls/drawing/gestures.
See MIXER.md and PROJECT_FORMAT.md for ownership, limits and v4 migration.
## Phase 9 native lifecycle and distribution
## Native lifecycle and distribution
`xtc_native.h` defines copied versioned C descriptors and bounded block contexts.
Native effect/source nodes prepare independent instances on control-thread graph

View file

@ -1,10 +1,10 @@
# Audio source editor workflows
Phases 69–79 use the existing bounded mono WAV reader. Stereo input is downmixed;
The editor uses the existing bounded mono WAV reader. Stereo input is downmixed;
these are offline control-thread tools, not stereo restoration or time stretching.
The project format remains 16. No new dependencies are required.
## Phase 69 — Source inspection
## Source inspection
Select an audio clip and use View / Sample editor or double-click it. The modal
editor loads an independent snapshot of the complete source, up to 4,194,304 frames
@ -14,49 +14,49 @@ RMS and mean/DC before clip gain, fades or mixer processing. Display clamps to
±1; sample statistics retain finite over-range values. Editing project MIDI still
opens the piano roll. This editor does not audition or stream long files.
## Phase 70
## Trim clip to selection
Trim clip to selection applies source-frame endpoints within the current audible clip. Start rounds up and end rounds down to musical ticks; empty sub-tick ranges reject. Leading removal moves the timeline start by the same amount, preserving alignment. Source content, reference and clip gain/fade settings remain intact; project Undo restores the prior trim.
## Phase 71
## Export and relink
Export selected frames writes a new mono float32 WAV of the half-open selection at native rate. Save full copy and relink writes the complete source and relinks only the selected clip after successful preparation. The original source is never overwritten. Full-copy adoption requires matching source frame count/rate. Project undo restores the reference but retains the new file, which may be referenced by redo/history or other projects. Failed adoption removes its owned new file. Export/copy runs synchronously outside audio callbacks.
## Phase 72
## Reverse selection
Reverse selection changes only the chosen source frames in a new local snapshot. Undo / redo toggles the most recent processing step; selection and view are unchanged. Processing does not affect playback until Save full copy and relink. Close discards unsaved local processing. Sources are bounded to 16 MiB of float samples; preparing a new edit can temporarily retain three snapshots (48 MiB), then two (32 MiB).
## Phase 73
## Invert polarity
Invert polarity negates selected float samples; it is not time reversal. Over-range finite samples remain over-range; no implicit limiting is performed. Outside-selection frames are bit-preserved in the copied snapshot.
## Phase 74
## Remove DC offset
Remove DC offset subtracts the mean of the selected range from only that range. This is a constant offset correction, not a high-pass filter. Selection boundaries may acquire discontinuities; use fades or zero-crossing tools where appropriate. Finite over-range results are retained; float overflow rejects the edit.
## Phase 75
## Sample fades
Sample fades offers four offline curves: linear in/out and equal-power in/out (sinusoidal amplitude). The entire selection is the fade duration; both endpoints are included in the curve. Fewer than two frames reject. These curves change copied sample data and stack with existing playback clip fades after adoption; they do not form a linked clip crossfade.
## Phase 76
## Gain and normalize
Gain / normalize processes only selected samples. Mode 0 accepts linear gain 0..16; mode 1 accepts a linear peak target above 0 and at most 1, rejecting silent selections or required gain above 16. Finite values above unity are not clipped; float overflow rejects atomically. This changes sample data in the local snapshot, unlike the existing clip-gain normalization command; it provides neither true-peak nor LUFS processing.
## Phase 77
## Select audible bounds
Select audible bounds finds the first and last sample strictly above the chosen dBFS threshold and pads within the existing selection. It only changes selection; use Trim clip to selection to apply a nondestructive timeline trim, or export the selection. Entirely silent/below-threshold ranges leave selection unchanged. This is boundary detection, not automatic removal of internal gaps or a noise gate.
## Phase 78
## Snap to zero crossings
Snap to zero crossings searches each selected boundary within a source-frame radius up to 65,536. It uses the mono source, chooses earlier positions on equal distance and changes both endpoints only if both searches yield a nonempty range. Source edges qualify only when their adjacent sample is zero. This can reduce boundary discontinuities but does not guarantee click-free output; musical-tick trimming/slicing can move a boundary away from the exact crossing.
## Phase 79
## Detect attacks
Detect attacks uses absolute sample amplitude, an initial armed state, rearming below one quarter of the threshold and a minimum frame gap between retained attacks. It marks up to 128 source positions in orange; hovering the statistics shows exact frame indices. This is a threshold detector, not spectral onset detection, beat detection or tempo estimation. Selection/processing changes invalidate the markers. Slice clip at attacks splits the current clip reference at those positions in one project undo step and closes the editor. Edits in the local buffer must be saved/relinked first if the slices should use processed audio. Source positions round to nearest musical ticks; out-of-trim, edge and coalesced cuts are skipped. No usable cuts rejects. Left ID, source references and outside fades remain; inner explicit fades clear. Long explicit fades and existing automatic region fades can sound different after splitting. Timeline/source rounding may differ by one sample, so this is not sample-accurate timeline slicing. The no-explicit-fade aligned regression fixture remains bit-identical across slicing. No media files are written by slicing.
## Validation and timing limits
Every phase passed focused model and GUI checks before its implementation commit.
Focused model and GUI checks pass for each operation.
The integrated checks add allocation failure/cleanup, oversized sources, overflow,
clip ID rollback, exact selected samples, persistence, no-fade render comparison,
plugin fixtures, software JACK, Clang analysis, ASan/UBSan and install layouts.

View file

@ -26,7 +26,7 @@ rational timeline representations to avoid cumulative floating-point drift.
Define tempo-map conversion and behavior at tempo changes before implementing
tempo automation.
## Phase 1 offline API
## Offline API
`xtc_graph_create` accepts 1..256 nodes; IDs are monotonic stable identifiers, never reused
within a graph's lifetime. Enumeration indexes are dense and distinct from IDs. Supported nodes are gain (any finite multiplier), sine
@ -82,7 +82,7 @@ cycles, capacity limits, plan lifetime and repeated compilation/cleanup.
The offline API remains single-owner. The realtime/backend APIs below add
publication and JACK processing; offline tests alone do not qualify hardware.
## Phase 2 backend and realtime bridge
## Backend and realtime bridge
Use `xtc_backend.h` on one serialized control thread:
@ -135,11 +135,11 @@ internal realtime guarantees depend on the installed implementation/server.
Validation commands and results are recorded in BUILD.md and the integration
test README. Current limitations: mono input, no crossfaded graph changes, no automatic reconnect,
no physical-device or long-duration endurance qualification. Phase 3 connects
the FLTK shell to backend controls and status; see GUI.md. Its editors remain
placeholders except the Phase 4 modular editor described below.
no physical-device or long-duration endurance qualification. The FLTK shell is
connected to backend controls and status; see GUI.md. Its editors remain
placeholders except the modular editor described below.
## Phase 4 graph snapshots and edits
## Graph snapshots and edits
The control-thread API exposes copies through get_counts, get_node(index) and
get_connection(index), including node IDs/types/values and port endpoints. No
@ -182,7 +182,7 @@ offline/standalone callers. Input on unconnected nodes retains the existing
external-input contract; the GUI does not connect external JACK ports.
## Phase 5 transport
## Transport
Backend status includes a uint64 sample_position. Each successful processing
callback advances it by its exact frame count (including silence); errors do
@ -200,11 +200,11 @@ The GUI observes the counter every 100 ms, so visual updates are block-quantized
and delayed by polling. No external JACK transport synchronization is provided.
Silent clip metadata is control-thread data, never traversed by the callback.
Audio/MIDI scheduling will be added in later phases through compiled event/clip
plans rather than direct callback access to the editable project.
Audio/MIDI scheduling uses compiled event/clip plans rather than direct callback
access to the editable project.
## Phase 6 audio source and recording
## Audio source and recording
xtc_audio.h provides control-thread import and immutable preloaded clip plans.
The backend prepares a project only while stopped: build audio candidate,
@ -238,7 +238,7 @@ borrowed recorder; the caller must not free it before successful quiescence.
Live software source/capture acceptance and concurrent ring tests pass; physical
recording, latency compensation and disk endurance remain unverified.
## Phase 7 MIDI source
## MIDI source
The C MIDI plan prepares bounded source-relative notes into sample spans and
renders a separate instrument buffer. `xtc_plan_process_sources` and
@ -250,7 +250,7 @@ requests and no callback allocation/I/O. Stop/seek clear live voices; scheduled
notes chase their absolute phase. See MIDI.md for event ordering, panic semantics,
capacities and test coverage. No new dependency is required.
## Phase 8 stereo mixing and automation
## Stereo mixing and automation
Track settings and automation are copied into immutable source-plan snapshots.
`xtc_audio_plan_render_stereo` and `xtc_midi_plan_render_stereo` pan track audio
@ -264,7 +264,7 @@ bounded and allocation/I/O/lock free. Meter UI reads no active plan memory.
See MIXER.md for exact pan law, automation interpolation, event/source exceptions,
memory/history bounds and verification. Input/recording remain mono.
## Phase 9 native processing
## Native processing
Graph-native effects/sources use copied versioned descriptors, two independently
prepared mono instances and the existing plan ownership/retirement protocol.
@ -274,14 +274,14 @@ without rolling back already advanced DSP. Native event instruments can render
explicitly into graph instrument buffers. See NATIVE_API.md for exact lifecycle
and serialization limits and PERFORMANCE.md for measured workload and budgets.
## Phase 10 ownership audit
## Ownership audit
[RELIABILITY.md](RELIABILITY.md) records resource owners, publication and
reclamation ordering, callback work bounds and repeatable diagnostic tests.
Graph stereo rendering completes both channels before writing caller outputs;
either output may equal a source, but the output buffers must not overlap.
## Phase 12 quality policy
## Quality policy
[AUDIO_QUALITY.md](AUDIO_QUALITY.md) defines absolute musical timing, tempo snapshot
changes, scheduled source envelopes and configurable master transitions. The GUI

View file

@ -1,4 +1,4 @@
# Audio clips and recording (Phase 6)
# Audio clips and recording
## Import and playback
@ -30,7 +30,7 @@ audio source exists. Subsequent routing is explicit: disconnect it or route it
through gain/meter nodes in Modular Graph. Removing the output silences editor
graphs. This source does not monitor JACK input; unconnected ordinary graph
inputs retain their earlier external-input behavior. Track faders/pan/mute
are implemented by the Phase 8 track mixer (see MIXER.md); individual
are implemented by the track mixer (see MIXER.md); individual
track graph routing remains deferred.
Linear interpolation converts source sample rate to backend rate. There is no
@ -110,7 +110,7 @@ WAV -> saved/reopened project -> graph playback -> capture assertion.
Physical input/output, device latency, slow-disk endurance and server loss
during a real recording remain unverified.
## Phase 13 recording protection
## Recording protection
The default recorder and GUI require a new destination, including rejecting
symlinks. Publication also refuses files created during recording. The explicit
@ -138,7 +138,7 @@ player still limits each asset to 16M frames. Longer valid takes may require
external splitting before import. No directory fsync/power-loss guarantee is
claimed. WAV destinations are chosen explicitly by the user.
## Phase 22: non-destructive clip editing
## Non-destructive clip editing
Move clips by dragging their body; drag the left/right edge to trim within the
existing source length. Ctrl+D duplicates adjacent to the selected clip. Delete
@ -217,6 +217,6 @@ rollback, duplication/fade inheritance, persistence/invalid metadata, undo, peak
bins after source removal and byte-identical source preservation. GUI tests
cover short-clip selection, shared previews, split/duplicate/delete and undo.
Phases 69–79 add a modal audio source editor with frame selection, reversible
The modal audio source editor also provides frame selection, reversible
processing, selection export, copy adoption and transient slicing. See
[AUDIO_EDITOR.md](AUDIO_EDITOR.md) for commands, undo behavior and mono/size limits.

View file

@ -1,6 +1,6 @@
# Timing, transitions and audio quality
Phase 12 adds deterministic transition processing and tests. Musical time still
Deterministic transition processing and tests are included. Musical time still
uses a single constant tempo, 960 ticks per quarter note and fixed 4/4 meter;
it does not introduce a tempo map, meter editor or JACK transport following.
Project format remains v4 (reads v1–v3).
@ -150,7 +150,7 @@ exact master ramps, repeated stop requests, held position/silence after completi
deactivation failure/retry, immediate escape and recording guards. The workflow
render comparison now enables the GUI source fade policy before/after reopening.
Phase 12 automated checks pass warning-enabled core/GUI and no-JACK builds,
Automated checks pass warning-enabled core/GUI and no-JACK builds,
ASan/UBSan/leak checks, static analysis, pthread TSan tests, mock and live GUI,
software JACK audio/MIDI tests and staged installation. GUI leak checks retain
the existing fontconfig-only suppression; core leak checks are unsuppressed.

View file

@ -1,6 +1,6 @@
# Build baseline
Phase 0 retains the existing layout: public C headers in `include/xtc`,
The existing layout is retained: public C headers in `include/xtc`,
C implementation modules under `src`, optional C++ GUI under `src/gui`, and
tests under `tests`. `src/main.c` is a minimal headless startup/shutdown check;
it does not initialize audio devices or open a GUI.
@ -40,8 +40,8 @@ the Makefile tries pkg-config first, then `fltk-config`.
## Dependencies and licensing
The offline core needs the C runtime and math library. Phase 2 adds optional
JACK support, selected with pkg-config; missing JACK does not prevent core/tests
The offline core needs the C runtime and math library. Optional JACK support is
selected with pkg-config; missing JACK does not prevent core/tests
from building. Realtime publication uses GCC/Clang lock-free atomic builtins in
C99. Tests also use POSIX threads. Backend consumers must link JACK explicitly;
backend objects are pulled from the static library only when used. The repository is MIT licensed. The optional GUI uses maintained
@ -52,7 +52,7 @@ traditional JACK client libraries use LGPL licensing. See decision 0004 for
the dependency choice and caveats. ALSA remains a future MIDI candidate. No packages or system settings
are changed by these build commands.
## Phase 2 verification
## Backend verification
```sh
make all test gui debug
@ -76,7 +76,7 @@ fault-injection tests cover those notification paths. No packages installed
or system/device configuration changed. Sanitizers are not enabled in the live
callback qualification run.
## Phase 3 verification
## GUI shell verification
```sh
make clean all test gui debug test-gui test-gui-jack
@ -92,7 +92,7 @@ exit-time font allocations; see tests/integration/README.md for the distinction
and command. No compiler warnings remain with GCC or Clang. Core/backend tests
pass with unsuppressed ASan/UBSan. No packages or system configuration changed.
## Phase 4 verification
## Graph editor verification
```sh
make clean all test gui debug test-gui test-gui-jack
@ -109,7 +109,7 @@ playback, reject cycles, reconnect and close active clients. Mouse/visual smoke
checks cover node creation, wiring, cycle rejection, dragging and deletion.
No physical routes, new dependencies or system changes are introduced.
## Phase 5 verification
## Project verification
```sh
make clean all test gui debug test-gui test-gui-jack
@ -125,12 +125,12 @@ The updated core and GUI tests pass Clang ASan/UBSan (the GUI uses the existing
fontconfig-only LSan suppression). An Xvfb/xdotool visual check created a track
and region, moved it one bar and zoomed the canvas. No dependencies were added.
Phase 6 will add audio assets and recording. Silent arrangement regions, fixed
Audio assets and recording are supported. Silent arrangement regions, fixed
tempo/4/4, no undo, no persisted GUI layout, and unverified physical-device
playback/endurance remain explicit limits.
## Phase 6 verification
## Audio verification
```sh
make all test gui debug test-gui test-gui-jack test-jack-audio
@ -155,7 +155,7 @@ LSan suppression). ThreadSanitizer passes the concurrent recorder and existing
realtime handoff tests. Hardware capture/playback, disk endurance and real server
loss during recording remain unverified. See AUDIO_FILES.md.
## Phase 7 verification
## MIDI verification
```sh
make all test gui debug test-gui test-gui-jack test-jack-audio test-jack-midi
@ -176,7 +176,7 @@ The no-JACK core/GUI suite and Clang ASan/UBSan core/GUI suite also passed; GUI
leak checking uses only the existing fontconfig suppression documented in the
integration README. Physical MIDI and audio devices remain unverified.
## Phase 8 verification
## Mixer verification
```sh
make all test gui debug test-gui test-gui-jack test-jack-audio test-jack-midi
@ -191,13 +191,13 @@ checks hard-right saved-note playback and output meter snapshots; mono audio
record/play acceptance remains covered. A native Xvfb mouse smoke check confirms
sliders and automation drawing. See MIXER.md for capacities and deferred features.
The fresh Phase 8 verification build, no-JACK core/GUI suite and Clang
The fresh verification build, no-JACK core/GUI suite and Clang
ASan/UBSan core/GUI suite passed without compiler warnings. GUI leak checking
retains only the existing fontconfig suppression. ThreadSanitizer also passed
the recorder concurrency and realtime publication tests. Physical devices and
long-running stereo performance remain unverified.
## Phase 9 release preparation
## Release preparation
```sh
make all test gui debug test-gui test-gui-jack test-jack test-jack-audio test-jack-midi
@ -216,14 +216,14 @@ forces a child-local write limit, checking complete finalized destinations and
explicit orphan temporaries. Performance timings are reported, not used as a
universal realtime guarantee. See RELEASING.md, RECOVERY.md and PERFORMANCE.md.
Phase 9 verification passed a fresh warning-enabled core/debug/GUI build, all
Verification passed a fresh warning-enabled core/debug/GUI build, all
software JACK targets, staged install/uninstall, recovery and performance tests.
No-JACK core/GUI/install checks and Clang ASan/UBSan core/GUI checks also passed
(the GUI retains only its existing fontconfig leak suppression). TSan recorder
and realtime-handoff checks passed. Two independent optimized source exports
and their repacked source archives were byte-identical on this toolchain.
## Phase 10 reliability audit
## Reliability audit
Run `make test-reliability` for the core suites, allocation-failure sweep,
callback allocation/free guard and native reclamation checks. Run
@ -233,21 +233,21 @@ tools; the allocation guard uses a GNU-compatible linker. See
[RELIABILITY.md](RELIABILITY.md) for ownership, audit findings,
full verification commands and remaining limits.
## Phase 11 workflow acceptance
## Workflow acceptance
`make test-workflow` requires FLTK/JACK development files, Xvfb and an existing
JACK-compatible server. It does not start/configure the server or connect
physical devices. See [WORKFLOW.md](WORKFLOW.md) for the full GUI composition
acceptance sequence and transport semantics.
## Phase 12 audio quality
## Audio quality
`make test-quality` runs exact timing, source-boundary, gain-ramp, event-order
and numeric/layout tests (also included in `make test`). `make quality-preview`
builds the C example and writes raw/smoothed listening WAVs into BUILD_DIR without
playing them or configuring devices. See [AUDIO_QUALITY.md](AUDIO_QUALITY.md).
Phase 14/15 checks: `make test-processor test-plugins test-gui-plugins`.
Parameter-processor and plugin checks: `make test-processor test-plugins test-gui-plugins`.
The latter two need the system LADSPA development header; real-plugin acceptance
is separate (`make test-plugins-real`, paths listed in PLUGIN_HOSTING.md). With no
`ladspa.h`, the ordinary core/GUI still builds and plugin operations return
@ -258,13 +258,13 @@ Link static consumers with `-lm -ldl` plus the backend dependencies when used.
See LICENSES.md for header/plugin licensing and decision 0009 for rationale.
Recording stress/recovery is available with `make test-recording`.
Phase 29 developer qualification: `make check-development` runs the core build,
Developer qualification: `make check-development` runs the core build,
regressions, scale/virtual endurance, benchmark-gate checks, Clang analysis and
ASan/UBSan. Run `make benchmark benchmark-project` separately without contention
or sanitizers for timing reports. Optional `make test-stress-plugins` requires
installed LADSPA headers; `make test-stress` supports minimal builds too.
## Phase 30 installation layouts
## Installation layouts
`make test-install test-install-layout` verifies default and custom layouts in
throwaway staging directories, C/C++ installed consumers, examples and exact
@ -273,14 +273,14 @@ removal. Override `PREFIX`, `exec_prefix`, `bindir`, `libdir`, `includedir`,
`desktopdir` as needed. `DESTDIR` adds staging separately; pass the same layout
to uninstall. See RELEASING.md for commands and RELEASE_NOTES.md for upgrades.
Phase 31 modern plugin adapters build in C99 using the pinned header-only CLAP
Modern plugin adapters build in C99 using the pinned header-only CLAP
and VST3 C APIs under third_party; there is no network build or SDK runtime.
VST2 compatibility uses original ABI declarations. `make test-modern-plugins`
runs original shared-library fixtures without a server; `make test-gui-modern-plugins`
adds GUI/browser/undo/reopen tests under Xvfb. The fixtures also run in `make test`
and therefore in sanitizer/release builds. Notices are installed with LICENSE.
Phase 33 uses a header-only FLTK theme and existing drawing primitives; no new
The GUI uses a header-only FLTK theme and existing drawing primitives; no new
GUI dependency or generated asset is required. `make test-gui-instruments` also
exercises sidebar track creation, rollback, undo/reopen and minimum/large layouts.
See WORKSPACE.md for the default size and manual visual verification.

View file

@ -8,7 +8,7 @@ instrument dropdown. Soft Keys blends a sine with a third harmonic; Sub Bass
uses a pure sine. Both have 32 voices, velocity sensitivity,
short attack/release envelopes, sustain pedal, note-off and panic handling.
High harmonics are omitted near Nyquist. The default sounds remain compatible with fixed presets from v13. See the
Phase 41 controls below. A sample library is not provided by these oscillators.
instrument controls below. A sample library is not provided by these oscillators.
In **Modular Graph**, select a wire and choose **Edit → Insert internal delay on
wire** or **Insert internal reverb on wire**. This preserves the route and inserts
@ -24,8 +24,8 @@ Changes use the existing stopped-engine preparation and undo workflow.
These are basic mono processors; stereo plans use independent instances. Reverb
is deliberately simple and has no room model or stereo diffusion. Delay time
changes can click; these original devices have no crossfade or tempo sync.
Internal effect history resets on transport discontinuities. Phase 44 below
documents configurable export tails and optional playback stopping after tails.
Internal effect history resets on transport discontinuities. Configurable export
tails and optional playback stopping after tails are described below.
Project format 13 stores internal devices as format 4 with reserved module path
`/xtc/internal`, stable numeric identity and index (0 keys, 1 bass, 2 delay,
@ -35,14 +35,14 @@ presets. Readers still accept formats 1–12. Older xtc builds reject format 13.
All buffers are allocated during preparation; processing performs no allocation,
file access, library loading, locking or GUI calls.
Validation: `make BUILD_DIR=build/phase38 all gui test test-gui-instruments
Validation: `make BUILD_DIR=build/builtins all gui test test-gui-instruments
test-gui-modern-plugins test-gui-plugins analyze` (join onto one line).
`test-builtins` checks impulse tails, dry mix, feedback bounds, block partition
consistency, note release/panic and instrument/effect project round trips.
## Phase 40 acceptance checks
## Acceptance checks
`make BUILD_DIR=build/phase40 all gui test test-reliability test-gui builtin-preview`
`make BUILD_DIR=build/builtin-acceptance all gui test test-reliability test-gui builtin-preview`
checks all four device identities and GUI paths without external plugin binaries.
The reliability runner fails each internal preparation allocation in turn and
forbids allocation/free, direct file I/O and blocking locks during processing.
@ -58,7 +58,7 @@ followed by silence for tails. Check onset/release, unwanted discontinuities,
finite decay and the documented mono character. Generation is verified;
human listening and physical-device qualification remain pending.
## Phase 41 instrument controls and presets
## Instrument controls and presets
**Edit → Selected instrument controls** edits an assigned internal instrument.
The five ports are harmonic amount (0..1), attack (0.1..2000 ms), release
@ -91,7 +91,7 @@ old fixed internal assignments use their original defaults. Older builds reject
v14. Tests cover legacy-default sound equality, v13 migration, parameter/preset
round trips, pitch-bend offsets, automated block partitions, undo and GUI edits.
## Phase 42 sample instrument
## Sample instrument
**File → Load sampler WAV** assigns a Sample Player to the selected track or
relinks its existing sample while retaining its controls. Use the instrument
@ -122,7 +122,7 @@ Tests cover source-rate conversion, one-shot endpoint, looping, release,
partitioning, preset references, missing assets, GUI relinking/undo/reload and
preparation-allocation/callback guards.
## Phase 43 stereo effects
## Stereo effects
**File → Add stereo delay/reverb** and **Edit → Insert stereo delay/reverb on
wire** add new devices (indices 5/6). Original Delay/Reverb (indices 2/3) retain
@ -153,7 +153,7 @@ energy, bounded extreme feedback/diffusion and graph/direct stereo output
identities; callback guards and ASan/UBSan cover processing. `make builtin-preview`
also writes files 5/6 for repeatable listening; human listening remains pending.
## Phase 44 history and tails
## History and tails
Internal effects reset on a transport discontinuity (seek/loop wrap), stopped
backend, or newly prepared plan. Pause uses backend Stop and therefore also

View file

@ -3,46 +3,46 @@
All mutations run on the control thread through the existing stop, history and
prepared-plan workflow. No new dependencies are required.
## Phase 58 — Persistent Arrangement Markers
## Persistent Arrangement Markers
Edit/Markers/Set at cursor adds or renames a marker; Remove at cursor removes the exact tick key. Markers draw names and vertical guides in the arrangement and survive project save/load and undo. Up to 128 markers are supported. Names may overlap visually when markers are close; markers do not change playback by themselves.
## Phase 59 — Section Navigation and Looping
## Section Navigation and Looping
View/Previous marker and Next marker navigate without wrapping and stop playback before seeking. Loop current section uses the last marker at or before the cursor through its successor; the final section ends at the final clip endpoint. Empty final sections reject. Loop ranges remain existing UI preferences rather than marker metadata.
## Phase 60 — Ripple Time Editing
## Ripple Time Editing
Edit/Time inserts a gap or removes a tick range beginning at the cursor. Clips crossing either edit boundary reject the entire operation; split them first. Contained clips and their notes are removed; later clips, markers and absolute automation points shift together. Source notes within retained clips do not move. No interpolation guard points are generated, so automation ramps across the boundary may change slope. Loop preferences are unchanged.
## Phase 61 — Complete Track Duplication
## Complete Track Duplication
Edit/Duplicate complete track copies the selected non-bus track adjacent to its source. Clips, notes, instrument settings, static mix, bus routing and mixer automation are independent model copies with fresh IDs; WAV references remain shared. The modular graph and live-input target are unchanged. Bus duplication is rejected. Capacity errors leave the original document unchanged.
## Phase 62 — Nondestructive MIDI Clip Splitting
## Nondestructive MIDI Clip Splitting
The existing Split clip at cursor command (S) now handles MIDI as well as audio. Left retains its ID; right gets fresh IDs, the same source content and an adjusted source offset. Hidden notes remain editable. Split is nondestructive, but instrument note envelopes may retrigger at the new boundary; original sine rendering retains source phase. Capacity failures preserve the project.
## Phase 63 — MIDI Clip Consolidation
## MIDI Clip Consolidation
Edit/Consolidate MIDI clips merges two or more selected MIDI clips on one track. The new clip spans their full bounding range; gaps and overlapping notes remain. Notes outside visible trims are discarded and crossing notes are cropped to audible boundaries. IDs are fresh. Cropped notes start anew, so envelope/phase behavior can change. Audio or cross-track selections reject atomically.
## Phase 64 — Deterministic MIDI Humanization
## Deterministic MIDI Humanization
Edit/MIDI tools/Humanize applies timing variation up to 960 ticks and velocity variation up to 127, using a 32-bit seed and stable note IDs. Repeating from the same original state reproduces results; applying repeatedly accumulates edits. All source notes are affected, including hidden trimmed notes. Timing outside source bounds rejects the entire edit; velocities clamp to 1..127. This is offline editing, not live randomness.
## Phase 65 — Chord Construction
## Chord Construction
Edit/MIDI tools/Build chords accepts 1..8 unique nonzero semitone intervals, such as 4 7 for a major triad or 3 7 for minor. Originals remain; added notes copy timing, velocity and channel. Negative intervals support lower voicings. All source notes are processed, including hidden trimmed notes. Pitch overflow or capacity rejects the whole operation; existing unisons are not deduplicated.
## Phase 66 — Offline Arpeggio Generation
## Offline Arpeggio Generation
Edit/MIDI tools/Generate arpeggio replaces source notes with a written pattern. Equal-onset notes on the same channel form a chord lasting until its longest note end. The pattern cycles sorted pitches upward or downward, with the selected step and gate. Each step inherits its chosen note velocity/channel. All source notes, including hidden trimmed notes, participate. This is offline generation with undo, not a live arpeggiator or tempo-synced MIDI effect.
## Phase 67 — Audio Peak Normalization
## Audio Peak Normalization
Edit/Audio tools/Normalize source peak accepts a target from -60 to 0 dBFS. The C API accepts a linear target above 0 and at most 1. Analysis uses the audible native-rate source slice and the same mono downmix as playback, before fades or mixer controls. It replaces clip gain without writing WAV data. Silence, missing/invalid media, MIDI selections or required gain above 4 reject the entire batch. This is sample-peak normalization, not true-peak limiting or LUFS loudness normalization. Analysis runs synchronously on the control thread.
## Phase 68 — Portable Project Collection
## Portable Project Collection
File/Collect project media... requires a new absolute folder. The original document and files remain unchanged; open project.xtc inside the new folder to use the copy. Referenced audio and track/graph sampler WAVs are deduplicated and copied byte-for-byte, with relative references. Limits are 128 distinct assets, 256 MiB per file, 1 GiB total and a canonical folder path shorter than 480 bytes. Existing destinations, missing media, nonregular files and native graph nodes reject. External plugin binaries/state are not collected; plugins must remain installed. Invalid WAV data is copied rather than repaired. The folder is visible during synchronous collection; failures remove owned outputs, and the project file is saved last.

View file

@ -1,4 +1,4 @@
# Automation and expressive control (Phases 16 and 26)
# Automation and expressive control
Track Gain/Pan lanes in the Mixer apply to audio and scheduled instrument voices.
They use absolute project ticks, linear or hold interpolation, hold-first/last outside
@ -48,7 +48,7 @@ make test test-control test-plugins test-gui-plugins test-plugins-real
Physical controller devices and listening remain unqualified; no tempo map,
latency compensation, MIDI capture, pitch bend or plugin crash isolation is added.
## Phase 26: common parameter targets
## Common parameter targets
`xtc_control.h` identifies a parameter by `(kind, stable owner ID, parameter ID)`.
IDs never mean a dense list index and are not DSP pointers:

View file

@ -1,8 +1,8 @@
# Creative workflow additions (Phases 90–99)
# Creative workflow additions
These features prioritize fast musical experiments and retain the existing
control-thread preparation and project undo model. They introduce no dependency
or project-format change. Each phase is qualified separately in ROADMAP.md.
or project-format change.
## Selected track inserts

View file

@ -1,4 +1,4 @@
# Editing commands and undo (Phase 27 audit)
# Editing commands and undo audit
The control thread owns project edits and history. Audio plans are immutable
snapshots; widgets never pass editable project pointers into the callback.

View file

@ -17,7 +17,7 @@ Visual direction: compact, high-contrast, restrained dark interface. Avoid
excessive animation and modal configuration. Recreate broad usability ideas,
not energyXT's exact artwork or proprietary resources.
## Phase 3 shell
## Shell
The shell opens JACK on startup through `xtc_backend.h`. It never accesses
backend structures, processes samples, or calls JACK itself. Graph domain
@ -62,7 +62,7 @@ server, tests repeated start/stop, reconnect and active-client close, and create
no routes. Physical playback is outside this shell. See BUILD.md and the
integration test README for sanitizer limitations and keyboard smoke results.
## Phase 4 modular editor
## Modular editor
Open **Modular Graph** or press **Ctrl+3**. Add oscillator (440 Hz), gain (0.10),
pass-through meter or output nodes with the toolbar. Their parameters are fixed
@ -101,7 +101,7 @@ crossfaded. Render validation and active replacement tests are described in
tests/integration/README.md.
## Phase 5 projects and sequencer
## Projects and sequencer
File/New (Ctrl+N), Open (Ctrl+O), Save (Ctrl+S), and Save As
(Ctrl+Shift+S) use native file dialogs and the C persistence API. New/Open/Quit
@ -128,7 +128,7 @@ A ruler click seeks while stopped (or positions the cursor when disconnected).
The 100 ms GUI refresh converts the backend's actual sample counter to ticks;
it never integrates wall-clock time. Play resumes and Stop pauses. Reconnect,
New and Open reset position. Add region creates silent metadata; imported WAV clips play through the
audio source node (Phase 6 below). MIDI clips and notes are described below. The C model
audio source node (see below). MIDI clips and notes are described below. The C model
supports a constant tempo; a tempo map and scheduler are future work.
Tests cover C-model/persistence boundaries, GUI move/trim gestures and zoom,
@ -136,7 +136,7 @@ save/reopen, failed load/submission rollback, sample-derived cursor updates,
and live JACK playhead advance/pause.
## Phase 6 audio workflow
## Audio workflow
Use File/Import WAV (Ctrl+I) to add an audio clip at the playhead on the selected
track, or on a new Audio track. Record (Shift+F5) chooses a WAV destination and
@ -159,9 +159,9 @@ See AUDIO_FILES.md for supported WAV formats, memory limits, musical placement,
recording overflow/partial-take recovery, external asset portability and the
software-only acceptance tests. Waveform drawing, input monitoring, recording
latency compensation and per-track graph inserts are not implemented.
Per-track gain/pan/mute/solo is available in Phase 8 below.
Per-track gain/pan/mute/solo is available in the mixer below.
## Phase 7 piano roll
## Piano roll
Add MIDI clip creates a one-bar clip on the selected/first existing track at the
cursor. Select it and choose Piano roll (View/Piano roll, Ctrl+4). Click to draw,
@ -172,7 +172,7 @@ Panic/F9 silences held notes; Record continues to mean WAV audio capture.
Modular Graph offers Add instrument for explicit routing. Status includes MIDI
drops. See MIDI.md for voice limits, unsupported messages and live input routing.
## Phase 8 mixer and editing
## Mixer and editing
Mixer (Ctrl+2) now has a selectable track strip, gain/pan controls, mute/solo,
Output L/R peaks and editable gain/pan automation lanes. Mixer edits stop
@ -182,7 +182,7 @@ and redo up to 32 project edits; New/Open resets history. M/S and arrow keys
provide mixer shortcuts. See MIXER.md for exact controls, history rollback,
stereo port routing, automation semantics and prototype limits.
## Phase 11 minimal composition workflow
## Minimal composition workflow
[WORKFLOW.md](WORKFLOW.md) walks through creating, arranging, saving, closing,
reopening and playing MIDI/audio with the GUI. New/Open select Sequencer;
@ -197,7 +197,7 @@ stereo render comparisons across destruction/recreation of the GUI and live
playhead/meter/transport checks. `test-gui` covers stop/seek failure and recording
guards. No project files need manual editing for this workflow.
## Phase 12 timing and transitions
## Timing and transitions
The GUI enables 5 ms source boundaries and master start/stop ramps. Ordinary
Pause/Stop now request a fade and show “stopping” until the timer collects its
@ -206,7 +206,7 @@ project installation retain immediate semantics. See
[AUDIO_QUALITY.md](AUDIO_QUALITY.md) for timing, overload/denormal behavior, latency
limits, test commands and the pending human-listening checklist.
## Phase 23 routing refinement
## Routing refinement
Graph selection now reports edge counts, output reachability and external-input
fallback. Direction arrows, role colors, incident-wire highlighting and no-output

View file

@ -598,9 +598,9 @@ Sanitizers and diagnostic logging should not be enabled in production real-time
## 14. Development roadmap and acceptance criteria
Implement phases in order. Do not jump ahead merely because a later feature is exciting.
Implement these milestones in order. Do not jump ahead merely because a later feature is exciting.
### Phase 0 — Repository and design baseline
### Repository and design baseline
- Inspect the repository and available toolchain.
- Create or update architecture documentation and the Makefile.
@ -610,7 +610,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** clean build on the target Linux environment; no audio engine assumptions hidden in GUI code.
### Phase 1 — C core and offline processing
### C core and offline processing
- Create the C library/API.
- Define node, port, connection, and graph data structures.
@ -621,7 +621,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** automated test proves oscillator → gain → meter/output produces expected samples without hardware.
### Phase 2 — Real-time backend
### Real-time backend
- Add the first Linux audio backend.
- Implement start/stop, device configuration, and error handling.
@ -631,7 +631,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** stable playback for a sustained test; no known callback allocations or blocking calls; failures are reported clearly.
### Phase 3 — FLTK shell
### FLTK shell
- Create main window, menus, transport, status area, and view switching.
- Call the C API through the public header.
@ -640,7 +640,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** GUI can start/stop the engine, report backend errors, and close without leaks or hangs.
### Phase 4 — Modular graph editor
### Modular graph editor
- Draw nodes and ports.
- Add/select/move nodes.
@ -650,7 +650,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** graph shown by the GUI matches the graph used by the engine; invalid connections are rejected without corrupting active playback.
### Phase 5 — Project and sequencer foundation
### Project and sequencer foundation
- Add project persistence and stable IDs.
- Add tracks and clip objects.
@ -659,7 +659,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** save/load a project with clips and reproduce the same arrangement.
### Phase 6 — Audio clips and recording
### Audio clips and recording
- Add audio file import and clip playback.
- Add recording through a safe producer/consumer buffer path.
@ -668,7 +668,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** record, save, reopen, and play a basic audio project without callback file I/O.
### Phase 7 — MIDI and a simple instrument
### MIDI and a simple instrument
- Add MIDI input and clip events.
- Add a basic internal synthesizer or test instrument.
@ -677,7 +677,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** record or draw MIDI notes, play them in time, save the project, and reopen it.
### Phase 8 — Mixer, automation, and editing polish
### Mixer, automation, and editing polish
- Add mixer channels, gain/pan, meters, mute/solo.
- Add automation lanes and interpolation.
@ -686,7 +686,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
**Acceptance:** basic composition and mixing can be completed without editing project files manually.
### Phase 9 — Extensibility and release preparation
### Extensibility and release preparation
- Define and document the native node/instrument/effect API.
- Evaluate external plugin hosting only after core lifecycle handling is robust.
@ -699,7 +699,7 @@ Implement phases in order. Do not jump ahead merely because a later feature is e
## 15. Initial implementation task for the agent
Start with **Phase 0 only**.
Start with the **repository and design baseline** only.
1. Inspect the current repository and report its state.
2. Identify the available C/C++ compilers, FLTK version, audio backend development packages, `pkg-config`, and test tools.
@ -710,7 +710,7 @@ Start with **Phase 0 only**.
7. Build it and run its tests.
8. Report exact commands, results, assumptions, and any missing dependencies.
After Phase 0 is reviewed, continue with Phase 1. Keep each phase independently buildable and testable.
After the baseline is reviewed, continue with the C core and offline processing. Keep each milestone independently buildable and testable.
---

View file

@ -66,7 +66,7 @@ PERFORMANCE.md, PLUGIN_HOSTING.md and RECOVERY.md for tested contracts/evidence.
historical selection/layout is not stored. Native context-menu/focus manual
qualification and broad accessibility testing remain pending. See EDITING.md.
Phase 28 project diagnostics use syntax-line locations; semantic cross-reference
Project diagnostics use syntax-line locations; semantic cross-reference
failures identify the MODEL stage without a source line. `xtc-check --inspect`
checks dependency file availability only, without loading code or WAV contents.
The project format is Linux/POSIX oriented; absolute plugin paths, architecture,
@ -74,7 +74,7 @@ ABI and JACK/device configuration must be supplied on another system. Unknown
fields are rejected, not preserved. See PROJECT_FORMAT.md for versions 1–10 and
RECOVERY.md for save failures after rename.
Phase 31 CLAP/VST2/VST3 loading supports Linux binary modules, one-input mono
CLAP/VST2/VST3 loading supports Linux binary modules, one-input mono
float32 zero-latency effects at default configuration. No modern parameter edit,
automation, programs, opaque state, MIDI/instruments, transport, custom editor,
workers, sidechains or true stereo/multichannel buses are implemented. Plugin
@ -82,7 +82,7 @@ bundles must be opened at their actual Linux shared-library binary. Only origina
ABI fixtures are qualified; arbitrary third-party modern plugins remain untested.
See PLUGIN_HOSTING.md and decision 0010 for lifecycle and licensing boundaries.
## Phase 32 instrument support
## Instrument support
MIDI tracks can bind CLAP, VST2 and VST3 instruments. In the Track menu, select
**Load instrument plugin** for the selected sequencer track; **Use built-in
@ -114,7 +114,7 @@ references remain inspectable without loading; failed GUI preparation retains
the current project. Save a backup for applications limited to v11 or earlier.
### Track insert chains (Phases 80–89)
### Track insert chains
Track chains contain at most eight mono effects. Modern adapters require zero
reported latency, use default configuration and do not provide native plugin

View file

@ -2,13 +2,12 @@
The repository's original code, example and documentation are under the MIT
license in LICENSE (copyright Johannes Findeisen). No energyXT source, artwork,
proprietary SDK, vendored DSP or plugin binary is included. Phase 31 vendors
permissively licensed ABI headers with their own notices. The source archive
proprietary SDK, vendored DSP or plugin binary is included. Permissively licensed
ABI headers are vendored with their own notices. The source archive
contains repository files and an export manifest; it does not bundle system
libraries. Installation includes LICENSE and these documents.
The Phase 9 host review inspected installed package metadata and local license
files. Package-level license sets can include utilities/docs that differ from the
The host review inspected installed package metadata and local license files. Package-level license sets can include utilities/docs that differ from the
specific library being linked; retain the relevant upstream notices when
redistributing dependencies. The default install uses system shared libraries.
@ -31,7 +30,7 @@ redistributing dependencies. The default install uses system shared libraries.
GNU Make, GCC/Clang, binutils, pkg-config and optional Xvfb/xdotool/sanitizers are
build/test tools, not shipped dependencies. New Python tooling needs Python 3.12+
for safe tar extraction in release tests; this host has Python 3.14.8. No packages
were installed and no application dependency was added in Phase 9.
were installed and no application dependency was added.
Binary redistributors must inspect their own `readelf -d`/`ldd` dependency set
and supply the notices/source/relinking facilities required by those exact
@ -39,7 +38,7 @@ licenses and linking choices. FLTK's exception does not remove obligations of
other linked libraries. This review covers the current unmodified system-linked
build; static all-in-one bundles and external plugins need a separate review.
## Phase 15 LADSPA review
## LADSPA review
The optional external host includes the system LADSPA 1.1 header (`ladspa`
1.17-7), copyright Richard W.E. Furse, Paul Barton-Davis and Stefan Westerfeld,
@ -56,7 +55,7 @@ to bundle or relicense it. Redistributors must review each chosen module and the
combined distribution's obligations separately; xtc's MIT grant covers only its
original code. No third-party plugin is included in source archives or installs.
## Phase 31 pinned header dependencies
## Pinned header dependencies
CLAP headers are MIT, copyright Alexandre BIQUE, from upstream commit
`a47f6badb49d948fd009998f28309cdab78979c9`. The generated VST3 C ABI header is

View file

@ -57,7 +57,7 @@ file records its private dependency. Public headers contain no JACK/FLTK types.
To build without optional libraries, set PKG_CONFIG=false FLTK_CONFIG=false.
Python is not needed to run the installed executables or library.
## Phase 20 binary/development archive
## Binary/development archive
`make package` creates a system-linked Linux archive plus SHA-256 sidecar below
BUILD_DIR; `make test-package` verifies its contents. It includes usr/bin,

View file

@ -54,7 +54,7 @@ post-publication sync errors. Native descriptor ABI compatibility is distinct fr
project format and is documented in NATIVE_API.md; opaque DSP state is not promised.
No public stability guarantee or support SLA is implied by development version 0.1.0.
## Phase 30 support and triage record
## Support and triage record
Verified compilers are GCC/G++ 16.2.1 and Clang/Clang++ 23.1.3 on x86_64 Linux;
these are tested versions, not a promise that arbitrary older/newer versions work.

View file

@ -1,6 +1,6 @@
# MIDI clips and instrument
Phase 7 supports drawing persisted notes and live JACK MIDI input. Record still
Drawing persisted notes and live JACK MIDI input are supported. Record still
captures audio to WAV: MIDI capture and Standard MIDI File import are deferred.
## Workflow
@ -74,9 +74,9 @@ may lag activation under PipeWire; the test waits before connecting.
Physical MIDI devices, bridge/device loss behind an unchanged port, latency and
long-running performance remain unverified. Panic/Stop provides manual recovery.
Phase 8 adds track mixing, automation and project undo/redo; see MIXER.md.
Track mixing, automation and project undo/redo are available; see MIXER.md.
## Phase 21 composition commands
## Composition commands
The piano-roll **Notes** menu exposes these commands. Shortcuts apply while the
piano roll has focus; use the main window Edit menu for undo/redo.
@ -132,12 +132,12 @@ live order, adjacent/overlapping notes, exact block partitions and seek chase.
`make test-gui` covers mouse edits and the new commands with undo/redo and engine
reinstallation. Listening and physical MIDI-device validation remain pending.
Phase 26: CC7/10/64 are defaults, configurable per channel through Audio → MIDI
controller mapping. Disabled/unmapped CCs have no effect; CC120/123 stay panic.
CC7/10/64 are defaults, configurable per channel through Audio → MIDI controller
mapping. Disabled/unmapped CCs have no effect; CC120/123 stay panic.
Decode accepts valid CC0..127 messages within the existing event budget. See
CONTROL.md for the exact bindings, ramp, sustain and automation precedence rules.
## Phase 32 instrument support
## Instrument support
MIDI tracks can bind CLAP, VST2 and VST3 instruments. In the Track menu, select
**Load instrument plugin** for the selected sequencer track; **Use built-in
@ -168,7 +168,7 @@ the callback and old instances are reclaimed on the control thread. Missing
references remain inspectable without loading; failed GUI preparation retains
the current project. Save a backup for applications limited to v11 or earlier.
## Phase 34 note dynamics and clip editing
## Note dynamics and clip editing
Double-click a MIDI clip to open its piano roll. The Note velocity slider and
fixed Velocity lane edit individual notes from 1 to 127, preserving timing,

View file

@ -112,7 +112,7 @@ Each channel latches red CLIP at linear peak >=1 (0 dBFS) until Reset peaks.
Reset is session state, not an audio edit. Selection changes preserve every strip's meter history. These are sample-peak meters, not RMS, LUFS or true-peak measurements.
There is no limiter; summed levels can exceed unity.
## Mix buses and gain staging (Phase 24)
## Mix buses and gain staging
Use Add bus in Mixer, select an ordinary track, then choose its Route: Master or
an existing bus. Buses share the 64-track capacity and gain/pan automation APIs.
@ -147,8 +147,8 @@ plus a baseline, cloning metadata and graph, never audio samples. Common graph,
track, clip, note, mixer, import/relink and automation edits are included. One
accepted gesture is one step; selection, scrolling and graph-node placement are
GUI state and are not undoable. New/Open resets history; Save retains it.
Undo/redo stops and resets transport; Phase 27 preserves surviving selections
by stable ID (layout remains session state). The
Undo/redo stops and resets transport; surviving selections are preserved by
stable ID (layout remains session state). The
candidate is installed before moving the history cursor: validation, asset-plan
or backend failure retains the current document and history position. Missing
assets retain the existing silent/reporting behavior. A new edit after Undo
@ -156,7 +156,7 @@ removes the redo branch; the oldest state is evicted at capacity. Allocation
ID high-water marks survive Undo/branching so abandoned IDs are not reused. History is
session-only and Undo marks the document dirty even if it matches a saved state.
External WAV files are never deleted or restored by Undo; recording itself cannot
be undone while active. Phase 27 reserves snapshot storage before GUI commands mutate/publish, so an
be undone while active. Snapshot storage is reserved before GUI commands mutate/publish, so an
allocation failure rejects the command before adoption; reserved capture itself
does not allocate. C clients using unreserved history record must handle errors.
@ -179,7 +179,7 @@ events, use mixer keys and exercise undo/redo, failed installation rollback,
branching, save/reopen and history reset. Live JACK MIDI acceptance verifies
saved/reopened hard-right playback and stereo peaks using only software clients.
A native Xvfb mouse smoke check covers sliders and automation drawing.
Phase 36 adds checks for independent strip callbacks/meters, fader gestures, pan
Checks cover independent strip callbacks/meters, fader gestures, pan
centering, failed-edit restoration, routing, undo/reload, duplicate names and
stable IDs across reorder/removal. A 64-channel GUI session verifies scrolling
and minimum/large layouts. Screenshots include live JACK meters and a bus strip.
@ -191,7 +191,7 @@ project performance remain unverified; no new dependency was introduced.
automation, persistence, invalid routes, deletion/undo and dBFS ballistics. Backend
tests cover consuming interval peaks; GUI tests cover routing undo and clipping.
Phase 26 adds Linear/Hold interpolation for each point added or replaced. The
Linear/Hold interpolation is available for each point added or replaced. The
point's mode applies to its following segment. Static controls remain fallbacks
while a lane exists; moving/splitting clips does not move absolute track/bus lanes.
See CONTROL.md for common parameter IDs and controller/automation precedence.

View file

@ -1,58 +1,57 @@
# Modern editing workflows
Phases 47–57 introduced these control-thread edits without changing format 15.
These control-thread edits were introduced without changing format 15.
The current writer uses format 16 for arrangement markers and still reads older projects. Session selections,
clipboard and comparison snapshots are not saved in projects. Audio callbacks
continue to consume prepared plans; edits use the existing stop/history workflow.
## Phase 47 — Arrangement Multi-selection
## Arrangement Multi-selection
Shift-click clips to toggle selection; Ctrl+A in the sequencer or Edit/Select all clips selects every clip. Plain clicking replaces the selection. Selection is session UI state; no marquee selection yet.
## Phase 48 — Transactional Group Editing
## Transactional Group Editing
Use Left/Right in the sequencer (or Edit/Nudge selection) to move the selected phrase by the current snap step. Ctrl+D duplicates after its complete bounding span; Delete removes selected clips. Edits are atomic and undoable. Mouse dragging remains a single-clip gesture.
## Phase 49 — Arrangement Clipboard
## Arrangement Clipboard
Ctrl+C/Ctrl+V in the sequencer, or Edit/Copy clips and Paste clips at cursor, copy/paste the selection. Earliest clip lands on the cursor. The earliest source track maps to the currently selected destination track; intervening track spacing is retained. All required tracks must already exist and must not be buses. Instruments, automation and media bytes are not copied. The clipboard survives document changes within the window but is not the OS clipboard.
## Phase 50 — Repeat Arrangement Patterns
## Repeat Arrangement Patterns
Edit/Repeat selected phrase asks for 1..1024 additional copies. The bounding span includes gaps and overlaps; copies remain on their original tracks. The entire repeat is one undo step. Clip/note capacity and timeline endpoints can limit the requested count.
## Phase 51 — Align and Slip Editing
## Align and Slip Editing
Edit/Align clip starts to cursor places every selected start at the cursor. Slip sources earlier/later changes source offsets by the snap step while retaining timeline positions and durations. Trimming must leave source material available; an invalid slip rejects the whole selection. No time stretching or destructive media edits are performed.
## Phase 52 — MIDI Swing Quantization
## MIDI Swing Quantization
Select MIDI clips and use Edit/MIDI tools/Swing quantize. Grid is in source ticks; swing delays alternate subdivisions by 0..half a grid step, while strength blends the old start toward the nearest swung point. Durations stay fixed. All source notes are affected, including notes outside visible trims. Mixed audio/MIDI selections and notes that would exceed source bounds reject the entire edit. This is destructive note editing with undo, not a live groove engine.
## Phase 53 — MIDI Legato and Gate Tools
## MIDI Legato and Gate Tools
Edit/MIDI tools/Note gate scales lengths from 1 to 400 percent, rounded to at least one tick. Legato ends notes at the next strictly later onset in the same clip and channel; notes in a chord end together. The final onset extends to source end. Gate expansion beyond the source rejects the whole edit. Undo restores original durations.
## Phase 54 — MIDI Scale Correction
## MIDI Scale Correction
Edit/MIDI tools/Correct to scale takes a root (0=C through 11=B) and chromatic, major or natural minor. Each pitch moves to the nearest permitted MIDI note; ties choose the lower pitch. Timing, channel and velocity remain unchanged. Corrections can produce unison notes; notes are not merged. This changes MIDI notes, not audio pitch or a live scale filter.
## Phase 55 — MIDI Velocity Shaping
## MIDI Velocity Shaping
Edit/MIDI tools/Shape velocities scales from 0 to 400 percent, rounds, then applies an offset from -127 to 127. Results clamp to 1..127, keeping every note audible rather than introducing velocity-zero note-offs. Use 0 percent with a positive offset for a fixed velocity. No randomization is applied.
## Phase 56 — Batch Audio Fade Tools
## Batch Audio Fade Tools
Edit/Audio tools/Set boundary fades sets linear fade-in and fade-out lengths in ticks; 0 or Remove boundary fades clears them. Each fade must fit within half of every selected clip duration. Gain and source offsets stay unchanged. These are boundary envelopes, not overlap-aware crossfades, equal-power curves or destructive WAV processing.
## Phase 57 — Mixer A/B Comparison
## Mixer A/B Comparison
Edit/Mixer comparison captures or recalls A and B. Capture stores static gain, pan, mute and solo for every track and bus without changing the document. Recall requires the same stable track IDs, stops playback through the normal edit guard and creates one undo step. Track order may change. Routing, plugins and automation are excluded; automation still overrides static gain and pan. Slots are session-only and clear on New/Open. This is static mix comparison, not seamless live scene morphing.
## Validation and remaining scope
Each phase was built with warnings enabled and tested before its implementation
commit. Reproduce the core, transaction and allocation-failure checks with:
The code is built with warnings enabled and tested. Reproduce the core, transaction and allocation-failure checks with:
```sh
make BUILD_DIR=build/roadmap-audit all gui test-reliability
@ -65,7 +64,7 @@ checks also cover the integrated changes. GUI leak checks use only the existing
system Fontconfig suppression. Save/reload comparisons render identical nonzero
MIDI output after musical transforms; no project format migration is required.
These phases improve arrangement and musical editing workflows. They do not
These workflows improve arrangement and musical editing workflows. They do not
provide DAW feature parity: time stretching, comping, a clip launcher, tempo maps,
track insert chains and customizable shortcuts need separate designs. No new
dependencies or audio-callback operations are introduced. Human listening,

View file

@ -82,7 +82,7 @@ prepare/process failures, stereo compile cleanup, retirement/destruction outside
processing, event offsets, seek note reset, source ports, instrument-buffer graph
routing and unsupported-save preservation. Run `make test`.
## Phase 14: structured parameter processors
## Structured parameter processors
`xtc_processor.h` is the public C99 parameter-only extension interface (ABI 2).
It complements the ABI 1 graph adapter without changing its layout or behavior.

View file

@ -1,6 +1,6 @@
# Performance and realtime qualification
The original Phase 9 `test-performance` ran a hardware-independent 48 kHz, 128-frame stereo
The original `test-performance` ran a hardware-independent 48 kHz, 128-frame stereo
workload: 64 graph nodes, 4096 MIDI notes (32 simultaneous), 16 tracks and gain
automation. Preparation and block timing use CLOCK_MONOTONIC outside the engine;
callback code itself does not clock or log. The test checks finite output and
@ -11,7 +11,7 @@ measurement, not a universal realtime threshold. Run more blocks with:
./build/test_performance 10000
```
Initial Phase 9 measurement on an AMD Ryzen Threadripper 1920X, GCC 16.2.1, -O2,
Initial measurement on an AMD Ryzen Threadripper 1920X, GCC 16.2.1, -O2,
2000 blocks: preparation 3.045 ms, mean 308.301 us, p99 422.153 us, maximum
665.096 us, versus a 2666.667 us block deadline; CPU/audio ratio 0.1156. These are
one host/run's observed values and depend on scheduling/load/compiler. The test
@ -34,7 +34,7 @@ scheduler, disk streaming, latency compensation or callback allocator audit of
arbitrary third-party code. High-density interactive projects, physical devices,
long-duration stereo/recording and live server termination remain unqualified.
## Phase 19 matrix, capacity and contention checks
## Matrix, capacity and contention checks
`make benchmark` records 24 warmed graph cases: 2/16/64/256 nodes, mono/stereo,
44.1k/31, 48k/128 and 96k/1024. Each reports control-thread compile time separately
@ -90,12 +90,12 @@ the gain-chain baseline. Large WAV memory limits remain those in AUDIO_FILES.md.
Physical-device endurance, CPU-overload sound quality and a full GUI latency
benchmark remain unqualified.
## Phase 29 qualification workloads
## Qualification workloads
The current `test-performance` emits one JSON record (the old prose output is
retired). Default: 2,000 stereo blocks at 48 kHz/128, 64 graph nodes, 16 tracks,
1,024 stored notes and 256 automation points, at most 32 active voices. This
changes the Phase 9 workload; its historical numbers above are not a baseline
changes the original workload; its historical numbers above are not a baseline
for this revision. `benchmark-project` runs nine cases: 1/16/64 tracks,
64/1,024/4,096 stored notes, 16/256/1,024 points and 31/128/1,024-frame buffers.
Two long notes per first 16 tracks remain audible. Other notes are scheduled
@ -129,7 +129,7 @@ or a leak test. Graph buffer bytes remain a separate exact buffer-size estimate.
Timing probes, memory queries, sorting and output occur outside engine calls.
Checked-in `project-performance-baseline.json` provides initial project cases;
the original graph baseline is retained. `graph-performance-phase29.json` adds
the original graph baseline is retained. `graph-performance-baseline.json` adds
a current graph report with CPU/RSS/deadline fields. Gates use the existing
1.5x mean-time budget and 1 us noise allowance, with p99/max/misses and memory
reported for investigation. There is no universal hardware-independent deadline
@ -180,8 +180,8 @@ Sanitized/contended/profiled runs must not become timing baselines.
## Profiling evidence and remaining costs
Before considering DSP changes, Phase 29 sampled a 10,000-block, 64-track/128-frame
project with GCC `-O2 -g -pg` and GNU gprof on the documented baseline host.
Before considering DSP changes, a 10,000-block, 64-track/128-frame project was
sampled with GCC `-O2 -g -pg` and GNU gprof on the documented baseline host.
Flat samples attributed about 30% to mixer automation `value`, 29% to MIDI
`segment`, and 11% to finite-value handling. Instrumentation and inlining affect
attribution; this identifies investigation candidates, not exact production
@ -198,12 +198,12 @@ gprof build/profile/test_performance build/profile/gmon.* > build/profile/profil
```
Remaining limits include per-sample LADSPA automation run(1), stored-note/clip
scans, preloaded WAV memory and immutable-plan/history overlap. This phase does
scans, preloaded WAV memory and immutable-plan/history overlap. This work does
not qualify physical-device changes, arbitrary plugin hangs/crashes, multi-hour
wall-clock sessions or GUI redraw latency. Virtual endurance and deterministic
faults provide repeatable software evidence, not a hard realtime guarantee.
Phase 29 observed results (same Threadripper/GCC host, 300 blocks per case):
Observed results (same Threadripper/GCC host, 300 blocks per case):
64-track/128-frame project mean 380.417 us, p99 720.271 us, prepare 11.841 ms,
CPU/audio .142 and peak process RSS 19,296 KiB. The 256-node stereo/128 graph
mean was 286.398 us, p99 484.712 us, compile .300 ms. These case runs observed
@ -211,7 +211,7 @@ zero deadline exceedances. See JSON for all cases and host metadata.
The project comparison passed. Repeated graph comparisons flagged variable
small cases despite unchanged graph processing code; a 3,000-block run against
the retained Phase 19 baseline still flagged 16-node mono/31-frame mean 5.089 us
the retained baseline still flagged 16-node mono/31-frame mean 5.089 us
above its 1.5x budget. The new graph report is evidence, not a replacement chosen
to make that comparison pass. This shared-host timing alert remains an
investigation item; no CPU/latency guarantee is inferred from the correctness

View file

@ -1,6 +1,6 @@
# External plugin hosting evaluation
Historical Phase 9 decision: defer external hosting. The native source API is useful
The original decision deferred external hosting. The native source API is useful
for proving processor contracts without adding an SDK or scanning/loading code.
| Candidate | Benefits | Work required before adoption |
@ -9,7 +9,7 @@ for proving processor contracts without adding an SDK or scanning/loading code.
| CLAP | C ABI, explicit lifecycle and event model | Extension negotiation, parameter/state persistence, host callbacks, main/audio-thread scheduling and UI integration |
| VST3 | Broad plugin availability | SDK/license review for the selected SDK release, C++ adapter outside the C core, component/controller and editor lifecycle, state and event translation |
No candidate was linked, scanned or loaded in this phase. API/SDK and plugin
No candidate was linked, scanned or loaded. API/SDK and plugin
licenses must be checked at the revision actually adopted; they are separate
from xtc's MIT license. Supporting a format does not grant redistribution rights
to individual plugins. Do not search user plugin directories from the callback.
@ -19,11 +19,11 @@ plugin recovery policy, preparation failure/partial cleanup tests, bounded event
and parameter publication, latency/tail handling, callback-safe unload after
retirement, a GUI/main-thread boundary and an explicit crash-containment decision.
Native ABI tests cover some ownership mechanics but do not prove third-party
code safe. Event graph ports remain a gap; Phase 32 adds track instrument selection.
code safe. Event graph ports remain a gap; track instrument selection is described below.
Choose one format with concrete user needs after those contracts are specified;
do not introduce a general multi-format framework now. See decision 0008.
## Phase 15 implementation (supersedes the Phase 9 deferral)
## LADSPA implementation (supersedes the earlier deferral)
Decision [0009](decisions/0009-parameter-processors-and-ladspa.md) selects a bounded
LADSPA 1.1 host. `xtc_plugin.h` is the C API; no C++ engine or FLTK type is needed.
@ -108,12 +108,12 @@ Tested packages: ladspa 1.17-7 and swh-plugins 0.4.17-7. These zero-latency
processors define the initial compatible set; other plugins remain unqualified.
Physical listening and plugin CPU/endurance qualification remain pending.
## Phase 25: discovery, editing and graph lifecycle
## Discovery, editing and graph lifecycle
Discovery remains explicit-file only, bounded to 1024 descriptor indices; no
recursive scan, plugin database or new dependency is introduced. Unsupported
layouts are skipped with counts; source/effect roles describe audio ports, not
MIDI instrument capabilities. Phase 32 adds modern track instruments (see below). LADSPA sources can be identified, edited, replaced and removed in
MIDI instrument capabilities. Modern track instruments are described below. LADSPA sources can be identified, edited, replaced and removed in
the graph but cannot receive MIDI events.
**Edit → Insert LADSPA on selected wire** replaces one existing connection with
@ -164,7 +164,7 @@ No embedded third-party editor UI is supported.
LADSPA 1.1 descriptor identity is module path + index + label + unique ID, with
exact supported port/control layout verified on restore. A unique ID is not a
binary version/hash guarantee. Parameter values and bounded automation persist
in existing project v9 records; this phase adds no file format change. Transient
in existing project v9 records; this work adds no file format change. Transient
history/tails and opaque state remain unsupported. Native processor ABI 2 and
its exact `struct_size` contract are unchanged; it remains parameter-only state.
Consumers rebuild against public headers; the new copied details API adds no
@ -179,7 +179,7 @@ A LADSPA `run` callback has no error return; finite-sample sanitation does not
contain crashes, hangs, memory corruption or prohibited work inside a plugin.
Only trusted in-process plugins are supported. See RECOVERY.md.
### Phase 25 verification
### Verification
Fixture tests cover copied identity/hints, integer and toggle defaults and range
rejection, logarithmic/sample-rate hints, scaled-range overflow rejection, reset
@ -193,7 +193,7 @@ cover process-error silence/reset. The separately installed amp/inverter/sine
modules remain the qualified LADSPA set. Human listening, arbitrary third-party
editors/plugins and extended realtime endurance remain unverified.
## Phase 26 parameter targets
## Parameter targets
`xtc_control.h` supplies common stable owner/parameter IDs and control-thread
metadata/edit APIs for track/bus gain/pan and LADSPA input ports. The GUI's plugin
@ -204,7 +204,7 @@ not override existing lanes. Live CCs do not map to plugins; missing targets or
modules fail without installing partial state. See CONTROL.md for timing,
precedence, reset and backward-jump behavior.
## Phase 31: CLAP, VST2 and VST3 effect loaders
## CLAP, VST2 and VST3 effect loaders
**File → Load plugin** now detects LADSPA, CLAP, VST2 and VST3 entry points in an
explicit trusted Linux module. **Insert plugin on selected wire** and **Replace
@ -223,7 +223,7 @@ prefers CLAP, then VST2, then VST3, otherwise LADSPA; the C API also provides
The modern subset is **one mono audio input and one mono output, float32, default
configuration, zero reported latency**. Stereo graph playback uses independent
instances. For the Phase 31 effect subset, true stereo/multichannel/sidechain buses, instruments, MIDI/events,
instances. For the modern effect subset, true stereo/multichannel/sidechain buses, instruments, MIDI/events,
custom editors, parameter changes/automation, programs/presets, opaque state,
transport/time information, workers and latency compensation are not implemented
for these three formats. Modern metadata with controls/automation is rejected,
@ -257,7 +257,7 @@ format, missing modules, v11 save/reopen and GUI add/browser/undo/reopen. Host
allocation/loading/unloading guards remain active while rendering. This evidence
qualifies the subset above, not arbitrary external plugins or physical audio.
## Phase 32 instrument support
## Instrument support
MIDI tracks can bind CLAP, VST2 and VST3 instruments. In the Track menu, select
**Load instrument plugin** for the selected sequencer track; **Use built-in

View file

@ -69,23 +69,23 @@ private permissions, save failure, GUI Apply/Close/reload and plugin listing,
plus JACK callback wrap positions and existing GUI/core regressions. Tests use
temporary configuration paths and do not write the user's configuration.
Phase 44 adds `[transport] tail_ms=3000` (0..60000) and
`stop_after_tail=0` (0/1). Export always includes the configured tail; optional
`[transport] tail_ms=3000` (0..60000) and `stop_after_tail=0` (0/1) are
supported. Export always includes the configured tail; optional
playback stopping uses the GUI timer and is disabled during looping/recording.
See BUILTIN_DEVICES.md for endpoint, cancellation and reset semantics.
Phase 45 adds `[interface] transport_detached`, `mixer_detached`, and each
panel's `_x`, `_y`, `_width`, `_height` rectangle. Use Preferences / Apply or close the application cleanly after
`[interface]` provides `transport_detached`, `mixer_detached`, and each panel's
`_x`, `_y`, `_width`, `_height` rectangle. Use Preferences / Apply or close the application cleanly after
moving panels to save the captured layout. Restoration clamps rectangles to the
current display; the floating transport wraps at narrow widths.
Phase 46 extends `[interface]` with `sequencer_detached`, `graph_detached`,
`[interface]` also includes `sequencer_detached`, `graph_detached`,
`piano_detached`, editor window geometry and `track_header_width` (180..360).
Piano retains `piano_width`/`piano_height` and adds `piano_x`/`piano_y`.
Reset workspace layout changes the session; Preferences / Apply or clean exit persists it.
Only original-tab docking and floating windows are supported.
Phases 100–105 extend configuration with complete workspace collection and MIDI
Configuration also includes complete workspace collection and MIDI
ports/channels/thru. Invalid startup files are preserved on exit; explicit Apply
can replace them after validation. If saving fails, the window stays open for
retry. See [MIDI_WORKFLOWS.md](MIDI_WORKFLOWS.md) for device setup and notes-only

View file

@ -1,6 +1,6 @@
# Project format v17 (reads v1–v17)
Phases 5–31 use a bounded text format implemented in C99 without a parser library.
The project uses a bounded text format implemented in C99 without a parser library.
The extension is `.xtc`. File operations run exclusively on the control thread.
The project owns its graph, tracks and silent/audio arrangement regions. Audio samples remain in external WAV
files; MIDI notes are stored inline.
@ -67,7 +67,7 @@ END
by `MIX gain_bits pan_bits mute solo`: finite binary32 gain 0..4, pan -1..1
encoded as eight hex digits, mute and solo unsigned 0/1.
- `ROUTE`: since v9, required after MIX: bus flag and destination bus ID;
UINT64_MAX denotes master. See Phase 24 constraints below.
UINT64_MAX denotes master. See the mix routing constraints below.
- `CLIP`: ID, track ID, start tick, length tick, source offset tick, source
length tick, hex-encoded name bytes. Trimming
preserves source bounds, so a region can re-extend only within its original
@ -130,18 +130,18 @@ missing references; audio-plan preparation reports unreadable/invalid assets
and renders them silently. Relinking replaces a selected clip's path without
changing its IDs or arrangement. See AUDIO_FILES.md for recovery and limitations.
## Phase 9 extension and recovery policy
## Extension and recovery policy
Phase 9 kept format v4. Native processor descriptors are process-local and have no
Format v4 was retained. Native processor descriptors are process-local and have no
serialized representation; saving a native graph returns UNSUPPORTED and retains
the existing destination. Unknown file versions/types remain rejected. See
NATIVE_API.md for the extension boundary and RECOVERY.md for write-failure, killed
writer and unfinished-recording behavior. Metadata validation is available via
`xtc-check --validate PROJECT` without a GUI or server; it does not load assets.
## Phase 15: version 5 plugin metadata
## Version 5: plugin metadata
Phase 15 introduced `XTC_PROJECT 5`; its reader also supported versions 1–4. All v4 records and
`XTC_PROJECT 5` was introduced; its reader also supported versions 1–4. All v4 records and
order remain the same. Node type 8 is a LADSPA plugin; native pointer-bearing type
7 is still unsupported in files. Immediately after each type-8 `NODE id 8
00000000` record come:
@ -163,9 +163,9 @@ Missing modules remain preserved by metadata load/save; GUI installation rejects
them with a repair message. No transient DSP state, pointer or plugin binary is
stored. See PLUGIN_HOSTING.md and decision 0009 for supported processors/limits.
## Phase 16: version 6
## Version 6
Phase 16 introduced v6 and its reader accepted v1–v6. After each plugin's CONTROL records,
Version 6 was introduced and its reader accepted v1–v6. After each plugin's CONTROL records,
`PLUGIN_AUTOMATION count` is followed by exactly count (<=32) records:
`PARAM tick port mode float32_hex_bits`. Mode is 0 linear or 1 step. Duplicate
port/tick pairs, nonfinite values, unknown control ports and ticks beyond the
@ -173,9 +173,9 @@ project limit are rejected. Loaded plugin tempo comes from TEMPO. Range and
discrete-mode compatibility are checked on control-thread compilation. Versions
1–5 migrate with empty plugin lanes. See CONTROL.md for timing/ordering.
## Phase 18: version 7 and project folders
## Version 7 and project folders
Phase 18 introduced v7; its readers migrated v1–v6. Record ordering and field bounds
Version 7 was introduced; its readers migrated v1–v6. Record ordering and field bounds
are otherwise unchanged from v6. v7 ASSET may contain a relative path, interpreted
against the actual containing directory of the named project file (resolved on
the control thread), never the launch working directory. Opening a symlink to a project uses the
@ -214,10 +214,10 @@ writers and write-limit failures. ASan/UBSan/static analysis additionally audit
bounded parser. This is regression/fault-injection coverage, not exhaustive fuzzing
or a claim of power-cut qualification.
## Phase 22: version 8 audio clip settings
## Version 8: audio clip settings
Phase 22 introduced v8 and reads v1–v7 with unity clip gain and no explicit
clip fades. After **every** clip's `MIDI` record (including silent and MIDI
Version 8 adds audio clip gain/fade settings and reads v1–v7 with unity clip
gain and no explicit clip fades. After **every** clip's `MIDI` record (including silent and MIDI
clips), v8 requires:
```text
@ -240,10 +240,9 @@ No waveform cache or source audio is serialized. Checked-in v1–v7 migrations,
v8 exact roundtrips, malformed new metadata and byte-mutation tests cover the
format change (`make test test-portability test-audio-editing`).
## Phase 24: version 9 mix routing
## Version 9: mix routing
Phase 24 introduced v9. Immediately after each TRACK's MIX record it writes
`ROUTE is_bus bus_id`. `is_bus` is 0 or 1; `bus_id` is an existing bus track ID,
Version 9 adds `ROUTE is_bus bus_id` immediately after each TRACK's MIX record. `is_bus` is 0 or 1; `bus_id` is an existing bus track ID,
or decimal UINT64_MAX (18446744073709551615) for master. Buses must route to
master and cannot contain clips. Invalid destinations, flags and nested routing
are rejected. v1–v8 migrate all tracks to ordinary direct-to-master tracks.
@ -252,9 +251,9 @@ reject v9 rather than discard routing. The public `xtc_track_info` grew fields;
API consumers must rebuild. Fixtures cover v1–v8 migration and tests exercise
v9 exact roundtrips and malformed routing.
## Phase 26: version 10 interpolation and controller bindings
## Version 10: interpolation and controller bindings
Phase 26 introduced v10 with migration from v1–v9. Track/bus automation points are
Version 10 adds interpolation modes and migration from v1–v9. Track/bus automation points are
`POINT track_id parameter tick value_bits step`, where step is 0 linear or 1
hold for the segment starting there. v1–v9 points migrate to step=0. LADSPA
`PARAM` encoding remains unchanged (already has interpolation mode).
@ -272,10 +271,10 @@ Fixtures cover v1–v10 loading and migration. Exact roundtrips, malformed metad
renders and remapped live events cover the new writer/reader. Public clients
must rebuild and initialize the appended `xtc_automation_point.step` field.
## Phase 28 compatibility and diagnostic contract
## Compatibility and diagnostic contract
The current reader accepts versions 1–15 and the writer always emits version 15.
Phase 28 made no format change; Phase 31 adds plugin format identity in v11. Saving an older document upgrades it;
Compatibility diagnostics made no format change; plugin format identity is added in v11. Saving an older document upgrades it;
retain an original backup if an older application must still open it. APP is
informational; compatibility depends on the format version, not the producer's
application version. A future incompatible schema requires a new format number.
@ -338,7 +337,7 @@ reports I/O while leaving a complete new document; inspect it before retrying.
Fault wrappers are linked into tests only. These tests complement killed-writer
coverage in `make test-recovery`; they do not qualify power-cut behavior.
## Phase 31: version 11 plugin format identity
## Version 11: plugin format identity
Immediately after every plugin MODULE record, v11 requires:
@ -368,7 +367,7 @@ the existing document on failure. No automatic path search or plugin substitutio
occurs. Current and historical migration fixtures, malformed fields, identity
mismatch, missing-module and exact-render roundtrips cover this extension.
## Phase 32: version 12 track instruments
## Version 12: track instruments
After CONTROL_MAPS/MAP records and before END:

View file

@ -51,7 +51,7 @@ draining but before finalization. Complete old/new destinations and explicit
orphan temporaries are verified. It does not cut power, terminate the shared
audio server, simulate a failing filesystem, or qualify disk/device endurance.
## Phase 13 retained recording prefixes
## Retained recording prefixes
Recording now defaults to no-clobber publication; the GUI requires an unused
path. Failed nonempty temporary recordings survive destruction. Query the
@ -62,7 +62,7 @@ It never changes the source or overwrites an existing destination. This
supersedes the earlier lack of a WAV recovery tool described above. See
AUDIO_FILES.md for format/ownership/size limits and `make test-recording`.
## Plugin load and replacement failures (Phase 25)
## Plugin load and replacement failures
GUI Open reports an unavailable/incompatible plugin's label and absolute module
path and retains the current document. Preserve the saved file; restore a
@ -80,7 +80,7 @@ parameter editor discards its temporary values. Reset defaults clears automation
only when applied. No host recovery can contain a crash or hang in trusted native
plugin code; LADSPA has no runtime error-return channel.
## Save diagnostics (Phase 28)
## Save diagnostics
`make test-project-diagnostics` deterministically injects flush, file-sync, close,
rename and directory-sync errors. Pre-rename failures retain the previous bytes
@ -97,7 +97,7 @@ and rebuild/reload rather than attempting callback-time reconfiguration. Modern
instances restart at default configuration; no edited opaque state is exposed
or saved by the initial adapters. Trusted plugin crashes cannot be contained.
## Phase 32 instrument support
## Instrument support
MIDI tracks can bind CLAP, VST2 and VST3 instruments. In the Track menu, select
**Load instrument plugin** for the selected sequencer track; **Use built-in

View file

@ -1,8 +1,8 @@
# 0.1.0 development release notes
This remains a development prototype, not a production-qualified DAW. Phase 30
completes the local release workflow without bumping the application version,
creating a tag or publishing artifacts. The exact source archive SHA-256 and
This remains a development prototype, not a production-qualified DAW. The local
release workflow is complete without bumping the application version, creating a
tag or publishing artifacts. The exact source archive SHA-256 and
reviewed Git commit identify a build; version 0.1.0 alone does not identify all
of the development revisions that used that version.
@ -17,9 +17,9 @@ are trusted in-process code. No proprietary energyXT resources are included.
Project format v13 reads versions 1–13 transactionally. Syntax diagnostics identify
records and lines. `xtc-check --inspect` lists dependency paths without executing
plugins. Phase 29 adds timing/CPU/RSS reports, repeatable stress runs and virtual
endurance. Phase 30 adds configurable install directories, shared install/remove
inventory, installed MIDI examples and source archive checksum sidecars.
plugins. Timing/CPU/RSS reports, repeatable stress runs and virtual endurance are
available. Configurable install directories, shared install/remove inventory,
installed MIDI examples and source archive checksum sidecars are also included.
## Upgrading and removal
@ -52,51 +52,52 @@ was not hidden by changing the baseline. See PERFORMANCE.md before using these
measurements as latency expectations. Sanitizers and virtual endurance qualify
software paths, not hardware timing.
Phase 31 adds default-configuration CLAP/VST2/VST3 mono effect loaders, common
GUI discovery/insertion/replacement and v11 format identity. Pinned MIT CLAP and
Default-configuration CLAP/VST2/VST3 mono effect loaders, common GUI
discovery/insertion/replacement and v11 format identity are supported. Pinned MIT CLAP and
BSD-3-Clause VST3 C headers ship with notices; VST2 uses original compatibility
declarations. Modern instruments, parameters/state/editors and multichannel
layouts remain unsupported. No third-party modern plugin has been qualified.
Phase 32 adds CLAP/VST2/VST3 mono instruments bound to MIDI tracks, sample-offset
notes, a saved live target, track mixing, GUI assignment/undo and v12 persistence.
CLAP/VST2/VST3 mono instruments are supported, bound to MIDI tracks, with
sample-offset notes, a saved live target, track mixing, GUI assignment/undo and
v12 persistence.
See PLUGIN_HOSTING.md for compatibility and controller/state limits.
Phase 33 adds a flat DAW workspace, shared dark theme, track-creation sidebar,
read-only musical transport/track inspector, colored track clips and real MIDI
previews. New MIDI/audio track commands are undoable and prepare candidates
A flat DAW workspace, shared dark theme, track-creation sidebar, read-only
musical transport/track inspector, colored track clips and real MIDI previews are
included. New MIDI/audio track commands are undoable and prepare candidates
before adoption. The default window is 1280 × 800, minimum 1220 × 720.
No dependency or project-format change. See WORKSPACE.md and the new
`modern-session.xtc` example; existing engine/plugin limitations still apply.
Phase 34 adds a sequencer grid/Snap dropdown, absolute grid snapping for moves
and trims, MIDI double-click editing, a piano velocity lane/slider and per-track
instrument dropdowns. Snap preferences are UI state; velocity and instrument
A sequencer grid/Snap dropdown, absolute grid snapping for moves and trims,
MIDI double-click editing, a piano velocity lane/slider and per-track instrument
dropdowns are included. Snap preferences are UI state; velocity and instrument
bindings use the existing v12 format. No new dependency or engine feature is
required. See WORKSPACE.md for supported divisions, controller semantics and limits.
Phase 35 adds Edit / Preferences with an Apply button and `~/.xtc.conf` INI
persistence, configurable plugin search paths and a file library, plus sequencer
ruler loop selection and sample-boundary playback wrapping. See PREFERENCES.md
Edit / Preferences provides an Apply button and `~/.xtc.conf` INI persistence,
configurable plugin search paths and a file library, plus sequencer ruler loop
selection and sample-boundary playback wrapping. See PREFERENCES.md
for settings, reconnect behavior and looping limits.
Phase 36 replaces the single-track mixer panel with a scrolling studio mixer:
vertical dB faders, flat pan knobs, mute/solo, routing and stereo meters on every
track and bus, plus a pinned master monitor. Selected-track automation remains
The single-track mixer panel is replaced by a scrolling studio mixer: vertical
dB faders, flat pan knobs, mute/solo, routing and stereo meters on every track and
bus, plus a pinned master monitor. Selected-track automation remains
below the strips. No project format or engine changes. Screenshots are refreshed;
see MIXER.md and screenshots/README.md.
Phase 37 adds searchable Commands (Ctrl+P), editable project BPM, a live track
inspector, session statistics, Fit song and an optional persistent Follow
playhead control. Numeric input remains intact during display refreshes.
Searchable Commands (Ctrl+P), editable project BPM, a live track inspector,
session statistics, Fit song and an optional persistent Follow playhead control
are included. Numeric input remains intact during display refreshes.
Screenshots are refreshed, including the command palette. See WORKSPACE.md.
Phase 38 adds dependency-free Soft Keys/Sub Bass instruments and Delay/Reverb
effects with saved controls and automation. Choose instruments in track headers;
Dependency-free Soft Keys/Sub Bass instruments and Delay/Reverb effects are
included, with saved controls and automation. Choose instruments in track headers;
insert effects on selected graph wires from Edit. See [BUILTIN_DEVICES.md](BUILTIN_DEVICES.md).
## Phases 69–79: audio source editing
## Audio source editing
Audio clips now open a modal waveform editor with native frame selection,
zoom, source statistics, nondestructive timeline trims, selection export and

View file

@ -1,7 +1,6 @@
# Release preparation (0.1.0 development prototype)
Phase 9 makes source packaging, staged install/uninstall and repeatable builds
testable. It does not turn the prototype into a production-qualified DAW. The
Source packaging, staged install/uninstall and repeatable builds are testable. It does not turn the prototype into a production-qualified DAW. The
version remains 0.1.0; no tag, external release or binary publication is created
by `make dist` or `make release`.
@ -55,7 +54,7 @@ acceptance on other distributions and binary redistribution are still separate
qualification work. There is no DEB/RPM/AppImage, bundled runtime, autosave,
external plugin host or stable shared-library extension ABI in this release.
## Phase 20 local binary packaging and installed workflow
## Local binary packaging and installed workflow
`make test-package` builds the release, stages installation only in a temporary
DESTDIR, writes a normalized Linux binary/development archive, checks its SHA-256
@ -73,7 +72,7 @@ crash uploader or signal-handler cleanup: inspect OS core/debugger evidence on
the control side, preserving project/media recovery paths. No release is publicly
published by these commands, and human/device/listening checks remain pending.
## Phase 30 release workflow
## Release workflow
Installation now shares one explicit file inventory with uninstallation. GNU-style
`exec_prefix`, `bindir`, `libdir`, `includedir`, `datarootdir`, `datadir`, `docdir`,

View file

@ -1,6 +1,6 @@
# Engine correctness and reliability
Phase 10 audits the existing engine rather than adding musical features. The
The existing engine was audited rather than extended with musical features. The
review covers graph edits/compilation, offline DSP, plan publication, JACK
callbacks/lifecycle, audio/MIDI source plans and the recorder handoff.
@ -101,7 +101,7 @@ requires a GNU-compatible linker. Live tests require an existing JACK-compatible
server; GUI tests use installed FLTK and Xvfb. No target installs dependencies or
changes server/system configuration.
Phase 10 verification on GCC 16.2.1 / Clang 23.1.3 passed normal and no-JACK builds,
Verification on GCC 16.2.1 / Clang 23.1.3 passed normal and no-JACK builds,
all core tests, ASan/UBSan/leak checks, Clang static analysis, GUI/mock and live
JACK integrations, plus GCC TSan on the pthread native-publication and recorder
concurrency tests. The GUI also passed ASan/UBSan with the existing
@ -115,7 +115,7 @@ timing and should not be used to measure production realtime performance. See
PERFORMANCE.md for workload measurements, RECOVERY.md for process-crash limits,
and NATIVE_API.md for the trusted extension boundary.
## Phase 12 transition ownership
## Transition ownership
Source fade configuration is written before publication and immutable during
rendering. The master ramp and stop-observed flag belong to the audio consumer
@ -126,7 +126,7 @@ voices/flags. A completed callback continues silence/holds position until that
deactivation. No callback waits or calls JACK control functions. Immediate
stop/close handles faults or missing callbacks. See AUDIO_QUALITY.md.
## Phase 29 repeatable development checks
## Repeatable development checks
`make check-development` combines normal tests, capacity/endurance, deterministic
benchmark-gate tests, static analysis and ASan/UBSan (including scale and soak).

View file

@ -1,4 +1,4 @@
# Modular routing workflow (Phase 23)
# Modular routing workflow
Open Modular Graph (Ctrl+3). Select a node or wire to inspect it in the feedback
line. Nodes have stable IDs, role labels and distinct colors: teal sources,
@ -58,7 +58,7 @@ allocates a fresh stable node ID and is **one** semantic edit/undo step. It
preserves all other edges. Failure (including capacity, a missing/stale wire or
backend refusal) keeps the previous graph and plan. It introduces no new node
type or project record: v8 persistence already represents the resulting graph.
Phase 24 adds one-level stereo mix buses before shared graph sources (see
One-level stereo mix buses are added before shared graph sources (see
MIXER.md). Track templates, folders and independent per-track/bus graph inserts
remain deferred because graph sources still expose shared mixes.

View file

@ -104,7 +104,7 @@ filters, velocity/channel, quantization, transposition and pattern repetition.
Click selects a single note; Ctrl+A selects all filtered notes. Ctrl+D repeats
that selection at a chosen spacing within the existing clip source. Up/Down
transposes by a semitone. Commands are undoable through the main Edit menu.
See [MIDI.md](MIDI.md#phase-21-composition-commands) for shortcuts, timing and limits.
See [MIDI.md](MIDI.md#composition-commands) for shortcuts, timing and limits.
## Audio clip tools
@ -114,7 +114,7 @@ Delete removes the clip reference. Drag the body to move and edges to trim.
Edit / Audio clip gain and fades (A) sets linear gain and fade durations in ticks.
All are undoable and preserve the WAV file. Waveforms show cached raw source
peaks, before gain/fades; large media can take time to load on Open/import.
See [AUDIO_FILES.md](AUDIO_FILES.md#phase-22-non-destructive-clip-editing) for
See [AUDIO_FILES.md](AUDIO_FILES.md#non-destructive-clip-editing) for
boundary behavior, preview limits and the deferred stretch/pitch tools.
## Inspecting and organizing routing
@ -126,12 +126,12 @@ unity gain/bus node as one undoable edit. These commands are also in View/Edit
and the graph context menu. Unwired effect inputs use external audio, as shown
by “ext in”; they do not imply silence. See [ROUTING.md](ROUTING.md).
Phase 24: Mixer also offers Add bus and a Route choice for ordinary tracks.
The Mixer also offers Add bus and a Route choice for ordinary tracks.
Select Track/Bus strips to edit their controls and automation. Master and selected
strip meters show dBFS with 20 dB/s release; Reset peaks clears latched clipping.
See MIXER.md for solo rules, gain staging and meter taps.
Phase 25: File → Load LADSPA plugin offers a descriptor browser. Select a graph
File → Load LADSPA plugin offers a descriptor browser. Select a graph
plugin and Edit → Selected plugin control for identity, values, ranges and
Reset defaults; Apply commits, Cancel discards. Edit also offers replacement,
reset and insertion of an effect on a selected wire. Graph wires determine
@ -139,15 +139,13 @@ processing order; Delete removes a selected plugin and its wires. Changes are
undoable. Replacement keeps compatible audio wiring but resets plugin controls
and automation. See PLUGIN_HOSTING.md for supported formats and failure behavior.
Phase 26: Mixer Interpolation selects Linear or Hold for each point added or
replaced. Audio → MIDI controller mapping lists all channel bindings; enter
Mixer Interpolation selects Linear or Hold for each point added or replaced. Audio → MIDI controller mapping lists all channel bindings; enter
`channel volume_CC pan_CC sustain_CC` (channels 0..15, 128 disables, enabled CCs
must be distinct, 120/123 reserved). Maps are undoable and saved. Controllers
modify live sine voices; arranged track/bus/plugin automation takes precedence
over its static controls and is unaffected by those MIDI bindings. See CONTROL.md.
Phase 27: unavailable main-menu undo/redo actions are disabled, including while
recording. Piano roll has Edit/Undo/Redo shortcuts and a right-click note menu;
Unavailable main-menu undo/redo actions are disabled, including while recording. Piano roll has Edit/Undo/Redo shortcuts and a right-click note menu;
right-click no longer immediately deletes notes. Graph right-click targets the
node/wire under the pointer. Undo preserves surviving selections. Completed
takes add one undo step; undo removes references and keeps WAV files. See
@ -161,7 +159,7 @@ or unreadable references, 1 = metadata/I/O error. File availability does not
certify WAV contents or plugin compatibility. See [PROJECT_FORMAT.md](PROJECT_FORMAT.md)
for the compatibility and relocation policy.
Phase 31: **File → Load plugin** supports LADSPA plus an initial Linux
**File → Load plugin** supports LADSPA plus an initial Linux
CLAP/VST2/VST3 effect subset. Select the actual module binary (`.clap` or `.so`,
including a VST3 bundle's inner binary). Modern effects require one mono input
and output, float32 and zero latency; they use default configuration. Instruments,
@ -169,7 +167,7 @@ modern parameter editing/automation, opaque state and custom editors are not
implemented. Projects now save v12 and read v1–v12. See PLUGIN_HOSTING.md for the
full contract and test/qualification limits.
## Phase 32 instrument support
## Instrument support
MIDI tracks can bind CLAP, VST2 and VST3 instruments. In the Track menu, select
**Load instrument plugin** for the selected sequencer track; **Use built-in
@ -200,21 +198,21 @@ the callback and old instances are reclaimed on the control thread. Missing
references remain inspectable without loading; failed GUI preparation retains
the current project. Save a backup for applications limited to v11 or earlier.
## Phase 33 workspace
## Workspace
The flat workspace puts New MIDI/audio track, WAV import and instrument loading
in a persistent sidebar, with a musical transport display and selected-track
overview. See [WORKSPACE.md](WORKSPACE.md) for shortcuts and workflow. Open
`modern-session.xtc` in the installed examples for an original four-track arrangement.
Phase 34: use the sequencer Snap dropdown for straight/triplet/bar grids or Off.
Use the sequencer Snap dropdown for straight/triplet/bar grids or Off.
Double-click MIDI clips to edit notes, then use the Velocity lane or selected-note
slider for dynamics. Each non-bus track header has an instrument dropdown offering
built-in sine, project instruments and explicit plugin loading. See WORKSPACE.md.
Phases 47–57 add additive clip selection, atomic group commands, phrase clipboard
and repeat, alignment/slip tools, MIDI swing/gate/legato/scale/velocity transforms,
batch audio fades and static mixer A/B recall. See
Additive clip selection, atomic group commands, phrase clipboard and repeat,
alignment/slip tools, MIDI swing/gate/legato/scale/velocity transforms, batch
audio fades and static mixer A/B recall are also available. See
[MODERN_EDITING.md](MODERN_EDITING.md) for commands, scope and limitations.
See [arrangement and composition workflows](COMPOSITION_WORKFLOWS.md) for markers, MIDI composition, normalization and portable media collection.

View file

@ -92,7 +92,7 @@ reopens again. It uses temporary files only and cleans them on success.
`test-gui` injects stop/seek/prepare failures to verify controls, position and
retained document state, plus recording guards. `test-gui-jack` exercises live
graph changes, recording and restart/close; `test-jack-midi` checks software
loopback output. The Phase 11 tests also pass ASan/UBSan with the existing
loopback output. The tests also pass ASan/UBSan with the existing
fontconfig-only GUI leak suppression, and the GUI/mock suite builds/runs without
JACK support. Core tests use no GUI leak suppression.
@ -101,7 +101,7 @@ endurance qualification. No new dependency, project-format change, plugin host,
MIDI capture, tempo editor, loop playback, device-routing GUI, or persisted editor
layout was introduced. See GUI.md, MIDI.md, MIXER.md and LINUX.md for details.
## Phase 17 editing workflow
## Editing workflow
Select a clip and press Ctrl+D (or Edit/Duplicate clip) to duplicate it immediately
after its end. Complete source notes, trim offsets and media references are
@ -133,7 +133,7 @@ There is no destructive media-delete operation. New/Open reset history after
unsaved-change handling. The capacity limit and allocation-error reporting in
MIXER.md still apply. Tests: `make test-editing test-gui-plugins test-workflow`.
## Phase 27 editing audit
## Editing audit
See [EDITING.md](EDITING.md) for the operation-by-operation undo matrix, command
ownership, allocation-failure boundary, external-media behavior and manual

View file

@ -1,6 +1,6 @@
# Flat DAW workspace
Phase 33 presents the existing xtc editors in a consistent flat workspace. It uses
The workspace presents the existing xtc editors in a consistent flat layout. It uses
FLTK vector drawing and system fonts: no images, shadows, bevels, 3D rendering,
external theme packages or new runtime dependencies.
@ -54,9 +54,9 @@ running example was also inspected at 1280 × 800. Existing GUI plugin, live JAC
and workflow tests cover the retained commands. A modern presentation does not
add commercial-DAW features: detachable/resizable docks, mixer channel strips,
automatic plugin scanning, custom plugin editors and new audio/MIDI features
remain outside this phase. Existing plugin and engine limits still apply.
remain outside this workspace. Existing plugin and engine limits still apply.
## Phase 34 editing controls
## Editing controls
The **Snap** dropdown above the sequencer selects Off, 1/32, 1/16 triplet,
1/16, 1/8 triplet, 1/8, 1/4, 1/2 or one bar. Existing View/Snap commands update
@ -100,7 +100,7 @@ coincident notes, per-note slider/lane edits, invalid velocities, undo/reload an
instrument reuse/clear/reorder for all three fixture formats. Manual checks use
the original modern-session example and the flat sequencer/piano windows.
## Phase 36 studio mixer
## Studio mixer
The Mixer tab now presents all tracks and buses as channel strips with vertical
dB faders, flat pan knobs, mute/solo, output routing and stereo meters. Scroll
@ -110,7 +110,7 @@ undo, keyboard controls and project persistence remain available. See
[MIXER.md](MIXER.md) for fader units, metering, automation and limits.
## Phase 37 direct editing and navigation
## Direct editing and navigation
**Commands** (Ctrl+P) searches active menu actions by case-insensitive substring.
Type part of an action path such as `mixer`, `import` or `preferences`, use
@ -151,7 +151,7 @@ tempo callbacks/undo/failed adoption, inspector edits and in-progress numeric
input, fit and follow navigation, and existing core/GUI/live JACK workflows.
## Detachable transport and mixer (Phase 39)
## Detachable transport and mixer
Use **View → Detach transport** or **View → Detach mixer** to move either panel
into a separate window. Toggle the same menu action, use the floating panel's
@ -169,21 +169,20 @@ Space and menu playback shortcuts work from either floating panel, with normal
numeric/text editing protection. Closing the main window closes all panels only
after the existing unsaved/recording/backend shutdown checks succeed.
The initial Phase 39 layout used session-only positions and a transport minimum
width of 1220 pixels. Phase 45 below adds saved layouts and transport wrapping
down to 400 pixels. The floating mixer resizes down to 600 × 420 and retains
The initial layout used session-only positions and a transport minimum width of
1220 pixels. Saved layouts and transport wrapping down to 400 pixels are
described below. The floating mixer resizes down to 600 × 420 and retains
horizontal track scrolling.
Verified with `make BUILD_DIR=build/phase39 gui test-gui test-gui-instruments
Verified with `make BUILD_DIR=build/workspace-detach gui test-gui test-gui-instruments
test-gui-jack` (one line), plus the GUI suite under AddressSanitizer/UBSan.
Tests cover repeated reparenting, close-to-dock, resize, shared BPM/loop state,
playback shortcuts, failed shutdown and cleanup.
## Phase 45 saved panel layouts
## Saved panel layouts
Preferences / Apply now saves transport/mixer dock state and window rectangles.
Preferences / Apply captures their current positions; Phase 100 also saves on
clean application exit. Startup restores the
Clean application exit also saves their current positions. Startup restores the
saved layout; off-screen rectangles are clamped to an available display's work
area. Invalid dimensions are rejected transactionally by the settings reader.
@ -195,7 +194,7 @@ Existing close-to-dock, Dock all and shortcuts retain their shared widget state.
Tests cover narrow control bounds, save/restart, off-screen restoration, invalid
geometry, repeated docking/resizing and shared transport state.
## Phase 46 editor panels and pinned track headers
## Editor panels and pinned track headers
**View → Detach sequencer** and **Detach modular graph** float each complete
editor, including its toolbar and scroll area. Its main tab offers Show and Dock
@ -231,15 +230,15 @@ minimum/large resize, shared model/note/clip selection, scrolling, header draggi
short-clip hit tests, Apply/restart, reset layout and failed/successful shutdown.
ASan/UBSan checks retain only the existing system Fontconfig leak suppression.
Phases 47–57 add additive clip selection, atomic group commands, phrase clipboard
and repeat, alignment/slip tools, MIDI swing/gate/legato/scale/velocity transforms,
batch audio fades and static mixer A/B recall. See
Additive clip selection, atomic group commands, phrase clipboard and repeat,
alignment/slip tools, MIDI swing/gate/legato/scale/velocity transforms, batch
audio fades and static mixer A/B recall are also available. See
[MODERN_EDITING.md](MODERN_EDITING.md) for commands, scope and limitations.
Phases 58–68 add arrangement markers and sections, ripple edits, complete track
duplication, MIDI splitting/consolidation and composition tools, peak normalization
and portable media collection. See [COMPOSITION_WORKFLOWS.md](COMPOSITION_WORKFLOWS.md).
Arrangement markers and sections, ripple edits, complete track duplication, MIDI
splitting/consolidation and composition tools, peak normalization and portable
media collection are also available. See [COMPOSITION_WORKFLOWS.md](COMPOSITION_WORKFLOWS.md).
Phases 69–79 add a modal audio source editor with frame selection, reversible
processing, selection export, copy adoption and transient slicing. See
A modal audio source editor provides frame selection, reversible processing,
selection export, copy adoption and transient slicing. See
[AUDIO_EDITOR.md](AUDIO_EDITOR.md) for commands, undo behavior and mono/size limits.

View file

@ -1,6 +1,6 @@
# Decision 0004: JACK backend and bounded plan handoff
**Status:** Accepted for Phase 2
**Status:** Accepted
## Backend
@ -81,9 +81,9 @@ Plan replacement starts the newly compiled oscillator at phase zero, without
crossfade. Smooth parameter ramps and click-free graph transitions are future work.
No stereo, recording, MIDI, native PipeWire API, GUI engine controls or hardware
configuration dialogs are part of this phase.
configuration dialogs are included.
## Phase 4 adoption acknowledgement and stopped editing
## Adoption acknowledgement and stopped editing
The pending pointer has an associated atomic revision. Producer stores the
revision before release-publishing the pointer. Consumer acquire-loads a

View file

@ -1,6 +1,6 @@
# 0005: Preloaded WAV clips and control-thread recording consumer
Status: accepted for Phase 6.
Status: accepted.
Use a small bounded C99 WAV decoder/writer for PCM16/24/32 and IEEE float32,
mono/stereo, instead of adding libsndfile in this milestone. This avoids a new

View file

@ -1,6 +1,6 @@
# 0006 — Bounded MIDI notes and internal instrument
Status: accepted, Phase 7.
Status: accepted.
Use the existing JACK backend for timestamped MIDI input, avoiding another
backend/dependency. Store source-relative notes in the C project and v3 format;

View file

@ -1,6 +1,6 @@
# 0007 — Track mixing, paired stereo buses and snapshot history
Status: accepted, Phase 8.
Status: accepted.
Apply gain/pan/mute/solo and gain/pan automation in prepared track sources, then
run paired stereo buses through the existing modular topology. This preserves

View file

@ -1,6 +1,6 @@
# 0008 — Native processors and source release preparation
Status: accepted, Phase 9.
Status: accepted.
Add a versioned copied C descriptor with control-thread prepare/destroy and
single-owner realtime reset/process. Prove effects/sources in the existing graph,

View file

@ -1,6 +1,6 @@
# 0009 — Parameter processors and bounded LADSPA hosting
Status: accepted, Phases 14–15 (2026-10-27).
Status: accepted (2026-10-27).
Native ABI 1 remains compatible. ABI 2 adds explicitly parameter-only configuration,
metadata, validation and sample-offset parameter/MIDI ordering. It is a public C
@ -8,7 +8,7 @@ facility; opaque state and automatic native descriptor registration in project
files remain unsupported. Native instrument and gain examples exercise the
interface before adding a dynamically loaded module lifetime.
Select LADSPA 1.1 for the first external host. Reconsidering the Phase 9 candidates,
Select LADSPA 1.1 for the first external host. Reconsidering earlier candidates,
LV2 needs RDF/features/URIDs/workers, CLAP needs host scheduling/extension
negotiation, and VST3 needs a separate C++ SDK adapter and release-specific license
review. LADSPA adds a mature Linux C ABI, installed real plugins, straightforward
@ -28,8 +28,8 @@ and 16 input controls. Graph stereo consists of independent instances, not a
stereo LADSPA layout. Reject incompatible layouts and identities explicitly.
Control outputs are connected to private storage, not exposed as graph events.
LADSPA has no MIDI or opaque state API: save control values only. Parameter
changes rebuild plans on the control thread; sample automation is deferred to
Phase 16. Rate-scaled bounds are recalculated at compile. Instance history/tails
changes rebuild plans on the control thread; sample automation is provided through
parameter processors. Rate-scaled bounds are recalculated at compile. Instance history/tails
reset on recompile, not every transport seek (LADSPA has no realtime reset rule).
Latency compensation is unsupported: the supported set is zero-latency amp,
inverter and sine source, not arbitrary lookahead/delay/routing plugins.

View file

@ -1,6 +1,6 @@
# 0010 — Bounded CLAP, VST2 and VST3 effect loading
Accepted for Phase 31. The user's request to support these three formats
Accepted. The user's request to support these three formats
supersedes the earlier recommendation to choose only one external format.
Keep the engine/model/host adapters in C99. CLAP uses pinned MIT headers and VST3

View file

@ -1,6 +1,6 @@
# 0011 — Prepared MIDI track instruments
Accepted for Phase 32. Extend the modern C99 adapters with zero-audio-input,
Accepted. Extend the modern C99 adapters with zero-audio-input,
mono-output instruments and one event input. Keep graph effects separate from
track bindings. Each assigned track owns one prepared instance; the existing
instrument source sums their mixed output and the sine output of unassigned

View file

@ -48,7 +48,7 @@ def main():
assert (resources / 'licenses/xtc/VST3-C-API-LICENSE').is_file()
assert os.access(binaries / 'xtc-check', os.X_OK)
run([str(binaries / 'xtc-check')])
for filename in ('performance-baseline.json', 'project-performance-baseline.json', 'graph-performance-phase29.json'):
for filename in ('performance-baseline.json', 'project-performance-baseline.json', 'graph-performance-baseline.json'):
assert (docs / filename).read_bytes() == (source / 'docs' / filename).read_bytes()
example = resources / 'xtc/examples/midi-demo.xtc'
run([str(binaries / 'xtc-check'), '--inspect', str(example)])

View file

@ -47,7 +47,7 @@ def main():
assert (prefix / 'share/doc/xtc/RELEASE_NOTES.md').exists()
subprocess.run([str(prefix / 'bin/xtc-check'), '--inspect',
str(prefix / 'share/xtc/examples/midi-demo.xtc')], check=True)
for name in ('project-performance-baseline.json', 'graph-performance-phase29.json'):
for name in ('project-performance-baseline.json', 'graph-performance-baseline.json'):
assert (prefix / 'share/doc/xtc' / name).is_file()
if a.build_dir:
again = root / 'repacked.tar.gz'