From 01a0849d23c413f9328e2a9444dc38a4d7606b36 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 4 Apr 2023 12:06:37 +0200 Subject: Add bank selection and reload previous saved state --- src/sequencer.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 4 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index c4a1d2a..3b77adb 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -1,10 +1,23 @@ #include "rng.c" #include "text.h" +void +sram_read(u8 *dst, u16 pos, u16 n_bytes) { + for (size_t i = 0; i < n_bytes; ++i) { + dst[i] = SRAM[pos + i]; + } +} + +void +sram_write(u8 *src, u16 pos, u16 n_bytes) { + for (size_t i = 0; i < n_bytes; ++i) { + SRAM[pos + i] = src[i]; + } +} + // TODO // - Preview sound keys? // - Copy paste trigs/notes/params -// - Different banks for storing patterns // - Finish noise channel (parameter editing) void set_time(int bpm); @@ -429,6 +442,15 @@ const ChannelNoise default_ch4 = { .active = true, }; +typedef struct Metadata { + u8 blank; + u32 magic; + int current_bank; + int current_pattern; +} Metadata; + +static Metadata metadata = {0}; + typedef struct Pattern { ChannelSquare ch1; ChannelSquare ch2; @@ -449,6 +471,16 @@ static Pattern patterns[8] = { {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, }; +void +save_bank(int i) { + sram_write(&patterns, sizeof(Metadata) + i * sizeof(patterns), sizeof(patterns)); +} + +void +load_bank(int i) { + sram_read(&patterns, sizeof(Metadata) + i * sizeof(patterns), sizeof(patterns)); +} + // // Channel render functions. // @@ -1861,23 +1893,64 @@ handle_right_col_selection(void) { case R_COL_PLAY: { pause_playing(); } break; - // TODO: stop playing - // TODO: reset cursors if applicable - // TODO: load bank from sram case R_COL_BANK_A: { + stop_playing(); + save_bank(current_bank); + metadata.current_pattern = current_pattern; + metadata.current_bank = 0; + sram_write(&metadata, 0, sizeof(Metadata)); + if (current_bank != 0) { + load_bank(0); + } current_bank = 0; + draw_pattern_buttons(); + draw_triggers(); + draw_channels(); draw_bank_buttons(); } break; case R_COL_BANK_B: { + stop_playing(); + save_bank(current_bank); + metadata.current_pattern = current_pattern; + metadata.current_bank = 1; + sram_write(&metadata, 0, sizeof(Metadata)); + if (current_bank != 1) { + load_bank(1); + } current_bank = 1; + draw_pattern_buttons(); + draw_triggers(); + draw_channels(); draw_bank_buttons(); } break; case R_COL_BANK_C: { + stop_playing(); + save_bank(current_bank); + metadata.current_pattern = current_pattern; + metadata.current_bank = 2; + sram_write(&metadata, 0, sizeof(Metadata)); + if (current_bank != 2) { + load_bank(2); + } current_bank = 2; + draw_pattern_buttons(); + draw_triggers(); + draw_channels(); draw_bank_buttons(); } break; case R_COL_BANK_D: { + stop_playing(); + save_bank(current_bank); + metadata.current_pattern = current_pattern; + metadata.current_bank = 3; + sram_write(&metadata, 0, sizeof(Metadata)); + if (current_bank != 3) { + load_bank(3); + } current_bank = 3; + draw_pattern_buttons(); + draw_triggers(); + draw_channels(); draw_bank_buttons(); } break; } @@ -2533,6 +2606,23 @@ sequencer_init(void) { // Unpack non-sprite tiles directly on the VRAM. load_assets(); + // Load the previous bank from SRAM or initialize it if needed. + sram_read(&metadata, 0, sizeof(Metadata)); + if (metadata.magic != 0xbadd10de) { + metadata.magic = 0xbadd10de; + sram_write(&metadata, 0, sizeof(Metadata)); + save_bank(0); + save_bank(1); + save_bank(2); + save_bank(3); + } else { + current_bank = metadata.current_bank; + current_pattern = metadata.current_pattern; + next_pattern = metadata.current_pattern; + pattern_selection_loc = current_pattern; + load_bank(metadata.current_bank); + } + // Initialize background objects and sprites. draw_triggers(); draw_channels(); -- cgit v1.2.1