diff options
Diffstat (limited to 'src/patterns.c')
-rw-r--r-- | src/patterns.c | 236 |
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 | |||
5 | typedef struct TriggerNote { | ||
6 | bool active; | ||
7 | Note note; | ||
8 | } TriggerNote; | ||
9 | |||
10 | typedef 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 | |||
20 | typedef struct ChannelWaveParams { | ||
21 | u8 wave_volume; | ||
22 | u8 wave_mode; | ||
23 | u32 wave_a[4]; | ||
24 | u32 wave_b[4]; | ||
25 | } ChannelWaveParams; | ||
26 | |||
27 | typedef struct ChannelNoiseParams { | ||
28 | u8 env_volume; | ||
29 | u8 env_time; | ||
30 | u8 env_direction; | ||
31 | u8 bit_mode; | ||
32 | } ChannelNoiseParams; | ||
33 | |||
34 | typedef struct ChannelSquare { | ||
35 | bool active; | ||
36 | TriggerNote notes[16]; | ||
37 | ChannelSquareParams params[16]; | ||
38 | } ChannelSquare; | ||
39 | |||
40 | typedef struct ChannelWave { | ||
41 | bool active; | ||
42 | TriggerNote notes[16]; | ||
43 | ChannelWaveParams params[16]; | ||
44 | } ChannelWave; | ||
45 | |||
46 | typedef struct ChannelNoise { | ||
47 | bool active; | ||
48 | TriggerNote notes[16]; | ||
49 | ChannelNoiseParams params[16]; | ||
50 | } ChannelNoise; | ||
51 | |||
52 | typedef 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 | |||
65 | const 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 | |||
105 | const 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 | |||
145 | const 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 | |||
185 | const 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 | |||
225 | const int default_bpm = 90; | ||
226 | |||
227 | static 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 | }; | ||