feat: refactor transport into separate module with master/slave clock support

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-01 21:08:38 +00:00
parent c2ad0e874c
commit a47598df8c
6 changed files with 490 additions and 229 deletions

43
tui.c
View File

@@ -277,8 +277,14 @@ static void draw_grid(void) {
"Selected: Clip %d | State: %s | Buffer: %zu samples",
clip_idx, clip_state_to_string(clip->state), clip->buffer_size);
TransportState transport_state = (TransportState)atomic_load(&g_engine->transport->state_atomic);
ClockSource clock_source = (ClockSource)atomic_load(&g_engine->transport->clock_source_atomic);
mvprintw(GRID_ROWS * CELL_HEIGHT + 2, 0,
"Quantize: %s | Threshold: %u",
"Transport: %s | Clock: %s | BPM: %.1f | Quantize: %s | Threshold: %u",
transport_state_to_string(transport_state),
clock_source_to_string(clock_source),
atomic_load(&g_engine->transport->bpm_atomic),
quantize_mode_to_string((QuantizeMode)atomic_load(&g_engine->quantize_mode_atomic)),
(unsigned int)atomic_load(&g_engine->quantize_threshold_atomic));
@@ -307,14 +313,20 @@ static void draw_grid(void) {
mvprintw(GRID_ROWS * CELL_HEIGHT + 8, 0,
"s - Trigger scene (current row)");
mvprintw(GRID_ROWS * CELL_HEIGHT + 9, 0,
"q - Toggle quantize mode (off/beat/bar)");
"Space - Play/Pause transport");
mvprintw(GRID_ROWS * CELL_HEIGHT + 10, 0,
"T - Set quantize threshold");
"S - Stop transport");
mvprintw(GRID_ROWS * CELL_HEIGHT + 11, 0,
"x - Reset transport");
"C - Toggle clock source (Internal/MIDI)");
mvprintw(GRID_ROWS * CELL_HEIGHT + 12, 0,
"? - Toggle help");
"q - Toggle quantize mode (off/beat/bar)");
mvprintw(GRID_ROWS * CELL_HEIGHT + 13, 0,
"T - Set quantize threshold");
mvprintw(GRID_ROWS * CELL_HEIGHT + 14, 0,
"x - Reset transport position");
mvprintw(GRID_ROWS * CELL_HEIGHT + 15, 0,
"? - Toggle help");
mvprintw(GRID_ROWS * CELL_HEIGHT + 16, 0,
"Esc/q - Quit");
attroff(COLOR_PAIR(COLOR_HELP));
}
@@ -669,6 +681,27 @@ void tui_run(Engine *engine) {
break;
}
case ' ': { // Space bar - toggle play/pause
engine_transport_toggle_play(engine);
engine_process_commands(engine);
break;
}
case 'S': { // Shift+S - stop transport
engine_transport_stop(engine);
engine_process_commands(engine);
break;
}
case 'C': { // Shift+C - toggle clock source
ClockSource current = transport_get_clock_source(engine->transport);
ClockSource next = (current == CLOCK_SOURCE_INTERNAL) ?
CLOCK_SOURCE_MIDI : CLOCK_SOURCE_INTERNAL;
engine_set_clock_source(engine, next);
engine_process_commands(engine);
break;
}
case 'x':
engine_reset_transport(engine);
engine_process_commands(engine);