feat: add MIDI clip recording and grid mode support

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-03 18:49:46 +00:00
parent 61ab2f0b19
commit 5f1cc081f7
2 changed files with 34 additions and 4 deletions

View File

@@ -44,6 +44,7 @@ static int process_callback(jack_nframes_t nframes, void *arg) {
uint8_t velocity = data[2];
if (status == 0x90 && channel == 0 && velocity > 0) {
// Trigger audio clip
Action action = {
.type = ACTION_MIDI_NOTE_ON,
.data.midi_note_on = { .note = note, .velocity = velocity,
@@ -51,6 +52,23 @@ static int process_callback(jack_nframes_t nframes, void *arg) {
};
engine->dispatch(action);
// Also trigger MIDI clip
int clip_idx = note % MAX_CLIPS;
Action midi_action = {
.type = ACTION_MIDI_CLIP_TRIGGER,
.data.midi_clip_trigger = { .clip_index = clip_idx }
};
engine->dispatch(midi_action);
// Record MIDI event into MIDI clip if recording
MidiClip *mclip = &state.midi_clips[clip_idx];
if (mclip->state == CLIP_RECORDING && mclip->event_count < MAX_MIDI_EVENTS) {
mclip->events[mclip->event_count].note = note;
mclip->events[mclip->event_count].velocity = velocity;
mclip->events[mclip->event_count].timestamp = midi_event.time;
mclip->event_count++;
}
uint8_t out_velocity = clip_state_to_velocity(state.clips[note % MAX_CLIPS].state);
uint8_t out_msg[3] = {0x90 | channel, note, out_velocity};
jack_midi_event_write(midi_out_buf, midi_event.time, out_msg, 3);