2026-10-26 23:03:17 +01:00
# xtc — a lightweight, modular DAW
2026-10-26 22:51:25 +01:00
2026-10-26 23:07:03 +01:00
`xtc` is a new, energyXT-inspired digital audio workstation project. It is not a clone and contains no energyXT source code or assets.
2026-10-26 22:51:25 +01:00
## Design decisions
- **Modular engine first:** sequencer, instruments, effects, mixers and I/O are nodes in one processing graph.
- **C core:** project model, graph, DSP and audio engine are implemented in C.
- **FLTK/C++ GUI:** C++ is confined to the graphical interface and calls the core through a C API.
- **Linux first:** keep backend-specific details behind an interface.
- **Small increments:** build and test each milestone before adding features.
## Current status
This repository is a starter scaffold, not a production DAW. It currently provides:
- a small C library/API;
2026-10-26 23:20:00 +01:00
- a mono graph model with port validation, cycle rejection and topological ordering;
2026-10-27 00:31:03 +01:00
- compiled offline plans with preallocated buffers, sine oscillator, audio source, gain, meter and output nodes;
2026-10-26 23:20:00 +01:00
- C tests for deterministic rendering, routing, validation and lifecycle;
2026-10-27 01:06:57 +01:00
- an optional JACK-compatible backend with mono input and mono/stereo output with start/stop, routing and status;
2026-10-26 23:32:04 +01:00
- safe control/audio plan handoff and concurrent replacement tests;
2026-10-26 23:40:28 +01:00
- an optional FLTK shell with engine controls, view switching and backend status;
2026-10-26 23:55:35 +01:00
- a modular graph editor with transactional edits and live plan adoption status;
2026-10-27 00:31:03 +01:00
- versioned project save/load and a timeline for tracks and clips;
2026-10-27 00:10:45 +01:00
- sample-counted transport, selection, move/trim, timeline zoom and scrolling;
2026-10-27 00:31:03 +01:00
- WAV import/graph playback, bounded recording and missing-asset relinking;
2026-10-27 00:53:41 +01:00
- MIDI clips, a sine instrument, JACK MIDI input and a basic piano roll;
2026-10-27 16:15:34 +01:00
- stereo track/bus gain/pan/mute/solo, dBFS peak meters and gain/pan automation lanes;
2026-10-27 01:06:57 +01:00
- bounded undo/redo with keyboard shortcuts;
2026-10-27 03:37:19 +01:00
- configurable boundary fades, gain ramps and graceful GUI playback transitions;
2026-10-27 01:21:04 +01:00
- native C processors, deterministic source packaging and staged install/uninstall;
2026-10-26 22:51:25 +01:00
- architecture, format, GUI, roadmap, and decision documents.
2026-10-26 23:32:04 +01:00
The JACK backend has passed software-loopback testing; physical-device playback
2026-10-27 04:00:27 +01:00
and capture are unverified. MIDI recording remains deferred. Bounded LADSPA
hosting supports the compatible mono processors documented in
[PLUGIN_HOSTING.md ](docs/PLUGIN_HOSTING.md ).
2026-10-26 22:51:25 +01:00
## Build
Requirements: a C compiler, a C++ compiler, GNU Make, and `pkg-config` . FLTK is optional for the core and tests.
```sh
make
make test
```
2026-10-26 23:07:03 +01:00
`make` also builds `build/xtc-check` , a headless core startup/shutdown
2026-10-26 23:03:17 +01:00
check. Use `make debug` for a separate debug build and test run. See
[docs/BUILD.md ](docs/BUILD.md ) for the inspected toolchain and baseline limits.
2026-10-26 22:51:25 +01:00
Build the optional FLTK GUI if FLTK is installed:
```sh
make gui
```
Run the GUI:
```sh
2026-10-26 23:07:03 +01:00
./build/xtc
2026-10-26 22:51:25 +01:00
```
2026-10-27 03:25:04 +01:00
See [the minimal music-making workflow ](docs/WORKFLOW.md ) for creating, saving,
reopening and playing a project.
The GUI opens JACK and offers Play/Pause/Stop/To start/Reconnect, backend status and view
2026-10-26 23:55:35 +01:00
switching. The initial empty graph is silent. Modular Graph supports adding,
2026-10-27 00:53:41 +01:00
moving and deleting oscillator/audio/instrument/gain/meter/output nodes and connecting ports.
2026-10-27 00:31:03 +01:00
Import WAV (Ctrl+I) creates playable clips; Add region creates silent placeholders.
Record captures JACK input to a chosen WAV; Stop finalizes and adds the take.
Save the project after recording. External asset paths must remain available;
select a missing clip and use File/Relink selected audio to repair it.
2026-10-27 00:53:41 +01:00
Add MIDI clip on an existing track, then open Piano roll (Ctrl+4) to draw notes.
Connect a MIDI source to the JACK `midi_in` port for live playing; Panic/F9
silences held notes. See [MIDI workflow and limits ](docs/MIDI.md ).
2026-10-27 01:06:57 +01:00
See [audio workflow and limits ](docs/AUDIO_FILES.md ).
Mixer (Ctrl+2) selects a track for gain/pan/mute/solo and automation editing.
Ctrl+Z undoes; Ctrl+Shift+Z or Ctrl+Y redoes up to 32 edits.
The GUI now exposes left `output` and `output_right` JACK ports; route both
explicitly for stereo. See [mixer workflow and limits ](docs/MIXER.md ).
2026-10-27 00:10:45 +01:00
Use Add track/Add region, drag regions or their edges, and Zoom +/-; scrollbars pan.
Ctrl+N/O/S creates, opens or saves a project; Save As chooses another path.
2026-10-27 00:31:03 +01:00
Arrangement edits stop playback; graph edits remain live.
2026-10-27 00:10:45 +01:00
The ruler seeks while stopped. Stop pauses; Reconnect and project load reset position. F5 starts, F8 stops, Space toggles, F6 reconnects, and Ctrl+1/2/3
2026-10-26 23:40:28 +01:00
switches views. Ctrl+Q closes the client and window. No physical ports are
2026-10-26 23:55:35 +01:00
connected automatically. In Modular Graph, drag output to input to connect;
select a node or wire and press Delete to remove it. Invalid edits leave the
active graph intact; queued changes are labeled until the engine adopts them.
See [GUI documentation ](docs/GUI.md ).
2026-10-27 01:21:04 +01:00
For Linux installation, routing and CLI options see [LINUX.md ](docs/LINUX.md );
for native effects/instruments see [NATIVE_API.md ](docs/NATIVE_API.md ).
`make release` , `make dist` , `make test-install` and `make test-release` provide
release preparation; see [RELEASING.md ](docs/RELEASING.md ) for exact guarantees.
2026-10-26 23:32:04 +01:00
With JACK development files and an existing JACK-compatible server, run the
2026-10-27 00:31:03 +01:00
isolated software-loopback test with `make test-jack` and the record/reopen/play
2026-10-27 00:53:41 +01:00
acceptance test with `make test-jack-audio` and MIDI acceptance with
`make test-jack-midi` . It connects only test
2026-10-26 23:32:04 +01:00
clients. See [engine documentation ](docs/AUDIO_ENGINE.md ) for configuration,
routing, ownership and recovery.
2026-10-26 22:51:25 +01:00
Clean generated files:
```sh
make clean
```
## Suggested first agent task
Read `AGENT.md` and `docs/ARCHITECTURE.md` . Inspect the existing implementation, run `make test` , and report gaps before adding the next feature. Do not jump directly to plugin hosting or a full sequencer.
## License
The project is scaffolded under the MIT License; see `LICENSE` . Review the licenses of any future dependencies before distribution.
2026-10-27 03:37:19 +01:00
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.
2026-10-27 04:00:27 +01:00
Phases 13– 15 add 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.
2026-10-27 06:44:22 +01:00
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.
2026-10-27 15:46:41 +01:00
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 ).
`make test-audio-editing` checks source preservation and exact boundary output.
Time stretching and independent pitch shifting remain deferred.
2026-10-27 16:00:29 +01:00
Phase 23 adds signal-flow graph layout, routing diagnostics, direction/role
indicators and atomic unity-gain insertion into a wire. See
[ROUTING.md ](docs/ROUTING.md ); `make test-routing` verifies the C routing contract.
2026-10-27 16:15:34 +01:00
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 ).
2026-10-27 16:24:21 +01:00
Phase 25 adds LADSPA descriptor browsing, an identity/parameter editor with
reset, transactional replacement and insertion into graph wires. See
[PLUGIN_HOSTING.md ](docs/PLUGIN_HOSTING.md ) for compatibility and lifecycle limits.
2026-10-27 16:37:59 +01:00
Phase 26 adds common parameter targets, Linear/Hold mixer automation and saved
per-channel live MIDI CC bindings. Project v10 reads v1– v9. See
[CONTROL.md ](docs/CONTROL.md ) for timing, precedence and qualification limits.