aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-04 12:06:37 +0200
committerBad Diode <bd@badd10de.dev>2023-04-04 12:06:37 +0200
commit01a0849d23c413f9328e2a9444dc38a4d7606b36 (patch)
tree97c62df573aff2399c9fab5ade4bfdd1565490a0
parent912c37a54c13aca6bbdf290984f7eeccad4ccc0b (diff)
downloadstepper-01a0849d23c413f9328e2a9444dc38a4d7606b36.tar.gz
stepper-01a0849d23c413f9328e2a9444dc38a4d7606b36.zip
Add bank selection and reload previous saved state
-rw-r--r--src/sequencer.c98
1 files changed, 94 insertions, 4 deletions
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 @@
1#include "rng.c" 1#include "rng.c"
2#include "text.h" 2#include "text.h"
3 3
4void
5sram_read(u8 *dst, u16 pos, u16 n_bytes) {
6 for (size_t i = 0; i < n_bytes; ++i) {
7 dst[i] = SRAM[pos + i];
8 }
9}
10
11void
12sram_write(u8 *src, u16 pos, u16 n_bytes) {
13 for (size_t i = 0; i < n_bytes; ++i) {
14 SRAM[pos + i] = src[i];
15 }
16}
17
4// TODO 18// TODO
5// - Preview sound keys? 19// - Preview sound keys?
6// - Copy paste trigs/notes/params 20// - Copy paste trigs/notes/params
7// - Different banks for storing patterns
8// - Finish noise channel (parameter editing) 21// - Finish noise channel (parameter editing)
9void set_time(int bpm); 22void set_time(int bpm);
10 23
@@ -429,6 +442,15 @@ const ChannelNoise default_ch4 = {
429 .active = true, 442 .active = true,
430}; 443};
431 444
445typedef struct Metadata {
446 u8 blank;
447 u32 magic;
448 int current_bank;
449 int current_pattern;
450} Metadata;
451
452static Metadata metadata = {0};
453
432typedef struct Pattern { 454typedef struct Pattern {
433 ChannelSquare ch1; 455 ChannelSquare ch1;
434 ChannelSquare ch2; 456 ChannelSquare ch2;
@@ -449,6 +471,16 @@ static Pattern patterns[8] = {
449 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, 471 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
450}; 472};
451 473
474void
475save_bank(int i) {
476 sram_write(&patterns, sizeof(Metadata) + i * sizeof(patterns), sizeof(patterns));
477}
478
479void
480load_bank(int i) {
481 sram_read(&patterns, sizeof(Metadata) + i * sizeof(patterns), sizeof(patterns));
482}
483
452// 484//
453// Channel render functions. 485// Channel render functions.
454// 486//
@@ -1861,23 +1893,64 @@ handle_right_col_selection(void) {
1861 case R_COL_PLAY: { 1893 case R_COL_PLAY: {
1862 pause_playing(); 1894 pause_playing();
1863 } break; 1895 } break;
1864 // TODO: stop playing
1865 // TODO: reset cursors if applicable
1866 // TODO: load bank from sram
1867 case R_COL_BANK_A: { 1896 case R_COL_BANK_A: {
1897 stop_playing();
1898 save_bank(current_bank);
1899 metadata.current_pattern = current_pattern;
1900 metadata.current_bank = 0;
1901 sram_write(&metadata, 0, sizeof(Metadata));
1902 if (current_bank != 0) {
1903 load_bank(0);
1904 }
1868 current_bank = 0; 1905 current_bank = 0;
1906 draw_pattern_buttons();
1907 draw_triggers();
1908 draw_channels();
1869 draw_bank_buttons(); 1909 draw_bank_buttons();
1870 } break; 1910 } break;
1871 case R_COL_BANK_B: { 1911 case R_COL_BANK_B: {
1912 stop_playing();
1913 save_bank(current_bank);
1914 metadata.current_pattern = current_pattern;
1915 metadata.current_bank = 1;
1916 sram_write(&metadata, 0, sizeof(Metadata));
1917 if (current_bank != 1) {
1918 load_bank(1);
1919 }
1872 current_bank = 1; 1920 current_bank = 1;
1921 draw_pattern_buttons();
1922 draw_triggers();
1923 draw_channels();
1873 draw_bank_buttons(); 1924 draw_bank_buttons();
1874 } break; 1925 } break;
1875 case R_COL_BANK_C: { 1926 case R_COL_BANK_C: {
1927 stop_playing();
1928 save_bank(current_bank);
1929 metadata.current_pattern = current_pattern;
1930 metadata.current_bank = 2;
1931 sram_write(&metadata, 0, sizeof(Metadata));
1932 if (current_bank != 2) {
1933 load_bank(2);
1934 }
1876 current_bank = 2; 1935 current_bank = 2;
1936 draw_pattern_buttons();
1937 draw_triggers();
1938 draw_channels();
1877 draw_bank_buttons(); 1939 draw_bank_buttons();
1878 } break; 1940 } break;
1879 case R_COL_BANK_D: { 1941 case R_COL_BANK_D: {
1942 stop_playing();
1943 save_bank(current_bank);
1944 metadata.current_pattern = current_pattern;
1945 metadata.current_bank = 3;
1946 sram_write(&metadata, 0, sizeof(Metadata));
1947 if (current_bank != 3) {
1948 load_bank(3);
1949 }
1880 current_bank = 3; 1950 current_bank = 3;
1951 draw_pattern_buttons();
1952 draw_triggers();
1953 draw_channels();
1881 draw_bank_buttons(); 1954 draw_bank_buttons();
1882 } break; 1955 } break;
1883 } 1956 }
@@ -2533,6 +2606,23 @@ sequencer_init(void) {
2533 // Unpack non-sprite tiles directly on the VRAM. 2606 // Unpack non-sprite tiles directly on the VRAM.
2534 load_assets(); 2607 load_assets();
2535 2608
2609 // Load the previous bank from SRAM or initialize it if needed.
2610 sram_read(&metadata, 0, sizeof(Metadata));
2611 if (metadata.magic != 0xbadd10de) {
2612 metadata.magic = 0xbadd10de;
2613 sram_write(&metadata, 0, sizeof(Metadata));
2614 save_bank(0);
2615 save_bank(1);
2616 save_bank(2);
2617 save_bank(3);
2618 } else {
2619 current_bank = metadata.current_bank;
2620 current_pattern = metadata.current_pattern;
2621 next_pattern = metadata.current_pattern;
2622 pattern_selection_loc = current_pattern;
2623 load_bank(metadata.current_bank);
2624 }
2625
2536 // Initialize background objects and sprites. 2626 // Initialize background objects and sprites.
2537 draw_triggers(); 2627 draw_triggers();
2538 draw_channels(); 2628 draw_channels();