Skip to content

Latest commit

Β 

History

History
916 lines (854 loc) Β· 77.3 KB

File metadata and controls

916 lines (854 loc) Β· 77.3 KB

Mesh Architecture

This document describes the architecture, data flow, and threading model for the Mesh DJ system.

Overview

Mesh is a 4-deck stem-based DJ application built with:

  • Rust for performance and safety
  • JACK Audio for professional low-latency audio
  • iced for the reactive GUI framework
  • Lock-free atomics for real-time audio/UI communication

Crate Structure

mesh/
β”œβ”€β”€ crates/
β”‚   β”œβ”€β”€ mesh-core/       # Audio engine, database, track loading
β”‚   β”œβ”€β”€ mesh-player/     # DJ player application (iced GUI)
β”‚   β”œβ”€β”€ mesh-cue/        # Cue point editor application
β”‚   β”œβ”€β”€ mesh-midi/       # MIDI controller support
β”‚   └── mesh-widgets/    # Shared UI widgets (waveforms)

mesh-core

The core audio engine and services layer.

Module Structure

mesh-core/
β”œβ”€β”€ engine/          # Real-time audio processing
β”‚   β”œβ”€β”€ mod.rs       # AudioEngine, EngineCommand
β”‚   β”œβ”€β”€ deck.rs      # Per-deck playback state
β”‚   β”œβ”€β”€ slicer.rs    # Beat slicer processor
β”‚   └── atomics.rs   # Lock-free state sharing
β”œβ”€β”€ loader/          # Background track loading
β”‚   β”œβ”€β”€ mod.rs       # TrackLoader service
β”‚   └── linked.rs    # Linked stem loading
β”œβ”€β”€ db/              # SQLite database access
β”‚   β”œβ”€β”€ service.rs   # DatabaseService
β”‚   └── queries.rs   # Track/metadata queries
β”œβ”€β”€ usb/             # USB device management
β”‚   β”œβ”€β”€ manager.rs   # Hot-plug detection
β”‚   └── storage.rs   # USB collection access
└── types.rs         # Shared types (Stem, HotCue, etc.)

