Fix #910
10 KiB
Music Commands
Defined in macros/scripts/audio.asm and audio/engine.asm:MusicCommands.
Note: Commands that are intended for the song channels (1-4) can be used by the sound effect channels (5-8) if the sound effect channel exits sound effect mode with the toggle_sfx
command.
channel_count n
Used at the start of each sound header to specify how many channels are used in the sound.
n
: Number of channels [1
, 4
]
channel index, address
Used for each channel in a sound header.
index
: Channel number [1
, 8
]
address
: Pointer to the sound data
note pitch, length
Play a basic note. Used by channels 1-3.
pitch
: Pitch of note (see constants/audio_constants.asm)
length
: Length of note in "ticks" [1
, 16
]. The exact duration of a tick is dependant on the current "speed" (see note_type
and drum_speed
) and the current "tempo" (see tempo
).
drum_note instrument, length
Play a predefined drum note. Used by channel 4.
instrument
: Instrument ID [1
, 12
] (see toggle_noise
)
length
: Length of note [1
, 16
]
rest length
Basic rest. Used by channels 1-4.
length
: Length of rest [1
, 16
]
square_note length, volume, fade, frequency
Sound effect square note. Used by channels 5-7.
length
: Length of note [0
, 255
]
volume
: Initial volume [0
, 15
]
fade
: Volume fade [-7
, 7
]
frequency
: Note frequency [0
, 65535
]
noise_note length, volume, fade, frequency
Sound effect noise note. Used by channel 8.
length
: Length of note [0
, 255
]
volume
: Initial volume [0
, 15
]
fade
: Volume fade [-7
, 7
]
frequency
: Note frequency [0
, 255
]
$D0
−$D7
: octave n
Set the octave for the notes played on the current channel. Used by channels 1-3.
n
: New octave [1
, 8
]
$D8
: note_type length, volume, fade/wave_instrument
Set persistent note properties. Used by channels 1-3.
length
: Base note length [1
, 15
] (12
is often used for 4/4 common time because 12
is factorable by both 3
and 4
. Therefore it works very well for quarter notes, eighth notes, sixteenth notes, and triplets.)
volume
: Initial volume [0
, 15
] for channels 1-2, [0
, 3
] for channel 3 (see volume_envelope
)
fade
: Volume fade [-7
, 7
] (applies to channels 1-2)
wave_instrument
: Wave instrument ID (applies to channel 3) (see audio/wave_samples.asm)
$D8
: drum_speed length
Set persistent note properties. Used by channel 4.
length
: Base note length [1
, 15
] (use 12
for common time)
$D9
: transpose num_octaves, num_pitches
Transpose all notes played on the current channel. Used by channels 1-3.
num_octaves
: Number of octaves to subtract from each note
num_pitches
: Number of pitches to add to each note
$DA
: tempo tempo
Set the tempo for all playing channels. This should only be used by channel 1.
The formula to convert from this tempo to BPM is: BPM = 19200 / tempo
This formula also works backwards to convert BPM to tempo: tempo
= 19200 / BPM
Only set or change this value when all playing channels are triggering a note or rest at the same time, otherwise desyncs may happen.
$DB
: duty_cycle duty_cycle
Set the square duty (sound) for the current channel. Used by channels 1-2.
The only accepted values are 0-3.
- 0 = 12.5% waveform:
_______¯
- 1 = 25% waveform:
______¯¯
- 2 = 50% waveform:
____¯¯¯¯
- 3 = 75% waveform:
__¯¯¯¯¯¯
(sounds the same as 25%)
To change the sound for channel 3, use note_type
or volume_envelope
.
$DC
: volume_envelope volume, fade/wave_instrument
Set the volume envelope for the current channel. Used by channels 1-3.
volume
: Initial volume [0
, 15
] for channels 1-2, [0
, 3
] for channel 3
fade
: Volume fade [-7
, 7
] (applies to channels 1-2)
wave_instrument
: Wave instrument ID (applies to channel 3) (see audio/wave_samples.asm)
For channel 3, the only accepted volume
values are 0-3.
- 0 = Mute
- 1 = 100% volume
- 2 = 50% volume
- 3 = 25% volume
Note about fade
: A positive value means a decrease in volume; a negative value means an increase in volume. A small magnitude means a quick change; a large magnitude means a slow change. It is stored in signed magnitude representation, so a value of 8
is the same as (negative) 0
.
$DD
: pitch_sweep length, pitch_change
Set pitch sweep properties. Used by channel 5.
length
: Duration of effect [0
, 15
]
pitch_change
: Extent of effect [-7
, 8
] Note: 8
is used in place of 0
$DE
: duty_cycle_pattern a, b, c, d
Set duty cycle pattern (ie, pulse width modulation). Used by channels 5-6.
This cycles the channel through 4 duty cycles, one per frame.
Each argument defines a duty cycle, same as the duty_cycle
command.
$DF
: toggle_sfx
Toggle between pitch-based songs and frequency-based sound effects. Can be used by any channel.
Note: Similar to the pokered command execute_music
, however execute_music
can only be used on channels 5-8 and can not be disabled for the duration of the sound once it is enabled.
$E0
: pitch_slide duration, octave, pitch
Bend the pitch of the next note played, and only that note. Used by channel 1.
duration
: Duration of the target note after slide effect
octave
: Target octave
pitch
: Target pitch (see constants/audio_constants.asm)
$E1
: vibrato delay, extent, rate
Apply vibrato to current channel. Used by channels 1-3.
delay
: Delay until vibrato effect begins for each note [0
, 255
]
extent
: Amplitude of vibrato [0
, 15
]
rate
: Frequency of vibrato [0
, 15
]
$E2
: unknownmusic0xe2 unknown
$E3
: toggle_noise id
Set the "drum kit" to be used if it is currently unset. Mute the channel otherwise. Used by channel 4.
id
: Drum kit ID [0
, 5
] (see audio/drumkits.asm)
Note: The drum kit ID is initially unset at the start of a song. When muting the channel, the id
argument must not be present.
$E4
: force_stereo_panning left_enable, right_enable
Set left/right stereo output for the current channel, regardless of user's stereo setting. Used by channels 1-4.
left_enable
: TRUE
/FALSE
right_enable
: TRUE
/FALSE
$E5
: volume left_volume, right_volume
Set master volume for left/right speakers. Typically only used by channel 1.
left_volume
: Left speaker volume [0
, 7
]
right_volume
: Right speaker volume [0
, 7
]
Note: Minimum volume, 0
, is not muted.
$E6
: pitch_offset pitch_offset
Adjust the pitch of all notes on the current channel. Used by channels 1-3.
pitch_offset
: Frequency adjustment of each pitch
Note: Similar to the pokered command toggle_perfect_pitch
. toggle_perfect_pitch
can be replaced with a combination of pitch_offset 1
and pitch_offset 0
.
$E7
: unknownmusic0xe7 unknown
$E8
: unknownmusic0xe8 unknown
$E9
: tempo_relative value
$EA
: restart_channel address
$EB
: new_song id
$EC
: sfx_priority_on
$ED
: sfx_priority_off
$EE
: unknownmusic0xee address
$EF
: stereo_panning left_enable, right_enable
Set left/right stereo output for the current channel, if the user has stereo mode enabled. Used by channels 1-4.
left_enable
: TRUE
/FALSE
right_enable
: TRUE
/FALSE
$F0
: sfx_toggle_noise id
Set the "drum kit" to be used if it is currently unset. Mute the channel otherwise. Used by channel 8.
id
: Drum kit ID [0
, 5
] (see audio/drumkits.asm)
Note: The drum kit ID is initially unset at the start of a song. When muting the channel, the id
argument must not be present.
$F1
: music0xf1
$F2
: music0xf2
$F3
: music0xf3
$F4
: music0xf4
$F5
: music0xf5
$F6
: music0xf6
$F7
: music0xf7
$F8
: music0xf8
$F9
: unknownmusic0xf9
$FA
: set_condition condition
$FB
: sound_jump_if condition, address
$FC
: sound_jump address
$FD
: sound_loop count, address
Execute a branch of sound commands a total of count
times.
count
: Number of times to execute the loop (including the first execution) (use 0
for an infinite loop)
address
: Pointer to the start of the loop of sound commands
$FE
: sound_call address
Execute a branch of sound commands, returning to the call point once a sound_ret
command is reached.
address
: Pointer to the branch of sound commands to call
$FF
: sound_ret
Return to the caller (ie, sound_call
) if in a sub branch. End the sound otherwise.