aboutsummaryrefslogtreecommitdiffstats
path: root/src/patterns.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-23 15:48:59 +0200
committerBad Diode <bd@badd10de.dev>2023-04-23 15:48:59 +0200
commitff6e784e7c5ebe223666c6c631305397ad358289 (patch)
tree0f87823d48366a6beb8d36d7eea5dc33663d7abd /src/patterns.c
parentdeb9c48fbd3dc5854de4ae3a04dc999029c10ae0 (diff)
downloadstepper-ff6e784e7c5ebe223666c6c631305397ad358289.tar.gz
stepper-ff6e784e7c5ebe223666c6c631305397ad358289.zip
Start decoupling of rendering from update passes
Diffstat (limited to 'src/patterns.c')
-rw-r--r--src/patterns.c236
1 files changed, 236 insertions, 0 deletions
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 @@
1//
2// Structs.
3//
4
5typedef struct TriggerNote {
6 bool active;
7 Note note;
8} TriggerNote;
9
10typedef struct ChannelSquareParams {
11 u8 env_volume;
12 u8 env_time;
13 u8 env_direction;
14 u8 duty_cycle;
15 u8 sweep_number;
16 u8 sweep_time;
17 u8 sweep_direction;
18} ChannelSquareParams;
19
20typedef struct ChannelWaveParams {
21 u8 wave_volume;
22 u8 wave_mode;
23 u32 wave_a[4];
24 u32 wave_b[4];
25} ChannelWaveParams;
26
27typedef struct ChannelNoiseParams {
28 u8 env_volume;
29 u8 env_time;
30 u8 env_direction;
31 u8 bit_mode;
32} ChannelNoiseParams;
33
34typedef struct ChannelSquare {
35 bool active;
36 TriggerNote notes[16];
37 ChannelSquareParams params[16];
38} ChannelSquare;
39
40typedef struct ChannelWave {
41 bool active;
42 TriggerNote notes[16];
43 ChannelWaveParams params[16];
44} ChannelWave;
45
46typedef struct ChannelNoise {
47 bool active;
48 TriggerNote notes[16];
49 ChannelNoiseParams params[16];
50} ChannelNoise;
51
52typedef struct Pattern {
53 ChannelSquare ch1;
54 ChannelSquare ch2;
55 ChannelWave ch3;
56 ChannelNoise ch4;
57 int bpm;
58 u8 bank;
59} Pattern;
60
61//
62// Defaults.
63//
64
65const ChannelSquare default_ch1 = {
66 .notes = {
67 {true, NOTE_C_4},
68 {true, NOTE_D_SHARP_4},
69 {true, NOTE_G_4},
70 {true, NOTE_A_SHARP_4},
71 {true, NOTE_C_4},
72 {true, NOTE_D_SHARP_4},
73 {true, NOTE_G_4},
74 {true, NOTE_A_SHARP_4},
75 {true, NOTE_C_4},
76 {true, NOTE_D_SHARP_4},
77 {true, NOTE_G_4},
78 {true, NOTE_A_SHARP_4},
79 {true, NOTE_C_4},
80 {true, NOTE_D_SHARP_4},
81 {true, NOTE_G_4},
82 {true, NOTE_A_SHARP_4},
83 },
84 .params = {
85 {8, 4, 0, 2, 0, 0, 0},
86 {8, 4, 0, 2, 0, 0, 0},
87 {8, 4, 0, 2, 0, 0, 0},
88 {8, 4, 0, 2, 0, 0, 0},
89 {8, 4, 0, 2, 0, 0, 0},
90 {8, 4, 0, 2, 0, 0, 0},
91 {8, 4, 0, 2, 0, 0, 0},
92 {8, 4, 0, 2, 0, 0, 0},
93 {8, 4, 0, 2, 0, 0, 0},
94 {8, 4, 0, 2, 0, 0, 0},
95 {8, 4, 0, 2, 0, 0, 0},
96 {8, 4, 0, 2, 0, 0, 0},
97 {8, 4, 0, 2, 0, 0, 0},
98 {8, 4, 0, 2, 0, 0, 0},
99 {8, 4, 0, 2, 0, 0, 0},
100 {8, 4, 0, 2, 0, 0, 0},
101 },
102 .active = true,
103};
104
105const ChannelSquare default_ch2 = {
106 .notes = {
107 {true, NOTE_C_3},
108 {true, NOTE_C_3},
109 {true, NOTE_C_3},
110 {true, NOTE_C_3},
111 {true, NOTE_C_3},
112 {true, NOTE_C_3},
113 {true, NOTE_C_3},
114 {true, NOTE_C_3},
115 {true, NOTE_C_3},
116 {true, NOTE_C_3},
117 {true, NOTE_C_3},
118 {true, NOTE_C_3},
119 {true, NOTE_C_3},
120 {true, NOTE_C_3},
121 {true, NOTE_C_3},
122 {true, NOTE_C_3},
123 },
124 .params = {
125 {8, 4, 0, 2, 0, 0, 0},
126 {8, 4, 0, 2, 0, 0, 0},
127 {8, 4, 0, 2, 0, 0, 0},
128 {8, 4, 0, 2, 0, 0, 0},
129 {8, 4, 0, 2, 0, 0, 0},
130 {8, 4, 0, 2, 0, 0, 0},
131 {8, 4, 0, 2, 0, 0, 0},
132 {8, 4, 0, 2, 0, 0, 0},
133 {8, 4, 0, 2, 0, 0, 0},
134 {8, 4, 0, 2, 0, 0, 0},
135 {8, 4, 0, 2, 0, 0, 0},
136 {8, 4, 0, 2, 0, 0, 0},
137 {8, 4, 0, 2, 0, 0, 0},
138 {8, 4, 0, 2, 0, 0, 0},
139 {8, 4, 0, 2, 0, 0, 0},
140 {8, 4, 0, 2, 0, 0, 0},
141 },
142 .active = true,
143};
144
145const ChannelWave default_ch3 = {
146 .notes = {
147 {true, NOTE_C_5},
148 {true, NOTE_C_5},
149 {true, NOTE_C_5},
150 {true, NOTE_A_SHARP_5},
151 {true, NOTE_A_SHARP_5},
152 {true, NOTE_C_5},
153 {true, NOTE_C_5},
154 {true, NOTE_G_5},
155 {true, NOTE_C_5},
156 {true, NOTE_C_5},
157 {true, NOTE_C_5},
158 {true, NOTE_A_SHARP_5},
159 {true, NOTE_A_SHARP_5},
160 {true, NOTE_C_5},
161 {true, NOTE_C_5},
162 {true, NOTE_G_5},
163 },
164 .params = {
165 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
166 {3, 0, {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
167 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
168 {3, 0, {0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
169 {3, 0, {0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
170 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
171 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
172 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
173 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
174 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
175 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
176 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
177 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
178 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
179 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
180 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}},
181 },
182 .active = true,
183};
184
185const ChannelNoise default_ch4 = {
186 .notes = {
187 {true, NOTE_D_SHARP_4},
188 {false, NOTE_E_6},
189 {false, NOTE_E_6},
190 {false, NOTE_E_6},
191 {true, NOTE_D_SHARP_4},
192 {false, NOTE_E_6},
193 {false, NOTE_E_6},
194 {false, NOTE_E_6},
195 {true, NOTE_D_SHARP_4},
196 {false, NOTE_E_6},
197 {false, NOTE_E_6},
198 {false, NOTE_E_6},
199 {true, NOTE_D_SHARP_4},
200 {false, NOTE_E_6},
201 {false, NOTE_E_6},
202 {false, NOTE_E_6},
203 },
204 .params = {
205 {0xF, 0x2, 0, 0},
206 {0xF, 0x2, 0, 0},
207 {0xF, 0x2, 0, 0},
208 {0xF, 0x2, 0, 0},
209 {0xF, 0x2, 0, 0},
210 {0xF, 0x2, 0, 0},
211 {0xF, 0x2, 0, 0},
212 {0xF, 0x2, 0, 0},
213 {0xF, 0x2, 0, 0},
214 {0xF, 0x2, 0, 0},
215 {0xF, 0x2, 0, 0},
216 {0xF, 0x2, 0, 0},
217 {0xF, 0x2, 0, 0},
218 {0xF, 0x2, 0, 0},
219 {0xF, 0x2, 0, 0},
220 {0xF, 0x2, 0, 0},
221 },
222 .active = true,
223};
224
225const int default_bpm = 90;
226
227static Pattern patterns[8] = {
228 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
229 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
230 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
231 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
232 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
233 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
234 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
235 {default_ch1, default_ch2, default_ch3, default_ch4, default_bpm, 0},
236};