Threading Model

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         THREAD ARCHITECTURE                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     Commands      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚              β”‚  ─────────────►   β”‚                          β”‚    β”‚
β”‚  β”‚   UI Thread  β”‚   (SPSC Ring)     β”‚   JACK Audio Thread      β”‚    β”‚
β”‚  β”‚   (iced)     β”‚                   β”‚   (Real-time, 2.9ms)     β”‚    β”‚
β”‚  β”‚              β”‚  ◄─────────────   β”‚                          β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     Atomics       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚         β”‚              (Lock-free)            β–²                      β”‚
β”‚         β”‚                                     β”‚                      β”‚
β”‚         β–Ό                                     β”‚                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ Track Loader β”‚                    β”‚  Shared Buffers  β”‚           β”‚
β”‚  β”‚   Thread     │───────────────────►│  (basedrop Arc)  β”‚           β”‚
β”‚  β”‚ (Background) β”‚  Stems + Metadata  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                    β”‚
β”‚         β”‚                                                            β”‚
β”‚         β–Ό                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                              β”‚
β”‚  β”‚   Database   β”‚     β”‚ Peaks Thread β”‚                              β”‚
β”‚  β”‚   (SQLite)   β”‚     β”‚ (Waveforms)  β”‚                              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                              β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow: Track Loading

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      TRACK LOADING PIPELINE                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  User Action          Background Thread           Audio Thread       β”‚
β”‚  ───────────          ─────────────────           ────────────       β”‚
β”‚                                                                      β”‚
β”‚  LoadTrack(deck, path)                                               β”‚
β”‚       β”‚                                                              β”‚
β”‚       β–Ό                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                     β”‚
β”‚  β”‚ TrackLoader β”‚                                                     β”‚
β”‚  β”‚  .request() β”‚                                                     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                                                     β”‚
β”‚         β”‚                                                            β”‚
β”‚         β–Ό                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”‚
β”‚  β”‚     Loader Thread (Background)       β”‚                            β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚                            β”‚
β”‚  β”‚  β”‚ 1. Read .stems file (4 stems)   β”‚ β”‚                            β”‚
β”‚  β”‚  β”‚ 2. Decode FLAC (parallel)       β”‚ β”‚                            β”‚
β”‚  β”‚  β”‚ 3. Compute overview peaks       β”‚ β”‚                            β”‚
β”‚  β”‚  β”‚ 4. Fetch metadata from DB       β”‚ β”‚                            β”‚
β”‚  β”‚  β”‚ 5. Create Shared<StemBuffers>   β”‚ β”‚                            β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                            β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                            β”‚
β”‚                 β”‚                                                    β”‚
β”‚                 β–Ό                                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                            β”‚
β”‚  β”‚   TrackLoadResult (via channel)      β”‚                            β”‚
β”‚  β”‚   - PreparedTrack (metadata, cues)   β”‚                            β”‚
β”‚  β”‚   - Shared<StemBuffers>              β”‚                            β”‚
β”‚  β”‚   - OverviewState (peaks)            β”‚                            β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                            β”‚
β”‚                 β”‚                                                    β”‚
β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                         β”‚
β”‚       β–Ό                   β–Ό                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                 β”‚
β”‚  β”‚   UI    β”‚      β”‚ Audio Engine  β”‚                                 β”‚
β”‚  β”‚ Updates β”‚      β”‚ LoadTrack cmd β”‚                                 β”‚
β”‚  β”‚ waveformβ”‚      β”‚ (SPSC ring)   β”‚                                 β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                 β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Audio Engine Command Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ENGINE COMMAND PROTOCOL                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  UI Thread                           Audio Thread                    β”‚
β”‚  ─────────                           ────────────                    β”‚
β”‚                                                                      β”‚
β”‚  domain.toggle_play(deck)                                            β”‚
β”‚       β”‚                                                              β”‚
β”‚       β–Ό                                                              β”‚
β”‚  CommandSender::send()                                               β”‚
β”‚       β”‚                                                              β”‚
β”‚       β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”‚
β”‚       └─►│     SPSC Ring Buffer (lock-free)       β”‚                 β”‚
β”‚          β”‚     EngineCommand::TogglePlay(deck)    β”‚                 β”‚
β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚                               β”‚                                      β”‚
β”‚                               β–Ό                                      β”‚
β”‚                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
β”‚                    β”‚  process() callback  β”‚                         β”‚
β”‚                    β”‚  (every 2.9ms)       β”‚                         β”‚
β”‚                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚                         β”‚
β”‚                    β”‚  β”‚ drain_commands β”‚  β”‚                         β”‚
β”‚                    β”‚  β”‚ apply to deck  β”‚  β”‚                         β”‚
β”‚                    β”‚  β”‚ update atomics β”‚  β”‚                         β”‚
β”‚                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚                         β”‚
β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
β”‚                               β”‚                                      β”‚
β”‚                               β–Ό                                      β”‚
β”‚                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
β”‚                    β”‚   DeckAtomics        β”‚                         β”‚
β”‚                    β”‚   - position: u64    │◄──── UI reads           β”‚
β”‚                    β”‚   - is_playing: bool β”‚      (lock-free)        β”‚
β”‚                    β”‚   - loop_active: boolβ”‚                         β”‚
β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
β”‚                                                                      β”‚
β”‚  Key Commands:                                                       β”‚
β”‚  β”œβ”€ LoadTrack(deck, stems, metadata)                                β”‚
β”‚  β”œβ”€ TogglePlay(deck), CuePress/Release(deck)                        β”‚
β”‚  β”œβ”€ HotCuePress(deck, slot), SetCuePoint(deck)                      β”‚
β”‚  β”œβ”€ ToggleLoop(deck), AdjustLoopLength(deck, delta)                 β”‚
β”‚  β”œβ”€ SetVolume(deck, vol), SetEq*(deck, val)                         β”‚
β”‚  β”œβ”€ ToggleStemMute(deck, stem), ToggleStemSolo(deck, stem)          β”‚
β”‚  └─ LinkStem(deck, stem, data), ToggleLinkedStem(deck, stem)        β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Lock-Free State Sharing

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ATOMIC STATE SHARING                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Audio Thread (Writer)              UI Thread (Reader)               β”‚
β”‚  ─────────────────────              ───────────────────              β”‚
β”‚                                                                      β”‚
β”‚  DeckAtomics [4 decks]                                               β”‚
β”‚  β”œβ”€ position.store(pos, Relaxed)  ───►  position.load(Relaxed)      β”‚
β”‚  β”œβ”€ play_state.store(state)       ───►  play_state.load()           β”‚
β”‚  β”œβ”€ loop_active.store(bool)       ───►  loop_active.load()          β”‚
β”‚  β”œβ”€ loop_start/end.store(u64)     ───►  loop_start/end.load()       β”‚
β”‚  └─ lufs_gain.store(f32)          ───►  lufs_gain.load()            β”‚
β”‚                                                                      β”‚
β”‚  SlicerAtomics [4 decks]                                             β”‚
β”‚  β”œβ”€ active.store(bool)            ───►  active.load()               β”‚
β”‚  β”œβ”€ current_slice.store(u8)       ───►  current_slice.load()        β”‚
β”‚  └─ queue.store([u8; 16])         ───►  queue.load()                β”‚
β”‚                                                                      β”‚
β”‚  LinkedStemAtomics [4 decks][4 stems]                                β”‚
β”‚  β”œβ”€ has_linked[stem].store(bool)  ───►  has_linked[stem].load()     β”‚
β”‚  └─ use_linked[stem].store(bool)  ───►  use_linked[stem].load()     β”‚
β”‚                                                                      β”‚
β”‚  Benefits:                                                           β”‚
β”‚  β”œβ”€ Zero contention (no locks)                                      β”‚
β”‚  β”œβ”€ ~5ns read latency                                               β”‚
β”‚  β”œβ”€ Audio thread never blocks                                       β”‚
β”‚  └─ UI reads at 60fps without affecting audio                       β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

mesh-player

The DJ player application with iced GUI.

Module Structure

