From ff6e784e7c5ebe223666c6c631305397ad358289 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 23 Apr 2023 15:48:59 +0200 Subject: Start decoupling of rendering from update passes --- src/patterns.c | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 src/patterns.c (limited to 'src/patterns.c') diff --git a/src/patterns.c b/src/patterns.c new file mode 100644 index 0000000..09f7bae --- /dev/null +++ b/src/patterns.c @@ -0,0 +1,236 @@ +// +// Structs. +// + +typedef struct TriggerNote { + bool active; + Note note; +} TriggerNote; + +typedef struct ChannelSquareParams { + u8 env_volume; + u8 env_time; + u8 env_direction; + u8 duty_cycle; + u8 sweep_number; + u8 sweep_time; + u8 sweep_direction; +} ChannelSquareParams; + +typedef struct ChannelWaveParams { + u8 wave_volume; + u8 wave_mode; + u32 wave_a[4]; + u32 wave_b[4]; +} ChannelWaveParams; + +typedef struct ChannelNoiseParams { + u8 env_volume; + u8 env_time; + u8 env_direction; + u8 bit_mode; +} ChannelNoiseParams; + +typedef struct ChannelSquare { + bool active; + TriggerNote notes[16]; + ChannelSquareParams params[16]; +} ChannelSquare; + +typedef struct ChannelWave { + bool active; + TriggerNote notes[16]; + ChannelWaveParams params[16]; +} ChannelWave; + +typedef struct ChannelNoise { + bool active; + TriggerNote notes[16]; + ChannelNoiseParams params[16]; +} ChannelNoise; + +typedef struct Pattern { + ChannelSquare ch1; + ChannelSquare ch2; + ChannelWave ch3; + ChannelNoise ch4; + int bpm; + u8 bank; +} Pattern; + +// +// Defaults. +// + +const ChannelSquare default_ch1 = { + .notes = { + {true, NOTE_C_4}, + {true, NOTE_D_SHARP_4}, + {true, NOTE_G_4}, + {true, NOTE_A_SHARP_4}, + {true, NOTE_C_4}, + {true, NOTE_D_SHARP_4}, + {true, NOTE_G_4}, + {true, NOTE_A_SHARP_4}, + {true, NOTE_C_4}, + {true, NOTE_D_SHARP_4}, + {true, NOTE_G_4}, + {true, NOTE_A_SHARP_4}, + {true, NOTE_C_4}, + {true, NOTE_D_SHARP_4}, + {true, NOTE_G_4}, + {true, NOTE_A_SHARP_4}, + }, + .params = { + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + }, + .active = true, +}; + +const ChannelSquare default_ch2 = { + .notes = { + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + {true, NOTE_C_3}, + }, + .params = { + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + {8, 4, 0, 2, 0, 0, 0}, + }, + .active = true, +}; + +const ChannelWave default_ch3 = { + .notes = { + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_A_SHARP_5}, + {true, NOTE_A_SHARP_5}, + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_G_5}, + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_A_SHARP_5}, + {true, NOTE_A_SHARP_5}, + {true, NOTE_C_5}, + {true, NOTE_C_5}, + {true, NOTE_G_5}, + }, + .params = { + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + }, + .active = true, +}; + +const ChannelNoise default_ch4 = { + .notes = { + {true, NOTE_D_SHARP_4}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {true, NOTE_D_SHARP_4}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {true, NOTE_D_SHARP_4}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {true, NOTE_D_SHARP_4}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + {false, NOTE_E_6}, + }, + .params = { + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + {0xF, 0x2, 0, 0}, + }, + .active = true, +}; + +const int default_bpm = 90; + +static Pattern patterns[8] = { + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, + {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0}, +}; -- cgit v1.2.1