From 300ca4c16a45ef129a65a5520eab068f1f74c29b Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 31 May 2023 18:21:30 +0200 Subject: Add link cable sync in --- Makefile | 2 +- src/main.c | 4 +++- src/sequencer.c | 46 ++++++++++++++++++++++++++++++++++------------ src/settings.c | 20 ++++++++++++++++++++ src/settings.h | 2 ++ 5 files changed, 60 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 5ccc725..ff4204f 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) INC_FLAGS += -I$(LIBGBA_SRC) # Output library names and executables. -TARGET := STEPPER-v1.4-dev +TARGET := STEPPER-v1.4-dev-syncin ELF := $(BUILD_DIR)/$(TARGET).elf BIN := $(BUILD_DIR)/$(TARGET).gba diff --git a/src/main.c b/src/main.c index 0d4056a..ab5bccf 100644 --- a/src/main.c +++ b/src/main.c @@ -32,9 +32,11 @@ WITH REGARD TO THIS SOFTWARE. // - Select + up/down to queue the next pattern as we move to it? // // Advanced -// + Sync via CV by using the link cable. +// + Sync (OUT) via CV by using the link cable. // + Audio sync by panning left the sound and using right as a click (or // viceversa, needs to check the standard.) +// + Sync (IN) via CV by using the link cable. +// - Add tap tempo for BPM. // - Allow "marking" several trigs to be able to copy/paste them and/or adjust // their parameters. // - Per trig note probability. diff --git a/src/sequencer.c b/src/sequencer.c index 2ee6b07..5120805 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -182,6 +182,9 @@ play_step(void) { void set_time(int bpm) { + if (settings.sync == SYNC_IN_LINK) { + return; + } // The number of ticks of a 1024 cycle clock in a step based on the BPM can // be calculated as: // X bpm -> 60000 / 4 / bpm = Y ms = Ye-3 s @@ -299,9 +302,8 @@ handle_channel_selection(void) { } void -stop_playing(void) { +stop_sound(void) { play_status = 0; - step_counter = 0; TIMER_CTRL_2 = 0; SOUND_SQUARE1_CTRL = 0; SOUND_SQUARE2_CTRL = 0; @@ -310,10 +312,25 @@ stop_playing(void) { redraw_play_pause = true; } +void +stop_playing(void) { + step_counter = 0; + stop_sound(); +} + void toggle_playing(void) { play_status ^= 1; step_counter = 0; + SOUND_SQUARE1_CTRL = 0; + SOUND_SQUARE2_CTRL = 0; + SOUND_WAVE_CTRL = 0; + SOUND_NOISE_CTRL = 0; + redraw_play_pause = true; + if (settings.sync == SYNC_IN_LINK) { + return; + } + if ((TIMER_CTRL_2 & TIMER_CTRL_ENABLE) == 0) { if (current_pattern != next_pattern) { current_pattern = next_pattern; @@ -323,17 +340,20 @@ toggle_playing(void) { play_step(); } else { TIMER_CTRL_2 ^= TIMER_CTRL_ENABLE; - SOUND_SQUARE1_CTRL = 0; - SOUND_SQUARE2_CTRL = 0; - SOUND_WAVE_CTRL = 0; - SOUND_NOISE_CTRL = 0; } - redraw_play_pause = true; } void pause_playing(void) { play_status ^= 1; + SOUND_SQUARE1_CTRL = 0; + SOUND_SQUARE2_CTRL = 0; + SOUND_WAVE_CTRL = 0; + SOUND_NOISE_CTRL = 0; + redraw_play_pause = true; + if (settings.sync == SYNC_IN_LINK) { + return; + } if ((TIMER_CTRL_2 & TIMER_CTRL_ENABLE) == 0) { if (current_pattern != next_pattern && step_counter == 0) { current_pattern = next_pattern; @@ -343,12 +363,7 @@ pause_playing(void) { play_step(); } else { TIMER_CTRL_2 ^= TIMER_CTRL_ENABLE; - SOUND_SQUARE1_CTRL = 0; - SOUND_SQUARE2_CTRL = 0; - SOUND_WAVE_CTRL = 0; - SOUND_NOISE_CTRL = 0; } - redraw_play_pause = true; } void @@ -1006,6 +1021,13 @@ handle_sequencer_input(void) { } } +void +serial_irq() { + if (play_status) { + play_step(); + } +} + void sequencer_init(void) { stop_playing(); diff --git a/src/settings.c b/src/settings.c index b814e1a..2c698d1 100644 --- a/src/settings.c +++ b/src/settings.c @@ -13,8 +13,25 @@ draw_settings_cursor(void) { draw_line(x + 3, y + 5, x + 3, y + 5, COL_ACC_0); } +void serial_irq(void); +void stop_sound(void); +void toggle_playing(void); + void set_audio_settings(void) { + stop_sound(); + if (settings.sync == SYNC_IN_LINK) { + irs_set(IRQ_SERIAL, serial_irq); + irs_set(IRQ_TIMER_2, NULL); + SIO_MODE = SIO_MODE_GP + | SIO_SC_OUT(0) + | SIO_SD_OUT(0) + | SIO_SI_OUT(0) + | SIO_SO_OUT(0) + | SIO_IRQ_ENABLE; + } else { + irs_set(IRQ_SERIAL, NULL); + } switch (settings.sync) { case SYNC_OUT_LINK_AUDIO_4: case SYNC_OUT_LINK_AUDIO_8: @@ -121,4 +138,7 @@ handle_settings_input(void) { if (key_tap(KEY_A)) { next_scene = SCENE_SEQUENCER; } + if (key_tap(KEY_START)) { + toggle_playing(); + } } diff --git a/src/settings.h b/src/settings.h index 960eabc..1a45d75 100644 --- a/src/settings.h +++ b/src/settings.h @@ -14,6 +14,7 @@ typedef enum SyncSetting { SYNC_OUT_LINK_AUDIO_16, SYNC_OUT_LINK_AUDIO_8, SYNC_OUT_LINK_AUDIO_4, + SYNC_IN_LINK, SYNC_NUM, } SyncSetting; @@ -28,6 +29,7 @@ char * sync_setting_str[] = { "LINK+AUDIO OUT (16)", "LINK+AUDIO OUT (8)", "LINK+AUDIO OUT (4)", + "LINK IN", }; typedef enum ThemeSetting { -- cgit v1.2.1