mesh-player/
β”œβ”€β”€ main.rs              # Application entry point
β”œβ”€β”€ config.rs            # Configuration loading/saving
β”œβ”€β”€ domain/
β”‚   └── mod.rs           # MeshDomain - service orchestration
└── ui/
    β”œβ”€β”€ app.rs           # MeshApp - iced application
    β”œβ”€β”€ message.rs       # Message enum definitions
    β”œβ”€β”€ state.rs         # UI state types
    β”œβ”€β”€ handlers/        # Message handlers (extracted)
    β”‚   β”œβ”€β”€ mixer.rs     # Volume, EQ, filter
    β”‚   β”œβ”€β”€ settings.rs  # Settings modal
    β”‚   β”œβ”€β”€ midi_learn.rs# MIDI learn workflow
    β”‚   β”œβ”€β”€ browser.rs   # Collection browser + USB
    β”‚   β”œβ”€β”€ track_loading.rs # Load results
    β”‚   β”œβ”€β”€ deck_controls.rs # Deck playback/stems
    β”‚   └── tick.rs      # Periodic sync (60fps)
    β”œβ”€β”€ deck_view.rs     # Per-deck control UI
    β”œβ”€β”€ mixer_view.rs    # Mixer channel UI
    β”œβ”€β”€ collection_browser.rs # Track browser
    β”œβ”€β”€ player_canvas.rs # Waveform rendering
    β”œβ”€β”€ midi_learn.rs    # MIDI learn UI
    β”œβ”€β”€ settings.rs      # Settings modal UI
    └── theme.rs         # Color palette

