1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
|
channel_count: MACRO
_num_channels = \1 - 1
ENDM
channel: MACRO
dn (_num_channels << 2), \1 - 1 ; channel id
dw \2 ; address
_num_channels = 0
ENDM
note: MACRO
dn (\1), (\2) - 1 ; pitch, length
ENDM
drum_note: MACRO
note \1, \2 ; drum instrument, length
ENDM
rest: MACRO
note 0, \1 ; length
ENDM
square_note: MACRO
db \1 ; length
IF \3 < 0
dn \2, %1000 | (\3 * -1) ; volume envelope
ELSE
dn \2, \3 ; volume envelope
ENDC
dw \4 ; frequency
ENDM
noise_note: MACRO
db \1 ; length
IF \3 < 0
dn \2, %1000 | (\3 * -1) ; volume envelope
ELSE
dn \2, \3 ; volume envelope
ENDC
db \4 ; frequency
ENDM
; MusicCommands indexes (see audio/engine.asm)
const_def $d0
FIRST_MUSIC_CMD EQU const_value
const octave_cmd ; $d0
octave: MACRO
db octave_cmd | 8 - (\1) ; octave
ENDM
const_skip 7 ; all octave values
const note_type_cmd ; $d8
note_type: MACRO
db note_type_cmd
db \1 ; note length
IF _NARG >= 2
IF \3 < 0
dn \2, %1000 | (\3 * -1) ; volume envelope
ELSE
dn \2, \3 ; volume envelope
ENDC
ENDC
ENDM
; only valid on the noise channel
drum_speed: MACRO
note_type \1 ; note length
ENDM
const transpose_cmd ; $d9
transpose: MACRO
db transpose_cmd
dn \1, \2 ; num octaves, num pitches
ENDM
const tempo_cmd ; $da
tempo: MACRO
db tempo_cmd
bigdw \1 ; tempo
ENDM
const duty_cycle_cmd ; $db
duty_cycle: MACRO
db duty_cycle_cmd
db \1 ; duty cycle
ENDM
const volume_envelope_cmd ; $dc
volume_envelope: MACRO
db volume_envelope_cmd
IF \2 < 0
dn \1, %1000 | (\2 * -1) ; volume envelope
ELSE
dn \1, \2 ; volume envelope
ENDC
ENDM
const pitch_sweep_cmd ; $dd
pitch_sweep: MACRO
db pitch_sweep_cmd
IF \2 < 0
dn \1, %1000 | (\2 * -1) ; pitch sweep
ELSE
dn \1, \2 ; pitch sweep
ENDC
ENDM
const duty_cycle_pattern_cmd ; $de
duty_cycle_pattern: MACRO
db duty_cycle_pattern_cmd
db (\1 << 6) | (\2 << 4) | (\3 << 2) | (\4 << 0) ; duty cycle pattern
ENDM
const toggle_sfx_cmd ; $df
toggle_sfx: MACRO
db toggle_sfx_cmd
ENDM
const pitch_slide_cmd ; $e0
pitch_slide: MACRO
db pitch_slide_cmd
db \1 - 1 ; duration
dn 8 - \2, \3 % 12 ; octave, pitch
ENDM
const vibrato_cmd ; $e1
vibrato: MACRO
db vibrato_cmd
db \1 ; delay
IF _NARG > 2
dn \2, \3 ; extent, rate
ELSE
db \2 ; LEGACY: Support for 1-arg extent
ENDC
ENDM
const unknownmusic0xe2_cmd ; $e2
unknownmusic0xe2: MACRO
db unknownmusic0xe2_cmd
db \1 ; unknown
ENDM
const toggle_noise_cmd ; $e3
toggle_noise: MACRO
db toggle_noise_cmd
IF _NARG > 0
db \1 ; drum kit
ENDC
ENDM
const force_stereo_panning_cmd ; $e4
force_stereo_panning: MACRO
db force_stereo_panning_cmd
dn %1111 * (1 && \1), %1111 * (1 && \2) ; left enable, right enable
ENDM
const volume_cmd ; $e5
volume: MACRO
db volume_cmd
IF _NARG > 1
dn \1, \2 ; left volume, right volume
ELSE
db \1 ; LEGACY: Support for 1-arg volume
ENDC
ENDM
const pitch_offset_cmd ; $e6
pitch_offset: MACRO
db pitch_offset_cmd
bigdw \1 ; pitch offset
ENDM
const unknownmusic0xe7_cmd ; $e7
unknownmusic0xe7: MACRO
db unknownmusic0xe7_cmd
db \1 ; unknown
ENDM
const unknownmusic0xe8_cmd ; $e8
unknownmusic0xe8: MACRO
db unknownmusic0xe8_cmd
db \1 ; unknown
ENDM
const tempo_relative_cmd ; $e9
tempo_relative: MACRO
db tempo_relative_cmd
bigdw \1 ; tempo adjustment
ENDM
const restart_channel_cmd ; $ea
restart_channel: MACRO
db restart_channel_cmd
dw \1 ; address
ENDM
const new_song_cmd ; $eb
new_song: MACRO
db new_song_cmd
bigdw \1 ; id
ENDM
const sfx_priority_on_cmd ; $ec
sfx_priority_on: MACRO
db sfx_priority_on_cmd
ENDM
const sfx_priority_off_cmd ; $ed
sfx_priority_off: MACRO
db sfx_priority_off_cmd
ENDM
const unknownmusic0xee_cmd ; $ee
unknownmusic0xee: MACRO
db unknownmusic0xee_cmd
dw \1 ; address
ENDM
const unknownmusic0xef_cmd ; $ef
unknownmusic0xef: MACRO
db unknownmusic0xef_cmd
dw \1 ; address
ENDM
const sfx_toggle_noise_cmd ; $f0
sfx_toggle_noise: MACRO
db sfx_toggle_noise_cmd
IF _NARG > 0
db \1 ; drum kit
ENDC
ENDM
const music0xf1_cmd ; $f1
music0xf1: MACRO
db music0xf1_cmd
ENDM
const music0xf2_cmd ; $f2
music0xf2: MACRO
db music0xf2_cmd
ENDM
const music0xf3_cmd ; $f3
music0xf3: MACRO
db music0xf3_cmd
ENDM
const music0xf4_cmd ; $f4
music0xf4: MACRO
db music0xf4_cmd
ENDM
const music0xf5_cmd ; $f5
music0xf5: MACRO
db music0xf5_cmd
ENDM
const music0xf6_cmd ; $f6
music0xf6: MACRO
db music0xf6_cmd
ENDM
const music0xf7_cmd ; $f7
music0xf7: MACRO
db music0xf7_cmd
ENDM
const music0xf8_cmd ; $f8
music0xf8: MACRO
db music0xf8_cmd
ENDM
const unknownmusic0xf9_cmd ; $f9
unknownmusic0xf9: MACRO
db unknownmusic0xf9_cmd
ENDM
const set_condition_cmd ; $fa
set_condition: MACRO
db set_condition_cmd
db \1 ; condition
ENDM
const sound_jump_if_cmd ; $fb
sound_jump_if: MACRO
db sound_jump_if_cmd
db \1 ; condition
dw \2 ; address
ENDM
const sound_jump_cmd ; $fc
sound_jump: MACRO
db sound_jump_cmd
dw \1 ; address
ENDM
const sound_loop_cmd ; $fd
sound_loop: MACRO
db sound_loop_cmd
db \1 ; count
dw \2 ; address
ENDM
const sound_call_cmd ; $fe
sound_call: MACRO
db sound_call_cmd
dw \1 ; address
ENDM
const sound_ret_cmd ; $ff
sound_ret: MACRO
db sound_ret_cmd
ENDM
|