Add macros to support modern audio files in legacy pokecrystal - pret/pokecrystal GitHub Wiki
This wiki page will provide a method for using modern audio files in older pokecrystal versions without the requirement to actually having to merge pokecrystal PRs and updating lots of files unrelated to music macros.
b9a68fe - 08/27/2019 abee217
Support for pokecrystal 12/28/2017To add support for modern audio files to work in pokecrystal from these versions all you need to do is add some new MACROs and modify a couple existing macros.
Documentation for the old audio commands can be found in music_commands.md (2019) as well as the wiki's Sound engine commands (2019).
Replace macros/script/audio.asm
with the following:
musicheader: MACRO
; number of tracks, track idx, address
dbw ((\1 - 1) << 6) + (\2 - 1), \3
ENDM
note: MACRO
dn (\1), (\2) - 1
ENDM
sound: MACRO
note \1, \2
db \3 ; intensity
dw \4 ; frequency
ENDM
noise: MACRO
note \1, \2 ; duration
db \3 ; intensity
db \4 ; frequency
ENDM
; MusicCommands indexes (see audio/engine.asm)
enum_start $d0, +8
FIRST_MUSIC_CMD EQU __enum__
enum octave_cmd ; $d0
octave: MACRO
db octave_cmd | 8 - (\1)
ENDM
__enumdir__ = +1
enum notetype_cmd ; $d8
notetype: MACRO
db notetype_cmd
db \1 ; note_length
if _NARG >= 2
db \2 ; intensity
endc
ENDM
enum pitchoffset_cmd ; $d9
pitchoffset: MACRO
db pitchoffset_cmd
dn \1, \2 - 1 ; octave, key
ENDM
enum tempo_cmd ; $da
tempo: MACRO
db tempo_cmd
bigdw \1 ; tempo
ENDM
enum dutycycle_cmd ; $db
dutycycle: MACRO
db dutycycle_cmd
db \1 ; duty_cycle
ENDM
enum intensity_cmd ; $dc
intensity: MACRO
db intensity_cmd
db \1 ; intensity
ENDM
enum soundinput_cmd ; $dd
soundinput: MACRO
db soundinput_cmd
db \1 ; input
ENDM
enum sound_duty_cmd ; $de
sound_duty: MACRO
db sound_duty_cmd
if _NARG == 4
db \1 | (\2 << 2) | (\3 << 4) | (\4 << 6) ; duty sequence
else
db \1 ; LEGACY: Support for one-byte duty value
endc
ENDM
enum togglesfx_cmd ; $df
togglesfx: MACRO
db togglesfx_cmd
ENDM
enum slidepitchto_cmd ; $e0
slidepitchto: MACRO
db slidepitchto_cmd
db \1 - 1 ; duration
dn \2, \3 ; octave, pitch
ENDM
enum 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
enum unknownmusic0xe2_cmd ; $e2
unknownmusic0xe2: MACRO
db unknownmusic0xe2_cmd
db \1 ; unknown
ENDM
enum togglenoise_cmd ; $e3
togglenoise: MACRO
db togglenoise_cmd
db \1 ; id
ENDM
enum panning_cmd ; $e4
panning: MACRO
db panning_cmd
db \1 ; tracks
ENDM
enum 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
enum tone_cmd ; $e6
tone: MACRO
db tone_cmd
bigdw \1 ; tone
ENDM
enum unknownmusic0xe7_cmd ; $e7
unknownmusic0xe7: MACRO
db unknownmusic0xe7_cmd
db \1 ; unknown
ENDM
enum unknownmusic0xe8_cmd ; $e8
unknownmusic0xe8: MACRO
db unknownmusic0xe8_cmd
db \1 ; unknown
ENDM
enum tempo_relative_cmd ; $e9
tempo_relative: MACRO
db tempo_relative_cmd
bigdw \1 ; value
ENDM
enum restartchannel_cmd ; $ea
restartchannel: MACRO
db restartchannel_cmd
dw \1 ; address
ENDM
enum newsong_cmd ; $eb
newsong: MACRO
db newsong_cmd
bigdw \1 ; id
ENDM
enum sfxpriorityon_cmd ; $ec
sfxpriorityon: MACRO
db sfxpriorityon_cmd
ENDM
enum sfxpriorityoff_cmd ; $ed
sfxpriorityoff: MACRO
db sfxpriorityoff_cmd
ENDM
enum unknownmusic0xee_cmd ; $ee
unknownmusic0xee: MACRO
db unknownmusic0xee_cmd
dw \1 ; address
ENDM
enum stereopanning_cmd ; $ef
stereopanning: MACRO
db stereopanning_cmd
db \1 ; tracks
ENDM
enum sfxtogglenoise_cmd ; $f0
sfxtogglenoise: MACRO
db sfxtogglenoise_cmd
db \1 ; id
ENDM
enum music0xf1_cmd ; $f1
music0xf1: MACRO
db music0xf1_cmd
ENDM
enum music0xf2_cmd ; $f2
music0xf2: MACRO
db music0xf2_cmd
ENDM
enum music0xf3_cmd ; $f3
music0xf3: MACRO
db music0xf3_cmd
ENDM
enum music0xf4_cmd ; $f4
music0xf4: MACRO
db music0xf4_cmd
ENDM
enum music0xf5_cmd ; $f5
music0xf5: MACRO
db music0xf5_cmd
ENDM
enum music0xf6_cmd ; $f6
music0xf6: MACRO
db music0xf6_cmd
ENDM
enum music0xf7_cmd ; $f7
music0xf7: MACRO
db music0xf7_cmd
ENDM
enum music0xf8_cmd ; $f8
music0xf8: MACRO
db music0xf8_cmd
ENDM
enum unknownmusic0xf9_cmd ; $f9
unknownmusic0xf9: MACRO
db unknownmusic0xf9_cmd
ENDM
enum setcondition_cmd ; $fa
setcondition: MACRO
db setcondition_cmd
db \1 ; condition
ENDM
enum jumpif_cmd ; $fb
jumpif: MACRO
db jumpif_cmd
db \1 ; condition
dw \2 ; address
ENDM
enum jumpchannel_cmd ; $fc
jumpchannel: MACRO
db jumpchannel_cmd
dw \1 ; address
ENDM
enum loopchannel_cmd ; $fd
loopchannel: MACRO
db loopchannel_cmd
db \1 ; count
dw \2 ; address
ENDM
enum callchannel_cmd ; $fe
callchannel: MACRO
db callchannel_cmd
dw \1 ; address
ENDM
enum endchannel_cmd ; $ff
endchannel: MACRO
db endchannel_cmd
ENDM
channel_count: MACRO
if !(0 < (\1) && (\1) <= NUM_MUSIC_CHANS)
fail "channel_count must be 1-{NUM_MUSIC_CHANS}"
endc
_num_channels = \1 - 1
ENDM
channel: MACRO
if !(0 < (\1) && (\1) <= NUM_CHANNELS)
fail "channel id must be 1-{NUM_CHANNELS}"
endc
dn (_num_channels << 2), \1 - 1 ; channel id
dw \2 ; address
_num_channels = 0
ENDM
stereo_panning: MACRO
db stereopanning_cmd
dn %1111 * (1 && \1), %1111 * (1 && \2) ; left enable, right enable
ENDM
note_type: MACRO
db notetype_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
volume_envelope: MACRO
db intensity_cmd
if \2 < 0
dn \1, %1000 | (\2 * -1) ; volume envelope
else
dn \1, \2 ; volume envelope
endc
ENDM
rest: MACRO
note 0, \1 ; length
ENDM
toggle_noise: MACRO
db togglenoise_cmd
if _NARG > 0
db \1 ; drum kit
endc
ENDM
drum_speed: MACRO
note_type \1 ; note_length
ENDM
drum_note: MACRO
note \1, \2 ; drum instrument, length
ENDM
transpose: MACRO
db pitchoffset_cmd
dn \1, \2 ; num octaves, num pitches
ENDM
pitch_slide: MACRO
db slidepitchto_cmd
db \1 - 1 ; duration
dn 8 - \2, \3 % 12 ; octave, pitch
ENDM
square_note: MACRO
db \1 ; length
if \3 < 0
dn \2, %1000 | (\3 * -1) ; volume envelope
else
dn \2, \3
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
duty_cycle_pattern: MACRO
db sound_duty_cmd
db (\1 << 6) | (\2 << 4) | (\3 << 2) | (\4 << 0) ; duty cycle pattern
ENDM
pitch_sweep: MACRO
db soundinput_cmd
if \2 < 0
dn \1, %1000 | (\2 * -1) ; pitch sweep
else
dn \1, \2 ; pitch sweep
endc
ENDM
sfx_toggle_noise: MACRO
db sfxtogglenoise_cmd
if _NARG > 0
db \1 ; drum kit
endc
ENDM
sound_ret EQUS "endchannel"
duty_cycle EQUS "dutycycle"
pitch_offset EQUS "tone"
sound_loop EQUS "loopchannel"
sound_call EQUS "callchannel"
sound_jump EQUS "jumpchannel"
toggle_sfx EQUS "togglesfx"
sfx_priority_on EQUS "sfxpriorityon"
sfx_priority_off EQUS "sfxpriorityoff"