Three-Layer Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MESH-PLAYER ARCHITECTURE                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                      UI LAYER (iced)                         β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚
β”‚  β”‚  β”‚                     MeshApp                              β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ update()β”‚  β”‚  view()  β”‚  β”‚    subscription()      β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚         β”‚  β”‚          β”‚  β”‚  - Tick (60fps)        β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ Message β”‚  β”‚ Element  β”‚  β”‚  - TrackLoaded         β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚ dispatchβ”‚  β”‚ tree     β”‚  β”‚  - PeaksComputed       β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  - LinkedStemLoaded    β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚       β”‚                     β”‚  - UsbEvents           β”‚  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚       β–Ό                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚                   handlers/                          β”‚β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚  tick β”‚ deck β”‚ mixer β”‚ browser β”‚ settings β”‚ ...     β”‚β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                β”‚                                     β”‚
β”‚                                β–Ό                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                    DOMAIN LAYER                              β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚
β”‚  β”‚  β”‚                    MeshDomain                            β”‚ β”‚    β”‚
β”‚  β”‚  β”‚                                                          β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  Owns:                    Provides:                      β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ DatabaseService       β”œβ”€ toggle_play(deck)           β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ TrackLoader           β”œβ”€ set_volume(deck, vol)       β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ PeaksComputer         β”œβ”€ load_linked_stem(...)       β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ UsbManager            β”œβ”€ request_track_load(...)     β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ CommandSender         └─ apply_loaded_track(...)     β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ deck_stems[4]                                        β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”œβ”€ track_lufs[4]                                        β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  └─ global_bpm                                           β”‚ β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                β”‚                                     β”‚
β”‚                                β–Ό                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                    SERVICE LAYER (mesh-core)                 β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚
β”‚  β”‚  β”‚AudioEngine β”‚ β”‚TrackLoader β”‚ β”‚ Database   β”‚ β”‚UsbManager β”‚ β”‚    β”‚
β”‚  β”‚  β”‚(JACK)      β”‚ β”‚(Background)β”‚ β”‚ (SQLite)   β”‚ β”‚(Hot-plug) β”‚ β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      MESSAGE FLOW (iced)                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  User Input / Subscription                                           β”‚
β”‚          β”‚                                                           β”‚
β”‚          β–Ό                                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                        Message                                β”‚   β”‚
β”‚  β”‚  β”œβ”€ Tick                    β†’ handlers::tick::handle()       β”‚   β”‚
β”‚  β”‚  β”œβ”€ TrackLoaded(msg)        β†’ handlers::track_loading::...   β”‚   β”‚
β”‚  β”‚  β”œβ”€ PeaksComputed(result)   β†’ handlers::track_loading::...   β”‚   β”‚
β”‚  β”‚  β”œβ”€ LinkedStemLoaded(msg)   β†’ handlers::track_loading::...   β”‚   β”‚
β”‚  β”‚  β”œβ”€ Deck(idx, DeckMessage)  β†’ handlers::deck_controls::...   β”‚   β”‚
β”‚  β”‚  β”œβ”€ Mixer(MixerMessage)     β†’ handlers::mixer::handle()      β”‚   β”‚
β”‚  β”‚  β”œβ”€ CollectionBrowser(msg)  β†’ handlers::browser::...         β”‚   β”‚
β”‚  β”‚  β”œβ”€ Settings(SettingsMsg)   β†’ handlers::settings::handle()   β”‚   β”‚
β”‚  β”‚  β”œβ”€ MidiLearn(LearnMsg)     β†’ handlers::midi_learn::handle() β”‚   β”‚
β”‚  β”‚  β”œβ”€ Usb(UsbMessage)         β†’ handlers::browser::handle_usb()β”‚   β”‚
β”‚  β”‚  β”œβ”€ SetGlobalBpm(f64)       β†’ domain.set_global_bpm_with_... β”‚   β”‚
β”‚  β”‚  β”œβ”€ LoadTrack(deck, path)   β†’ domain.request_track_load()    β”‚   β”‚
β”‚  β”‚  β”œβ”€ DeckSeek(deck, pos)     β†’ domain.seek()                  β”‚   β”‚
β”‚  β”‚  └─ DeckSetZoom(deck, bars) β†’ player_canvas_state.set_zoom() β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tick Handler (60fps UI Sync)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    TICK HANDLER (handlers/tick.rs)                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Every 16ms (60fps):                                                 β”‚
β”‚                                                                      β”‚
β”‚  1. MIDI Input Polling                                               β”‚
β”‚     β”œβ”€ Drain MIDI messages from controller                          β”‚
β”‚     β”œβ”€ Route to deck/mixer/browser handlers                         β”‚
β”‚     └─ MIDI Learn capture (if active)                               β”‚
β”‚                                                                      β”‚
β”‚  2. Atomic State Sync (lock-free reads)                             β”‚
β”‚     β”œβ”€ Read DeckAtomics[4]                                          β”‚
β”‚     β”‚   β”œβ”€ position, is_playing, loop_active                        β”‚
β”‚     β”‚   β”œβ”€ lufs_gain, key_match, transpose                          β”‚
β”‚     β”‚   └─ Update player_canvas_state                               β”‚
β”‚     β”œβ”€ Read SlicerAtomics[4]                                        β”‚
β”‚     β”‚   β”œβ”€ active, current_slice, queue                             β”‚
β”‚     β”‚   └─ Update deck_views + canvas                               β”‚
β”‚     └─ Read LinkedStemAtomics[4][4]                                 β”‚
β”‚         β”œβ”€ has_linked, use_linked per stem                          β”‚
β”‚         └─ Update waveform split-view state                         β”‚
β”‚                                                                      β”‚
β”‚  3. Waveform Peak Requests                                           β”‚
β”‚     β”œβ”€ Check if zoomed view needs recompute                         β”‚
β”‚     β”œβ”€ Send PeaksComputeRequest to background thread                β”‚
β”‚     └─ Results arrive via PeaksComputed subscription                β”‚
β”‚                                                                      β”‚
β”‚  4. MIDI LED Feedback                                                β”‚
β”‚     β”œβ”€ Build FeedbackState from current UI state                    β”‚
β”‚     └─ Send to controller (play LEDs, hot cue LEDs, etc.)           β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Waveform Rendering Pipeline

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    WAVEFORM RENDERING                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   TrackLoader   │────►│  OverviewState  │────►│   Overview    β”‚  β”‚
β”‚  β”‚ (pre-computed)  β”‚     β”‚  (4096 peaks)   β”‚     β”‚   Waveform    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  (GPU canvas) β”‚  β”‚
β”‚                                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  PeaksComputer  │────►│   ZoomedState   │────►│    Zoomed     β”‚  β”‚
β”‚  β”‚   (on-demand)   β”‚     β”‚ (cached peaks)  β”‚     β”‚   Waveform    β”‚  β”‚
β”‚  β”‚                 β”‚     β”‚                 β”‚     β”‚  (scrolling)  β”‚  β”‚
β”‚  β”‚ Request params: β”‚     β”‚ Cache key:      β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”‚ - playhead pos  β”‚     β”‚ - position      β”‚                        β”‚
β”‚  β”‚ - zoom bars     β”‚     β”‚ - zoom_bars     β”‚                        β”‚
β”‚  β”‚ - stem buffers  β”‚     β”‚ - linked_active β”‚                        β”‚
β”‚  β”‚ - linked stems  β”‚     β”‚                 β”‚                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚
β”‚                                                                      β”‚
β”‚  Per-stem colors (configurable palette):                            β”‚
β”‚  β”œβ”€ Vocals: Cyan      (#00FFFF)                                     β”‚
β”‚  β”œβ”€ Drums:  Magenta   (#FF00FF)                                     β”‚
β”‚  β”œβ”€ Bass:   Yellow    (#FFFF00)                                     β”‚
β”‚  └─ Other:  Green     (#00FF00)                                     β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Performance Characteristics

Operation Latency Thread
Audio process callback 2.9ms (128 samples @ 44.1kHz) JACK RT
Atomic state read ~5ns UI
Command send (SPSC) ~50ns UI β†’ Audio
Track load (full) 2-5s Background
Peak computation 10-50ms Background
UI render (60fps) 16ms budget UI

Key Design Decisions

  1. Lock-free audio: Audio thread never acquires locks or allocates memory
  2. SPSC command ring: Bounded, pre-allocated buffer for UI→Audio commands
  3. basedrop::Shared: Reference-counted buffers safe for real-time deallocation
  4. Domain layer: Encapsulates all service coordination, hides EngineCommand details
  5. Handler extraction: Message handlers in separate modules for maintainability
  6. Atomic state sharing: UI reads engine state without synchronization overhead

mesh-cue

The cue point editor application for preparing tracks with metadata, cue points, loops, and stem links.

Module Structure

mesh-cue/
β”œβ”€β”€ main.rs              # Application entry point
β”œβ”€β”€ config.rs            # Configuration loading/saving
└── ui/
    β”œβ”€β”€ app.rs           # MeshCueApp - iced application (663 lines)
    β”œβ”€β”€ message.rs       # Message enum definitions
    β”œβ”€β”€ handlers/        # Message handlers (extracted)
    β”‚   β”œβ”€β”€ browser.rs   # Dual playlist browser (parameterized)
    β”‚   β”œβ”€β”€ track_loading.rs # Two-phase track loading
    β”‚   β”œβ”€β”€ playback.rs  # Audio transport controls
    β”‚   β”œβ”€β”€ waveform.rs  # Waveform interaction
    β”‚   β”œβ”€β”€ stem_links.rs# Stem linking workflow
    β”‚   └── tick.rs      # Periodic sync (60fps)
    β”œβ”€β”€ modals/          # Modal overlay utilities
    β”‚   β”œβ”€β”€ overlay.rs   # with_modal_overlay() helper
    β”‚   └── mod.rs
    β”œβ”€β”€ state/           # UI state types
    β”‚   β”œβ”€β”€ collection.rs# Browser state + drag/drop
    β”‚   └── loaded_track.rs # Loaded track metadata
    β”œβ”€β”€ collection_browser.rs # Dual browser view
    β”œβ”€β”€ cue_editor.rs    # Cue point editing UI
    β”œβ”€β”€ waveform.rs      # Combined waveform canvas
    β”œβ”€β”€ transport.rs     # Playback controls
    β”œβ”€β”€ settings.rs      # Settings modal
    β”œβ”€β”€ import_modal.rs  # Batch stem import
    β”œβ”€β”€ export_modal.rs  # USB export
    └── delete_modal.rs  # Delete confirmation

Architecture Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MESH-CUE ARCHITECTURE                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                      UI LAYER (iced)                         β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚
β”‚  β”‚  β”‚                     MeshCueApp                           β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚                    handlers/                         β”‚ β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚  browser β”‚ track_loading β”‚ playback β”‚ waveform β”‚ ... β”‚ β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚                    modals/                           β”‚ β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β”‚  overlay β”‚ import β”‚ export β”‚ delete β”‚ settings       β”‚ β”‚ β”‚    β”‚
β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                β”‚                                     β”‚
β”‚                                β–Ό                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                    SERVICE LAYER (mesh-core)                 β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚    β”‚
β”‚  β”‚  β”‚AudioEngine β”‚ β”‚ Database   β”‚ β”‚BatchImport β”‚ β”‚UsbManager β”‚ β”‚    β”‚
β”‚  β”‚  β”‚(JACK)      β”‚ β”‚ (SQLite)   β”‚ β”‚ (Threaded) β”‚ β”‚(Hot-plug) β”‚ β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Handler Module Design (Parameterized Browsers)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    BROWSER HANDLER PATTERN                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Problem: Dual browsers (left/right) had 300+ lines of duplication  β”‚
β”‚                                                                      β”‚
β”‚  Solution: Parameterized handlers with BrowserSide enum             β”‚
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  impl MeshCueApp {                                            β”‚   β”‚
β”‚  β”‚    pub fn handle_browser_left(&mut self, msg) -> Task {       β”‚   β”‚
β”‚  β”‚      self.handle_browser(BrowserSide::Left, msg)              β”‚   β”‚
β”‚  β”‚    }                                                          β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚    pub fn handle_browser_right(&mut self, msg) -> Task {      β”‚   β”‚
β”‚  β”‚      self.handle_browser(BrowserSide::Right, msg)             β”‚   β”‚
β”‚  β”‚    }                                                          β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚    fn handle_browser(&mut self, side, msg) -> Task {          β”‚   β”‚
β”‚  β”‚      // Single implementation handles both sides              β”‚   β”‚
β”‚  β”‚      let browser = self.collection.browser_mut(side);         β”‚   β”‚
β”‚  β”‚      let tracks = self.collection.tracks_mut(side);           β”‚   β”‚
β”‚  β”‚      // ... all logic uses side parameter                     β”‚   β”‚
β”‚  β”‚    }                                                          β”‚   β”‚
β”‚  β”‚  }                                                            β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  CollectionState accessors:                                         β”‚
β”‚  β”œβ”€ browser_mut(side) -> &mut PlaylistBrowserState                 β”‚
β”‚  β”œβ”€ browser(side) -> &PlaylistBrowserState                         β”‚
β”‚  β”œβ”€ tracks_mut(side) -> &mut Vec<TrackRow>                         β”‚
β”‚  β”œβ”€ tracks(side) -> &Vec<TrackRow>                                 β”‚
β”‚  └─ side_name(side) -> &str  ("Left" / "Right")                    β”‚
β”‚                                                                      β”‚
β”‚  Result: 532 β†’ 347 lines (35% reduction)                            β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Modal Overlay Pattern

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MODAL OVERLAY HELPER                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Before: Each modal duplicated backdrop + centering code            β”‚
β”‚                                                                      β”‚
β”‚  After: Single reusable helper                                      β”‚
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  pub fn with_modal_overlay<'a>(                               β”‚   β”‚
β”‚  β”‚      base: Element<'a, Message>,                              β”‚   β”‚
β”‚  β”‚      modal_content: Element<'a, Message>,                     β”‚   β”‚
β”‚  β”‚      close_message: Message,                                  β”‚   β”‚
β”‚  β”‚  ) -> Element<'a, Message>                                    β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  Constructs:                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚                      stack![]                                β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚    β”‚
β”‚  β”‚  β”‚ Layer 0: base (main app content)                        β”‚β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚    β”‚
β”‚  β”‚  β”‚ Layer 1: backdrop (60% opacity, click-to-close)         β”‚β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚    β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚    β”‚
β”‚  β”‚  β”‚ Layer 2: center(opaque(modal_content))                  β”‚β”‚    β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                      β”‚
β”‚  Usage in view():                                                    β”‚
β”‚  β”œβ”€ with_modal_overlay(base, import_modal, Message::CloseImport)   β”‚
β”‚  β”œβ”€ with_modal_overlay(base, export_modal, Message::CloseExport)   β”‚
β”‚  └─ with_modal_overlay(base, delete_modal, Message::CancelDelete)  β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Track Loading Pipeline (Two-Phase)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    TWO-PHASE TRACK LOADING                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Phase 1: Metadata (Fast)                 Phase 2: Audio (Slow)     β”‚
β”‚  ──────────────────────                   ─────────────────────     β”‚
β”‚                                                                      β”‚
β”‚  User double-clicks track                                            β”‚
β”‚       β”‚                                                              β”‚
β”‚       β–Ό                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                    β”‚
β”‚  β”‚ DatabaseService.get_track() β”‚  < 10ms                            β”‚
β”‚  β”‚ - BPM, key, LUFS            β”‚                                    β”‚
β”‚  β”‚ - Cue points, loops         β”‚                                    β”‚
β”‚  β”‚ - Beat grid, stem links     β”‚                                    β”‚
β”‚  β”‚ - Drop marker, first beat   β”‚                                    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                    β”‚
β”‚                 β”‚                                                    β”‚
β”‚                 β–Ό                                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ UI updates immediately      β”‚     β”‚ TrackLoader.request()   β”‚   β”‚
β”‚  β”‚ - Show cue editor           β”‚     β”‚ (Background thread)     β”‚   β”‚
β”‚  β”‚ - Display metadata          β”‚     β”‚ - Decode stems (FLAC)   β”‚   β”‚
β”‚  β”‚ - Show "loading" spinner    β”‚     β”‚ - Compute peaks         β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚ - 2-5 seconds           β”‚   β”‚
β”‚                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                    β”‚                 β”‚
β”‚                                                    β–Ό                 β”‚
β”‚                                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                                       β”‚ Message::TrackLoaded    β”‚   β”‚
β”‚                                       β”‚ - StemBuffers (Arc)     β”‚   β”‚
β”‚                                       β”‚ - Overview peaks        β”‚   β”‚
β”‚                                       β”‚ - Duration samples      β”‚   β”‚
β”‚                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                    β”‚                 β”‚
β”‚                                                    β–Ό                 β”‚
β”‚                                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                                       β”‚ UI updates waveform     β”‚   β”‚
β”‚                                       β”‚ - Combined stem display β”‚   β”‚
β”‚                                       β”‚ - Remove spinner        β”‚   β”‚
β”‚                                       β”‚ - Enable transport      β”‚   β”‚
β”‚                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  Benefit: User sees metadata instantly, can review cue points       β”‚
β”‚           while audio loads in background                            β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Track Editing Workflow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    CUE POINT EDITING WORKFLOW                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  LoadedTrackState (in-memory working copy)                          β”‚
β”‚  β”œβ”€ path: PathBuf                                                   β”‚
β”‚  β”œβ”€ bpm, key, lufs                                                  β”‚
β”‚  β”œβ”€ drop_marker, first_beat_sample                                  β”‚
β”‚  β”œβ”€ cue_points: Vec<CuePoint>      ◄── Edit operations              β”‚
β”‚  β”œβ”€ saved_loops: Vec<SavedLoop>    ◄── modify this state            β”‚
β”‚  β”œβ”€ stem_links: Vec<StemLink>                                       β”‚
β”‚  └─ beat_grid: Vec<u64>                                             β”‚
β”‚                                                                      β”‚
β”‚  Edit Operations:                                                    β”‚
β”‚  β”œβ”€ SetCuePoint(index, sample, label)                               β”‚
β”‚  β”œβ”€ DeleteCuePoint(index)                                           β”‚
β”‚  β”œβ”€ SetSavedLoop(index, start, end)                                 β”‚
β”‚  β”œβ”€ SetDropMarker(sample)                                           β”‚
β”‚  β”œβ”€ AdjustBpm(delta)                                                β”‚
β”‚  β”œβ”€ SetKey(key_string)                                              β”‚
β”‚  └─ SetStemLink(stem_idx, source_track, source_stem)                β”‚
β”‚                                                                      β”‚
β”‚  Save Flow:                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚ User presses │───►│ LoadedTrack β†’  │───►│ DatabaseService  β”‚    β”‚
β”‚  β”‚ Ctrl+S       β”‚    β”‚ Track struct   β”‚    β”‚ .save_track()    β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                      β”‚
β”‚  Keyboard Shortcuts:                                                 β”‚
β”‚  β”œβ”€ 1-8: Set cue point at playhead                                  β”‚
β”‚  β”œβ”€ Shift+1-8: Jump to cue point                                    β”‚
β”‚  β”œβ”€ D: Set drop marker                                              β”‚
β”‚  β”œβ”€ L: Set loop start/end                                           β”‚
β”‚  └─ Ctrl+S: Save all changes                                        β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Handler Organization

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MESSAGE ROUTING (app.rs)                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  fn update(&mut self, message: Message) -> Task<Message> {    β”‚   β”‚
β”‚  β”‚    match message {                                            β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚      // Browser handlers (parameterized)                      β”‚   β”‚
β”‚  β”‚      Message::BrowserLeft(msg) =>                             β”‚   β”‚
β”‚  β”‚          self.handle_browser_left(msg),                       β”‚   β”‚
β”‚  β”‚      Message::BrowserRight(msg) =>                            β”‚   β”‚
β”‚  β”‚          self.handle_browser_right(msg),                      β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚      // Drag and drop                                         β”‚   β”‚
β”‚  β”‚      Message::DragTrackStart { .. } =>                        β”‚   β”‚
β”‚  β”‚          self.handle_drag_track_start(..),                    β”‚   β”‚
β”‚  β”‚      Message::DropTracksOnPlaylist { .. } =>                  β”‚   β”‚
β”‚  β”‚          self.handle_drop_tracks_on_playlist(..),             β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚      // Track operations                                      β”‚   β”‚
β”‚  β”‚      Message::TrackLoaded(result) =>                          β”‚   β”‚
β”‚  β”‚          self.handle_track_loaded(result),                    β”‚   β”‚
β”‚  β”‚      Message::SaveTrack =>                                    β”‚   β”‚
β”‚  β”‚          self.handle_save_track(),                            β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚      // Audio transport                                       β”‚   β”‚
β”‚  β”‚      Message::TogglePlay =>                                   β”‚   β”‚
β”‚  β”‚          self.handle_toggle_play(),                           β”‚   β”‚
β”‚  β”‚      Message::Seek(pos) =>                                    β”‚   β”‚
β”‚  β”‚          self.handle_seek(pos),                               β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚      // Simple operations inline                              β”‚   β”‚
β”‚  β”‚      Message::Tick => self.handle_tick(),                     β”‚   β”‚
β”‚  β”‚      Message::CloseExport => { .. },                          β”‚   β”‚
β”‚  β”‚    }                                                          β”‚   β”‚
β”‚  β”‚  }                                                            β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  Handler file mapping:                                               β”‚
β”‚  β”œβ”€ handlers/browser.rs    β†’ BrowserLeft, BrowserRight, Drag/Drop  β”‚
β”‚  β”œβ”€ handlers/track_loading.rs β†’ TrackLoaded, LoadTrack             β”‚
β”‚  β”œβ”€ handlers/playback.rs   β†’ TogglePlay, Seek, SetLoop             β”‚
β”‚  β”œβ”€ handlers/waveform.rs   β†’ Click, Drag on waveform               β”‚
β”‚  β”œβ”€ handlers/stem_links.rs β†’ Stem linking operations               β”‚
β”‚  └─ handlers/tick.rs       β†’ 60fps atomic state sync               β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

USB Export Architecture

The USB export system provides atomic per-track exports with efficient database operations.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    USB EXPORT ARCHITECTURE                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  UI Layer (mesh-cue)                                                 β”‚
β”‚  ────────────────────                                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ ExportState                                                   β”‚   β”‚
β”‚  β”‚ β”œβ”€ phase: ExportPhase (SelectDevice β†’ Exporting β†’ Complete)  β”‚   β”‚
β”‚  β”‚ β”œβ”€ tracks_complete, total_tracks                             β”‚   β”‚
β”‚  β”‚ └─ sync_plan: SyncPlan                                       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                               β”‚ UsbMessage (via subscription)        β”‚
β”‚                               β–Ό                                      β”‚
β”‚  Domain Layer (UsbManager)                                           β”‚
β”‚  ─────────────────────────                                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ UsbManager (background thread)                                β”‚   β”‚
β”‚  β”‚ β”œβ”€ Receives UsbCommand::StartExport                          β”‚   β”‚
β”‚  β”‚ β”œβ”€ Creates ExportService (thread pool)                       β”‚   β”‚
β”‚  β”‚ └─ Forwards ExportProgress β†’ UsbMessage                      β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                               β”‚                                      β”‚
β”‚                               β–Ό                                      β”‚
β”‚  Export Service Layer (mesh-core/export/)                            β”‚
β”‚  ────────────────────────────────────────                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ ExportService                                                 β”‚   β”‚
β”‚  β”‚ β”œβ”€ thread_pool: rayon::ThreadPool (4 threads)                β”‚   β”‚
β”‚  β”‚ β”œβ”€ cancel_flag: Arc<AtomicBool>                              β”‚   β”‚
β”‚  β”‚ └─ start_export() β†’ Receiver<ExportProgress>                 β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚ Per-Thread Worker (atomic export per track):                  β”‚   β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚   β”‚
β”‚  β”‚ β”‚ 1. Copy WAV with verification (3 retries)               β”‚  β”‚   β”‚
β”‚  β”‚ β”‚ 2. Sync track to USB database (batch inserts)           β”‚  β”‚   β”‚
β”‚  β”‚ β”‚ 3. Send ExportProgress::TrackComplete                   β”‚  β”‚   β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                               β”‚                                      β”‚
β”‚                               β–Ό                                      β”‚
β”‚  Database Layer (mesh-core/db/)                                      β”‚
β”‚  ──────────────────────────────                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ DatabaseService::sync_track_atomic()                          β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚ Uses BatchQuery for efficient bulk inserts:                   β”‚   β”‚
β”‚  β”‚ β”œβ”€ batch_insert_cue_points()    (1 query for N cues)         β”‚   β”‚
β”‚  β”‚ β”œβ”€ batch_insert_saved_loops()   (1 query for N loops)        β”‚   β”‚
β”‚  β”‚ β”œβ”€ batch_insert_stem_links()    (1 query for N links)        β”‚   β”‚
β”‚  β”‚ └─ batch_delete_track_metadata() (1 query)                   β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚ Total: ~5 queries per track vs 18+ with individual inserts   β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Export Message Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    EXPORT MESSAGE FLOW                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  ExportProgress (mesh-core/export/)     UsbMessage (mesh-core/usb/) β”‚
β”‚  ─────────────────────────────────────  ─────────────────────────── β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::Started          ───►  UsbMessage::ExportStarted   β”‚
β”‚    { total_tracks, total_bytes }          { total_tracks, ... }     β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::TrackStarted     ───►  UsbMessage::ExportTrackStartedβ”‚
β”‚    { filename, track_index }              { filename, track_index } β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::TrackComplete    ───►  UsbMessage::ExportTrackCompleteβ”‚
β”‚    { filename, track_index,               { filename, track_index,  β”‚
β”‚      total_tracks, bytes_complete,          total_tracks, ... }     β”‚
β”‚      total_bytes }                                                   β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::TrackFailed      ───►  UsbMessage::ExportTrackFailedβ”‚
β”‚    { filename, track_index, error }       { filename, ... error }   β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::Complete         ───►  UsbMessage::ExportComplete  β”‚
β”‚    { duration, tracks_exported,           { duration, ... }         β”‚
β”‚      failed_files }                                                  β”‚
β”‚                                                                      β”‚
β”‚  ExportProgress::Cancelled        ───►  UsbMessage::ExportCancelled β”‚
β”‚                                                                      β”‚
β”‚  Key Insight: Progress is only sent AFTER both WAV copy AND         β”‚
β”‚  database sync complete. This ensures the UI progress bar           β”‚
β”‚  accurately reflects tracks that are fully exported.                β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Batch Insert Pattern (CozoDB)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    BATCH INSERT OPTIMIZATION                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Before (18+ queries per track):                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ for cue in cue_points:           # 8 queries                  β”‚   β”‚
β”‚  β”‚     INSERT INTO cue_points ...                                β”‚   β”‚
β”‚  β”‚ for loop in saved_loops:         # 8 queries                  β”‚   β”‚
β”‚  β”‚     INSERT INTO saved_loops ...                               β”‚   β”‚
β”‚  β”‚ for link in stem_links:          # 4 queries                  β”‚   β”‚
β”‚  β”‚     INSERT INTO stem_links ...                                β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  After (5 queries per track):                                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ 1. Upsert track row                                           β”‚   β”‚
β”‚  β”‚ 2. DELETE FROM cue_points WHERE track_id = ?                  β”‚   β”‚
β”‚  β”‚    DELETE FROM saved_loops WHERE track_id = ?                 β”‚   β”‚
β”‚  β”‚    DELETE FROM stem_links WHERE track_id = ?                  β”‚   β”‚
β”‚  β”‚ 3. ?[...] <- $cues :put cue_points {...}      # 1 batch query β”‚   β”‚
β”‚  β”‚ 4. ?[...] <- $loops :put saved_loops {...}    # 1 batch query β”‚   β”‚
β”‚  β”‚ 5. ?[...] <- $links :put stem_links {...}     # 1 batch query β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  CozoDB Batch Syntax:                                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ ?[track_id, index, sample_position, label, color] <- $rows    β”‚   β”‚
β”‚  β”‚ :put cue_points {track_id, index => sample_position, ...}     β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚ Where $rows is a Vec<Vec<DataValue>> passed as parameter      β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β”‚  Performance: ~70% reduction in DB operations during export         β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Stem Link ID Remapping

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    STEM LINK REMAPPING                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  Problem: Stem links reference tracks by database ID, but IDs       β”‚
β”‚           differ between local and USB databases.                    β”‚
β”‚                                                                      β”‚
β”‚  Local DB:                      USB DB:                              β”‚
β”‚  β”œβ”€ track_id: 42               β”œβ”€ track_id: 7                       β”‚
β”‚  β”‚  path: ".../song.stems"     β”‚  path: ".../tracks/song.wav"       β”‚
β”‚  └─ stem_link β†’ source: 42     └─ stem_link β†’ source: ???           β”‚
β”‚                                                                      β”‚
β”‚  Solution (in sync_track_atomic):                                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ fn remap_stem_links_for_export(                               β”‚   β”‚
β”‚  β”‚     links: &[StemLink],                                       β”‚   β”‚
β”‚  β”‚     source_db: &DatabaseService,  // local DB                 β”‚   β”‚
β”‚  β”‚ ) -> Vec<StemLink> {                                          β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚     for link in links:                                        β”‚   β”‚
β”‚  β”‚         // 1. Get source track path from local DB             β”‚   β”‚
β”‚  β”‚         local_track = source_db.get_track(link.source_id)     β”‚   β”‚
β”‚  β”‚         filename = local_track.path.file_name()               β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚         // 2. Find matching track in USB DB by filename       β”‚   β”‚
β”‚  β”‚         usb_track = self.get_track_by_path(                   β”‚   β”‚
β”‚  β”‚             "{usb_root}/tracks/{filename}"                    β”‚   β”‚
β”‚  β”‚         )                                                     β”‚   β”‚
β”‚  β”‚                                                               β”‚   β”‚
β”‚  β”‚         // 3. Use USB track ID for the remapped link          β”‚   β”‚
β”‚  β”‚         remapped_links.push(StemLink {                        β”‚   β”‚
β”‚  β”‚             source_track_id: usb_track.id,                    β”‚   β”‚
β”‚  β”‚             ...link                                           β”‚   β”‚
β”‚  β”‚         })                                                    β”‚   β”‚
β”‚  β”‚ }                                                             β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