pokecrystal-board/docs/music_commands.md
2022-04-19 18:12:02 -04:00

10 KiB
Raw Blame History

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.