aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sequencer.c')
-rw-r--r--src/sequencer.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index 44ec7bb..52e0e01 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -32,6 +32,22 @@ gate_off(void) {
32} 32}
33 33
34void 34void
35gate_on(void) {
36 SIO_MODE = SIO_MODE_GP
37 | SIO_SC_OUT(1)
38 | SIO_SD_OUT(1)
39 | SIO_SI_OUT(0)
40 | SIO_SO_OUT(1)
41 | SIO_SC(1)
42 | SIO_SD(1)
43 | SIO_SO(0);
44 int n_ticks = -244181 / 600;
45 irs_set(IRQ_TIMER_1, gate_off);
46 TIMER_DATA_1 = n_ticks;
47 TIMER_CTRL_1 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3;
48}
49
50void
35play_step(void) { 51play_step(void) {
36 Pattern *pat = &patterns[current_pattern]; 52 Pattern *pat = &patterns[current_pattern];
37 if (current_pattern != next_pattern && step_counter == 15) { 53 if (current_pattern != next_pattern && step_counter == 15) {
@@ -147,21 +163,12 @@ play_step(void) {
147 SOUND_NOISE_CTRL = 0; 163 SOUND_NOISE_CTRL = 0;
148 SOUND_NOISE_FREQ = 0; 164 SOUND_NOISE_FREQ = 0;
149 } 165 }
150 // TODO: This should be configurable e.g. po needs a 1 each 2 to sync 166
151 // exactly, but we can also just want a pseudo clock divider. 167 switch (settings.sync) {
152 if (step_counter % 2 == 0) { 168 case SYNC_OUT_LINK_16: { gate_on(); } break;
153 SIO_MODE = SIO_MODE_GP 169 case SYNC_OUT_LINK_8: { if (step_counter % 2 == 0) { gate_on(); } } break;
154 | SIO_SC_OUT(1) 170 case SYNC_OUT_LINK_4: { if (step_counter % 4 == 0) { gate_on(); } } break;
155 | SIO_SD_OUT(1) 171 default: break;
156 | SIO_SI_OUT(0)
157 | SIO_SO_OUT(1)
158 | SIO_SC(1)
159 | SIO_SD(1)
160 | SIO_SO(0);
161 int n_ticks = -244181 / 600;
162 irs_set(IRQ_TIMER_1, gate_off);
163 TIMER_DATA_1 = n_ticks;
164 TIMER_CTRL_1 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3;
165 } 172 }
166 step_counter = (step_counter + 1) % 16; 173 step_counter = (step_counter + 1) % 16;
167 redraw_piano_note = true; 174 redraw_piano_note = true;
@@ -424,7 +431,7 @@ handle_right_col_selection(void) {
424 } 431 }
425 } else if (key_tap(KEY_B)) { 432 } else if (key_tap(KEY_B)) {
426 switch (right_col_selection_loc) { 433 switch (right_col_selection_loc) {
427 case R_COL_STOP: { toggle_playing(); } break; 434 case R_COL_STOP: { next_scene = SCENE_SETTINGS; } break;
428 case R_COL_PLAY: { pause_playing(); } break; 435 case R_COL_PLAY: { pause_playing(); } break;
429 case R_COL_BANK_A: { select_bank(0); } break; 436 case R_COL_BANK_A: { select_bank(0); } break;
430 case R_COL_BANK_B: { select_bank(1); } break; 437 case R_COL_BANK_B: { select_bank(1); } break;
@@ -984,6 +991,8 @@ handle_sequencer_input(void) {
984 991
985void 992void
986sequencer_init(void) { 993sequencer_init(void) {
994 stop_playing();
995
987 // Load the previous bank from SRAM or initialize it if needed. 996 // Load the previous bank from SRAM or initialize it if needed.
988 sram_read(&metadata, 0, sizeof(Metadata)); 997 sram_read(&metadata, 0, sizeof(Metadata));
989 if (metadata.initialized != SAVE_INIT_MAGIC) { 998 if (metadata.initialized != SAVE_INIT_MAGIC) {