-
Notifications
You must be signed in to change notification settings - Fork 817
Add macros to support modern audio files in legacy pokecrystal
mid-kid edited this page Jun 24, 2022
·
8 revisions
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.
To 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"