From 291765561cd740d24a4b98bb7bb2a85a95728f0d Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 10 May 2024 23:24:58 +0200 Subject: Add back previous sync modes with updated resolution NOTE: Needs testing --- src/sequencer.c | 103 ++++++++++++++++++++++---------------------------------- src/settings.c | 5 +++ 2 files changed, 45 insertions(+), 63 deletions(-) (limited to 'src') diff --git a/src/sequencer.c b/src/sequencer.c index bcb090c..ed13486 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -35,52 +35,31 @@ gate_set(u8 sc, u8 so) { | SIO_SI(0); } -//void -//gate_on(void) { -// // SYNC24 NOTES -// // (from https://e-rm.de/data/E-RM_report_HowToDinSync_10_14_EN.pdf) -// // -// // "Moreover, a duty cycle of 50% doesn’t seem to be nescessary, all tested -// // machines were able to sync properly to clock ticks with a positive width -// // of 5 ms to up to 300 BPM" @ 24bpq -// // -// // int bpm = 100; -// // if (settings.global_bpm) { -// // bpm = settings.bpm; -// // } else { -// // bpm patterns[current_pattern].bpm; -// // } -// // gate_off(); -// // pulses_sent = 0; -// // gate_status = 0; -// // SIO_MODE = SIO_MODE_GP -// // | SIO_SC_OUT(1) -// // | SIO_SO_OUT(0) -// // | SIO_SD_OUT(0) -// // | SIO_SI_OUT(0) -// // | SIO_SC(1) -// // | SIO_SO(0) -// // | SIO_SD(0) -// // | SIO_SI(0); -// // // int n_ticks = -80; // 5ms -// // // irs_set(IRQ_TIMER_3, gate_off); -// // // TIMER_DATA_3 = n_ticks; -// // // TIMER_CTRL_3 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; -// // int n_ticks = -80 / 8 / 2; // 5ms -// // irs_set(IRQ_TIMER_3, gate_lsdj); -// // TIMER_DATA_3 = n_ticks; -// // TIMER_CTRL_3 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; -// // int n_ticks = -79; // 5ms -// // TIMER_DATA_3 = n_ticks; -// // TIMER_CTRL_3 = TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; -// // while (1) { -// // int cnt = TIMER_DATA_3; -// // if (cnt >= 80) { -// // gate_off(); -// // break; -// // } -// // } -//} +void +gate_off(void) { + TIMER_CTRL_3 = 0; + gate_set(0, 0); +} + +void +gate_on(void) { + // SYNC24 NOTES + // (from https://e-rm.de/data/E-RM_report_HowToDinSync_10_14_EN.pdf) + // + // "Moreover, a duty cycle of 50% doesn't seem to be necessary, all tested + // machines were able to sync properly to clock ticks with a positive width + // of 5 ms to up to 300 BPM" @ 24bpq + // + // Since we want to use a 96bpq timer, we need to go 4 times faster (1.25ms + // per gate), though we could tailor the timing to the selected sync mode + // for less lenient machines. + gate_off(); + gate_set(1, 1); + int n_ticks = -80 / 4; // 1.25ms + irs_set(IRQ_TIMER_3, gate_off); + TIMER_DATA_3 = n_ticks; + TIMER_CTRL_3 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; +} int pulse_count = 0; int pulse_value = 0; @@ -565,21 +544,21 @@ sequencer_tick(void) { irs_interruptible(IRQ_TIMER_1); // Audio click sync. irs_interruptible(IRQ_TIMER_3); // Link cable sync. switch (settings.sync) { - // case SYNC_OUT_LINK_96BPQ: { gate_on(); } break; - // case SYNC_OUT_LINK_48BPQ: { if (sync_ticks++ % 2 == 0) { gate_on(); } } break; - // case SYNC_OUT_LINK_24BPQ: { if (sync_ticks++ % 4 == 0) { gate_on(); } } break; - // case SYNC_OUT_LINK_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); } } break; - // case SYNC_OUT_LINK_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); } } break; - // case SYNC_OUT_LINK_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); } } break; - // case SYNC_OUT_LINK_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); } } break; - // case SYNC_OUT_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { audio_sync_click = true; } } break; - // case SYNC_OUT_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { audio_sync_click = true; } } break; - // case SYNC_OUT_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { audio_sync_click = true; } } break; - // case SYNC_OUT_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { audio_sync_click = true; } } break; - // case SYNC_OUT_LINK_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); audio_sync_click = true; } } break; - // case SYNC_OUT_LINK_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); audio_sync_click = true; } } break; - // case SYNC_OUT_LINK_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); audio_sync_click = true; } } break; - // case SYNC_OUT_LINK_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_96BPQ: { gate_on(); } break; + case SYNC_OUT_LINK_48BPQ: { if (sync_ticks++ % 2 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_24BPQ: { if (sync_ticks++ % 4 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); } } break; + case SYNC_OUT_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); audio_sync_click = true; } } break; case SYNC_OUT_LSDJ: { if (sync_ticks++ % 4 == 0) { u8 val = 0xff; @@ -780,7 +759,6 @@ stop_sound(void) { SOUND_NOISE_CTRL = 0; redraw_play_pause = true; redraw_pattern_buttons = true; - gate_set(1, 1); } void @@ -2086,5 +2064,4 @@ sequencer_init(void) { SOUND_STATUS = SOUND_ENABLE; init_dsound(); set_audio_settings(); - gate_set(1, 1); } diff --git a/src/settings.c b/src/settings.c index 8b4c3b1..e6f07f4 100644 --- a/src/settings.c +++ b/src/settings.c @@ -17,6 +17,7 @@ void sync_in_4(void); void reset_sequencer(void); void toggle_playing(void); void stop_playing(void); +void gate_set(u8, u8); static int sync_ticks = 0; @@ -65,6 +66,10 @@ set_audio_settings(void) { | SOUND_DSOUND_RATIO_A | SOUND_DSOUND_LEFT_A | SOUND_DSOUND_RESET_A; + gate_set(0, 0); + } break; + case SYNC_OUT_LSDJ: { + gate_set(1, 1); } break; default: { SOUND_DMG_MASTER = sound_volume(SOUND_SQUARE1 -- cgit v1.2.1