diff options
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 98 |
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 | ||
4 | void | ||
5 | sram_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 | |||
11 | void | ||
12 | sram_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) |
9 | void set_time(int bpm); | 22 | void set_time(int bpm); |
10 | 23 | ||
@@ -429,6 +442,15 @@ const ChannelNoise default_ch4 = { | |||
429 | .active = true, | 442 | .active = true, |
430 | }; | 443 | }; |
431 | 444 | ||
445 | typedef struct Metadata { | ||
446 | u8 blank; | ||
447 | u32 magic; | ||
448 | int current_bank; | ||
449 | int current_pattern; | ||
450 | } Metadata; | ||
451 | |||
452 | static Metadata metadata = {0}; | ||
453 | |||
432 | typedef struct Pattern { | 454 | typedef 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 | ||
474 | void | ||
475 | save_bank(int i) { | ||
476 | sram_write(&patterns, sizeof(Metadata) + i * sizeof(patterns), sizeof(patterns)); | ||
477 | } | ||
478 | |||
479 | void | ||
480 | load_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(); |