Where things live
ARCHITECTURE.md › Module map lists every file. In short:
| You want to change | Look in |
|---|---|
| What is saved | crates/engine/src/model/ (Project, Track, Region…), src/api.ts mirrors it |
| What an edit does | crates/engine/src/session/: one module per feature, all impl Session |
| What the UI can call | src-tauri/src/commands/, one module per area; shared wrappers in commands.rs; registered in main.rs |
| What plays, on the audio thread | crates/engine/src/dsp/: process.rs (the block), strip.rs (a strip), apply.rs (commands) |
| How state reaches the audio thread | session/engine_sync.rs and session/undo.rs send, dsp/cmd.rs defines, dsp/apply.rs receives |
| A built-in effect | crates/engine/src/fx/; contract in fx/mod.rs |
| A built-in instrument | crates/engine/src/instrument/; contract in instrument/mod.rs; parts in synth_dsp/ |
| Hosting VST3s | crates/vst3-host/src/; plugin/processor.rs and plugin/controller.rs are the two halves |
| Pure logic with its own tests | Single files at the root of crates/engine/src (takes.rs, tempo.rs, fades.rs…), listed by theme in lib.rs |
A file that grows past about 1000 lines is a hint to split it by responsibility: types stay in the
parent module (dsp.rs, session.rs) where children can reach their private fields, and the code
moves into children that start with use super::*. Tests move to a tests.rs of their own.