ref: 969b43d443090da42a4d0d73129298f6b6d69d5a
parent: 6574881cdac656d23697be57ab048c90b0969949
author: dannye <33dannye@gmail.com>
date: Sat Aug 17 10:40:34 EDT 2019
Update labels to match new audio macro names and synchronize engine_2 and engine_3 with engine_1
--- a/audio/engine_1.asm
+++ b/audio/engine_1.asm
@@ -57,25 +57,25 @@
.startChecks
ld hl, wChannelFlags1
add hl, bc
- bit BIT_ROTATE_DUTY, [hl]
+ bit BIT_ROTATE_DUTY_CYCLE, [hl]
jr z, .checkForExecuteMusic
- call Audio1_ApplyDutyCycle
+ call Audio1_ApplyDutyCyclePattern
.checkForExecuteMusic
ld b, 0
ld hl, wChannelFlags2
add hl, bc
bit BIT_EXECUTE_MUSIC, [hl]
- jr nz, .checkForPitchBend
+ jr nz, .checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
bit BIT_NOISE_OR_SFX, [hl]
- jr nz, .skipPitchBendVibrato
-.checkForPitchBend
+ jr nz, .skipPitchSlideVibrato
+.checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
- bit BIT_PITCH_BEND_ON, [hl]
+ bit BIT_PITCH_SLIDE_ON, [hl]
jr z, .checkVibratoDelay
- jp Audio1_ApplyPitchBend
+ jp Audio1_ApplyPitchSlide
.checkVibratoDelay
ld hl, wChannelVibratoDelayCounters
add hl, bc
@@ -83,7 +83,7 @@
and a ; check if delay is over
jr z, .checkForVibrato
dec [hl] ; otherwise, dec delay
-.skipPitchBendVibrato
+.skipPitchSlideVibrato
ret
.checkForVibrato
ld hl, wChannelVibratoExtents
@@ -142,7 +142,7 @@
ret
; this routine executes all music commands that take up no time,
-; like tempo changes, duty changes etc. and doesn't return
+; like tempo changes, duty cycle changes etc. and doesn't return
; until the first note is reached
Audio1_PlayNextNote:
; reload the vibrato delay counter
@@ -155,20 +155,20 @@
ld hl, wChannelFlags1
add hl, bc
- res BIT_PITCH_BEND_ON, [hl]
- res BIT_PITCH_BEND_DECREASING, [hl]
- call Audio1_endchannel
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
+ call Audio1_sound_ret
ret
-Audio1_endchannel:
+Audio1_sound_ret:
call Audio1_GetNextMusicByte
ld d, a
- cp $ff ; is this command an endchannel?
- jp nz, Audio1_callchannel ; no
+ cp $ff ; is this command a sound_ret?
+ jp nz, Audio1_sound_call ; no
ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit BIT_CHANNEL_CALL, [hl]
+ bit BIT_SOUND_CALL, [hl]
jr nz, .returnFromCall
ld a, c
cp Ch4
@@ -187,15 +187,15 @@
ld a, $80
ld [rNR30], a
.skipSfxChannel3
- jr nz, .asm_9222
+ jr nz, .dontDisable
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr z, .asm_9222
+ jr z, .dontDisable
xor a
ld [wDisableChannelOutputWhenSfxEnds], a
jr .disableChannelOutput
-.asm_9222
- jr .asm_9248
+.dontDisable
+ jr .afterDisable
.returnFromCall
res 1, [hl]
ld d, $0
@@ -215,7 +215,7 @@
inc de
ld a, [de]
ld [hl], a ; loads channel address to return to
- jp Audio1_endchannel
+ jp Audio1_sound_ret
.disableChannelOutput
ld hl, Audio1_HWChannelDisableMasks
add hl, bc
@@ -222,12 +222,12 @@
ld a, [rNR51]
and [hl]
ld [rNR51], a
-.asm_9248
+.afterDisable
ld a, [wChannelSoundIDs + Ch5]
cp CRY_SFX_START
- jr nc, .asm_9251
+ jr nc, .maybeCry
jr .skipCry
-.asm_9251
+.maybeCry
ld a, [wChannelSoundIDs + Ch5]
cp CRY_SFX_END
jr z, .skipCry
@@ -236,10 +236,10 @@
.cry
ld a, c
cp Ch5
- jr z, .asm_9265
+ jr z, .skipRewind
call Audio1_GoBackOneCommandIfCry
ret c
-.asm_9265
+.skipRewind
ld a, [wSavedVolume]
ld [rNR50], a
xor a
@@ -250,9 +250,9 @@
ld [hl], b
ret
-Audio1_callchannel:
- cp $fd ; is this command a callchannel?
- jp nz, Audio1_loopchannel ; no
+Audio1_sound_call:
+ cp $fd ; is this command a sound_call?
+ jp nz, Audio1_sound_loop ; no
call Audio1_GetNextMusicByte
push af
call Audio1_GetNextMusicByte
@@ -284,12 +284,12 @@
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- set BIT_CHANNEL_CALL, [hl] ; set the call flag
- jp Audio1_endchannel
+ set BIT_SOUND_CALL, [hl] ; set the call flag
+ jp Audio1_sound_ret
-Audio1_loopchannel:
- cp $fe ; is this command a loopchannel?
- jp nz, Audio1_notetype ; no
+Audio1_sound_loop:
+ cp $fe ; is this command a sound_loop?
+ jp nz, Audio1_note_type ; no
call Audio1_GetNextMusicByte
ld e, a
and a
@@ -304,7 +304,7 @@
ld [hl], a
call Audio1_GetNextMusicByte ; skip pointer
call Audio1_GetNextMusicByte
- jp Audio1_endchannel
+ jp Audio1_sound_ret
.loopAgain ; inc loop count
inc a
ld [hl], a
@@ -323,12 +323,12 @@
pop af
ld [hli], a
ld [hl], b
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_notetype:
+Audio1_note_type:
and $f0
- cp $d0 ; is this command a notetype?
- jp nz, Audio1_toggleperfectpitch ; no
+ cp $d0 ; is this command a note_type?
+ jp nz, Audio1_toggle_perfect_pitch ; no
ld a, d
and $f
ld b, $0
@@ -367,11 +367,11 @@
add hl, bc
ld [hl], d
.noiseChannel
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_toggleperfectpitch:
+Audio1_toggle_perfect_pitch:
ld a, d
- cp $e8 ; is this command a toggleperfectpitch?
+ cp $e8 ; is this command a toggle_perfect_pitch?
jr nz, Audio1_vibrato ; no
ld b, 0
ld hl, wChannelFlags1
@@ -379,11 +379,11 @@
ld a, [hl]
xor $1
ld [hl], a ; flip bit 0 of wChannelFlags1
- jp Audio1_endchannel
+ jp Audio1_sound_ret
Audio1_vibrato:
cp $ea ; is this command a vibrato?
- jr nz, Audio1_pitchbend ; no
+ jr nz, Audio1_pitch_slide ; no
call Audio1_GetNextMusicByte
ld b, 0
ld hl, wChannelVibratoDelayCounters
@@ -427,14 +427,14 @@
or d
ld [hl], a
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_pitchbend:
- cp $eb ; is this command a pitchbend?
- jr nz, Audio1_duty ; no
+Audio1_pitch_slide:
+ cp $eb ; is this command a pitch_slide?
+ jr nz, Audio1_duty_cycle ; no
call Audio1_GetNextMusicByte
ld b, 0
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
ld [hl], a
call Audio1_GetNextMusicByte
@@ -446,22 +446,22 @@
and $f
call Audio1_CalculateFrequency
ld b, 0
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld [hl], d
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld [hl], e
ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set BIT_PITCH_BEND_ON, [hl]
+ set BIT_PITCH_SLIDE_ON, [hl]
call Audio1_GetNextMusicByte
ld d, a
- jp Audio1_notelength
+ jp Audio1_note_length
-Audio1_duty:
- cp $ec ; is this command a duty?
+Audio1_duty_cycle:
+ cp $ec ; is this command a duty_cycle?
jr nz, Audio1_tempo ; no
call Audio1_GetNextMusicByte
rrca
@@ -468,14 +468,14 @@
rrca
and $c0
ld b, 0
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store duty
- jp Audio1_endchannel
+ ld [hl], a ; store duty cycle
+ jp Audio1_sound_ret
Audio1_tempo:
cp $ed ; is this command a tempo?
- jr nz, Audio1_stereopanning ; no
+ jr nz, Audio1_stereo_panning ; no
ld a, c
cp Ch5
jr nc, .sfxChannel
@@ -500,19 +500,19 @@
ld [wChannelNoteDelayCountersFractionalPart + 6], a
ld [wChannelNoteDelayCountersFractionalPart + 7], a
.musicChannelDone
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_stereopanning:
- cp $ee ; is this command a stereopanning?
+Audio1_stereo_panning:
+ cp $ee ; is this command a stereo_panning?
jr nz, Audio1_unknownmusic0xef ; no
call Audio1_GetNextMusicByte
ld [wStereoPanning], a ; store panning
- jp Audio1_endchannel
+ jp Audio1_sound_ret
; this appears to never be used
Audio1_unknownmusic0xef:
cp $ef ; is this command an unknownmusic0xef?
- jr nz, Audio1_dutycycle ; no
+ jr nz, Audio1_duty_cycle_pattern ; no
call Audio1_GetNextMusicByte
push bc
call Audio1_PlaySound
@@ -525,45 +525,45 @@
xor a
ld [wChannelSoundIDs + Ch8], a
.skip
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_dutycycle:
- cp $fc ; is this command a dutycycle?
+Audio1_duty_cycle_pattern:
+ cp $fc ; is this command a duty_cycle_pattern?
jr nz, Audio1_volume ; no
call Audio1_GetNextMusicByte
ld b, 0
+ ld hl, wChannelDutyCyclePatterns
+ add hl, bc
+ ld [hl], a ; store full pattern
+ and %11000000
ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store full cycle
- and $c0
- ld hl, wChannelDuties
- add hl, bc
- ld [hl], a ; store first duty
+ ld [hl], a ; store first duty cycle
ld hl, wChannelFlags1
add hl, bc
- set BIT_ROTATE_DUTY, [hl]
- jp Audio1_endchannel
+ set BIT_ROTATE_DUTY_CYCLE, [hl]
+ jp Audio1_sound_ret
Audio1_volume:
cp $f0 ; is this command a volume?
- jr nz, Audio1_executemusic ; no
+ jr nz, Audio1_execute_music ; no
call Audio1_GetNextMusicByte
ld [rNR50], a ; store volume
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-Audio1_executemusic:
- cp $f8 ; is this command an executemusic?
+Audio1_execute_music:
+ cp $f8 ; is this command an execute_music?
jr nz, Audio1_octave ; no
ld b, $0
ld hl, wChannelFlags2
add hl, bc
set BIT_EXECUTE_MUSIC, [hl]
- jp Audio1_endchannel
+ jp Audio1_sound_ret
Audio1_octave:
and $f0
cp $e0 ; is this command an octave?
- jr nz, Audio1_sfxnote ; no
+ jr nz, Audio1_sfx_note ; no
ld hl, wChannelOctaves
ld b, 0
add hl, bc
@@ -570,27 +570,27 @@
ld a, d
and $f
ld [hl], a ; store low nibble as octave
- jp Audio1_endchannel
+ jp Audio1_sound_ret
-; sfxnote is either squarenote or noisenote depending on the channel
-Audio1_sfxnote:
- cp $20 ; is this command a sfxnote?
- jr nz, Audio1_pitchenvelope
+; sfx_note is either square_note or noise_note depending on the channel
+Audio1_sfx_note:
+ cp $20 ; is this command a sfx_note?
+ jr nz, Audio1_pitch_sweep
ld a, c
cp Ch4 ; is this a noise or sfx channel?
- jr c, Audio1_pitchenvelope ; no
+ jr c, Audio1_pitch_sweep ; no
ld b, 0
ld hl, wChannelFlags2
add hl, bc
- bit BIT_EXECUTE_MUSIC, [hl] ; is executemusic being used?
- jr nz, Audio1_pitchenvelope ; yes
- call Audio1_notelength
+ bit BIT_EXECUTE_MUSIC, [hl] ; is execute_music being used?
+ jr nz, Audio1_pitch_sweep ; yes
+ call Audio1_note_length
-; This code seems to do the same thing as what Audio1_ApplyDutyAndSoundLength
+; This code seems to do the same thing as what Audio1_ApplyDutyCycleAndSoundLength
; does below.
ld d, a
ld b, 0
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
@@ -619,18 +619,18 @@
.skip
ld d, a
push de
- call Audio1_ApplyDutyAndSoundLength
+ call Audio1_ApplyDutyCycleAndSoundLength
call Audio1_EnableChannelOutput
pop de
call Audio1_ApplyWavePatternAndFrequency
ret
-Audio1_pitchenvelope:
+Audio1_pitch_sweep:
ld a, c
cp Ch5
jr c, Audio1_note ; if not a sfx
ld a, d
- cp $10 ; is this command a pitchenvelope?
+ cp $10 ; is this command a pitch_sweep?
jr nz, Audio1_note ; no
ld b, $0
ld hl, wChannelFlags2
@@ -639,17 +639,27 @@
jr nz, Audio1_note ; no
call Audio1_GetNextMusicByte
ld [rNR10], a
- jp Audio1_endchannel
+ jp Audio1_sound_ret
Audio1_note:
ld a, c
cp Ch4
- jr nz, Audio1_notelength ; if not noise channel
+ jr nz, Audio1_note_length ; if not noise channel
ld a, d
and $f0
cp $b0 ; is this command a dnote?
- jr z, Audio1_dnote
- jr nc, Audio1_notelength ; no
+ jr z, .dnote
+ jr nc, Audio1_note_length ; no
+
+ ; this executes when on the noise channel and
+ ; the command id is less than $b0
+ ; in this case, the upper nybble is used as the noise instrument ($1-$a)
+ ; and the lower nybble is the length minus 1 (0-15)
+ ; however, this doesn't work for instrument #2 because the command id
+ ; is captured by the noise_note command (command id $2x)
+ ; this essentially acts like a dnote command that is only 1 byte
+ ; instead of 2 and can only be used with instruments 1 and 3 through 10
+ ; this is unused by the game
swap a
ld b, a
ld a, d
@@ -658,26 +668,26 @@
ld a, b
push de
push bc
- jr asm_94fd
+ jr .playDnote
-Audio1_dnote:
+.dnote
ld a, d
and $f
push af
push bc
call Audio1_GetNextMusicByte ; get dnote instrument
-asm_94fd
+.playDnote
ld d, a
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr nz, .asm_9508
+ jr nz, .skipDnote
ld a, d
call Audio1_PlaySound
-.asm_9508
+.skipDnote
pop bc
pop de
-Audio1_notelength:
+Audio1_note_length:
ld a, d
push af
and $f
@@ -727,15 +737,15 @@
ld hl, wChannelFlags2
add hl, bc
bit BIT_EXECUTE_MUSIC, [hl]
- jr nz, Audio1_notepitch
+ jr nz, Audio1_note_pitch
ld hl, wChannelFlags1
add hl, bc
bit BIT_NOISE_OR_SFX, [hl]
- jr z, Audio1_notepitch
+ jr z, Audio1_note_pitch
pop hl
ret
-Audio1_notepitch:
+Audio1_note_pitch:
pop af
and $f0
cp $c0 ; compare to rest
@@ -784,10 +794,10 @@
ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit BIT_PITCH_BEND_ON, [hl]
- jr z, .skipPitchBend
- call Audio1_InitPitchBendVars
-.skipPitchBend
+ bit BIT_PITCH_SLIDE_ON, [hl]
+ jr z, .skipPitchSlide
+ call Audio1_InitPitchSlideVars
+.skipPitchSlide
push de
ld a, c
cp Ch5
@@ -812,13 +822,13 @@
ld b, REG_VOLUME_ENVELOPE
call Audio1_GetRegisterPointer
ld [hl], d
- call Audio1_ApplyDutyAndSoundLength
+ call Audio1_ApplyDutyCycleAndSoundLength
call Audio1_EnableChannelOutput
pop de
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- bit BIT_PERFECT_PITCH, [hl] ; has toggleperfectpitch been used?
+ bit BIT_PERFECT_PITCH, [hl] ; has toggle_perfect_pitch been used?
jr z, .skipFrequencyInc
inc e ; if yes, increment the frequency by 1
jr nc, .skipFrequencyInc
@@ -867,7 +877,7 @@
ld [rNR51], a
ret
-Audio1_ApplyDutyAndSoundLength:
+Audio1_ApplyDutyCycleAndSoundLength:
ld b, 0
ld hl, wChannelNoteDelayCounters ; use the note delay as sound length
add hl, bc
@@ -877,11 +887,11 @@
jr z, .skipDuty ; if music channel 3
cp Ch7
jr z, .skipDuty ; if sfx channel 3
-; include duty (except on channel 3 which doesn't have it)
+; include duty cycle (except on channel 3 which doesn't have it)
ld a, d
and $3f
ld d, a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
@@ -1022,19 +1032,19 @@
scf
ret
-Audio1_ApplyPitchBend:
+Audio1_ApplyPitchSlide:
ld hl, wChannelFlags1
add hl, bc
- bit BIT_PITCH_BEND_DECREASING, [hl]
+ bit BIT_PITCH_SLIDE_DECREASING, [hl]
jp nz, .frequencyDecreasing
; frequency increasing
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld l, [hl]
ld h, b
@@ -1041,10 +1051,10 @@
add hl, de
ld d, h
ld e, l
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
push hl
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
pop hl
@@ -1056,13 +1066,13 @@
ld a, 0
adc d
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
cp d
jp c, .reachedTargetFrequency
jr nz, .applyUpdatedFrequency
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
cp e
@@ -1069,13 +1079,13 @@
jp c, .reachedTargetFrequency
jr .applyUpdatedFrequency
.frequencyDecreasing
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld e, [hl]
sub e
@@ -1083,7 +1093,7 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
add a
@@ -1094,22 +1104,22 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, d
cp [hl]
jr c, .reachedTargetFrequency
jr nz, .applyUpdatedFrequency
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
cp [hl]
jr c, .reachedTargetFrequency
.applyUpdatedFrequency
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
ld b, REG_FREQUENCY_LO
@@ -1119,24 +1129,24 @@
ld [hl], d
ret
.reachedTargetFrequency
-; Turn off pitch bend when the target frequency has been reached.
+; Turn off pitch slide when the target frequency has been reached.
ld hl, wChannelFlags1
add hl, bc
- res BIT_PITCH_BEND_ON, [hl]
- res BIT_PITCH_BEND_DECREASING, [hl]
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
ret
-Audio1_InitPitchBendVars:
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+Audio1_InitPitchSlideVars:
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
ld hl, wChannelNoteDelayCounters
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
sub [hl]
jr nc, .next
@@ -1143,7 +1153,7 @@
ld a, 1
.next
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
sub [hl]
@@ -1150,7 +1160,7 @@
ld e, a
ld a, d
sbc b
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
sub [hl]
jr c, .targetFrequencyGreater
@@ -1158,18 +1168,18 @@
ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set BIT_PITCH_BEND_DECREASING, [hl]
+ set BIT_PITCH_SLIDE_DECREASING, [hl]
jr .next2
.targetFrequencyGreater
; If the target frequency is greater, subtract the current frequency from
; the target frequency to get the absolute difference.
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
sub e
@@ -1184,7 +1194,7 @@
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
sub d
@@ -1192,10 +1202,10 @@
ld b, 0
ld hl, wChannelFlags1
add hl, bc
- res BIT_PITCH_BEND_DECREASING, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
.next2
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
.divideLoop
inc b
@@ -1214,20 +1224,20 @@
add [hl]
ld d, b ; d = quotient + 1
ld b, 0
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld [hl], d ; store quotient + 1
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld [hl], a ; store remainder - dividend
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
ld [hl], a ; store remainder - dividend
ret
-Audio1_ApplyDutyCycle:
+Audio1_ApplyDutyCyclePattern:
ld b, 0
- ld hl, wChannelDutyCycles
+ ld hl, wChannelDutyCyclePatterns
add hl, bc
ld a, [hl]
rlca
@@ -1322,7 +1332,7 @@
ld [wSoundID], a
cp $ff
jp z, .stopAllAudio
- cp MAX_SFX_ID
+ cp MAX_SFX_ID_1
jp z, .playSfx
jp c, .playSfx
cp $fe
@@ -1346,10 +1356,10 @@
call .FillMem
ld hl, wChannelFlags1
call .FillMem
- ld hl, wChannelDuties
- call .FillMem
ld hl, wChannelDutyCycles
call .FillMem
+ ld hl, wChannelDutyCyclePatterns
+ call .FillMem
ld hl, wChannelVibratoDelayCounters
call .FillMem
ld hl, wChannelVibratoExtents
@@ -1362,21 +1372,21 @@
call .FillMem
ld hl, wChannelFlags2
call .FillMem
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
call .FillMem
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
call .FillMem
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
call .FillMem
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
call .FillMem
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
call .FillMem
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
call .FillMem
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
call .FillMem
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
call .FillMem
ld a, $1
ld hl, wChannelLoopCounters
@@ -1441,26 +1451,26 @@
add hl, de
ld a, [hl]
and a
- jr z, .asm_99a3
+ jr z, .playChannel
ld a, e
- cp $7
- jr nz, .asm_999a
+ cp Ch8
+ jr nz, .notNoiseChannel
ld a, [wSoundID]
- cp $14
- jr nc, .asm_9993
+ cp NOISE_INSTRUMENTS_END
+ jr nc, .notNoiseInstrument
ret
-.asm_9993
+.notNoiseInstrument
ld a, [hl]
- cp $14
- jr z, .asm_99a3
- jr c, .asm_99a3
-.asm_999a
+ cp NOISE_INSTRUMENTS_END
+ jr z, .playChannel
+ jr c, .playChannel
+.notNoiseChannel
ld a, [wSoundID]
cp [hl]
- jr z, .asm_99a3
- jr c, .asm_99a3
+ jr z, .playChannel
+ jr c, .playChannel
ret
-.asm_99a3
+.playChannel
xor a
push de
ld h, d
@@ -1483,10 +1493,10 @@
ld hl, wChannelFlags1
add hl, de
ld [hl], a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, de
ld [hl], a
- ld hl, wChannelDutyCycles
+ ld hl, wChannelDutyCyclePatterns
add hl, de
ld [hl], a
ld hl, wChannelVibratoDelayCounters
@@ -1504,28 +1514,28 @@
ld hl, wChannelVibratoDelayCounterReloadValues
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, de
ld [hl], a
ld hl, wChannelFlags2
@@ -1543,10 +1553,10 @@
ld [hl], a
ld a, e
cp Ch5
- jr nz, .asm_9a2b
+ jr nz, .skipSweepDisable
ld a, $8
ld [rNR10], a ; sweep off
-.asm_9a2b
+.skipSweepDisable
ld a, c
and a
jp z, .playSoundCommon
@@ -1667,9 +1677,9 @@
jr nz, .commandPointerLoop
ld a, [wSoundID]
cp CRY_SFX_START
- jr nc, .asm_9aeb
+ jr nc, .maybeCry
jr .done
-.asm_9aeb
+.maybeCry
ld a, [wSoundID]
cp CRY_SFX_END
jr z, .done
@@ -1682,10 +1692,10 @@
ld [hli], a
ld [hl], a
ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
- ld de, Audio1_CryEndchannel
+ ld de, Audio1_CryRet
ld [hl], e
inc hl
- ld [hl], d ; overwrite pointer to point to endchannel
+ ld [hl], d ; overwrite pointer to point to sound_ret
ld a, [wSavedVolume]
and a
jr nz, .done
@@ -1696,7 +1706,7 @@
.done
ret
-Audio1_CryEndchannel:
+Audio1_CryRet:
sound_ret
Audio1_HWChannelBaseAddresses:
@@ -1725,5 +1735,3 @@
dw $FB58 ; A_
dw $FB9B ; A#
dw $FBDA ; B_
-
-
--- a/audio/engine_2.asm
+++ b/audio/engine_2.asm
@@ -1,9 +1,11 @@
; The second of three duplicated sound engines.
+; This copy has a few differences relating to battle sound effects
+; and the low health alarm that plays in battle
Audio2_UpdateMusic::
ld c, Ch1
.loop
- ld b, $0
+ ld b, 0
ld hl, wChannelSoundIDs
add hl, bc
ld a, [hl]
@@ -19,7 +21,7 @@
jr nz, .nextChannel
set 7, a
ld [wMuteAudioAndPauseMusic], a
- xor a
+ xor a ; disable all channels' output
ld [rNR51], a
ld [rNR30], a
ld a, $80
@@ -29,7 +31,7 @@
call Audio2_ApplyMusicAffects
.nextChannel
ld a, c
- inc c
+ inc c ; inc channel number
cp Ch8
jr nz, .loop
ret
@@ -36,12 +38,6 @@
; this routine checks flags for music effects currently applied
; to the channel and calls certain functions based on flags.
-; known flags for wChannelFlags1:
-; 0: toggleperfectpitch has been used
-; 1: call has been used
-; 3: a toggle used only by this routine for vibrato
-; 4: pitchbend flag
-; 6: dutycycle flag
Audio2_ApplyMusicAffects:
ld b, $0
ld hl, wChannelNoteDelayCounters ; delay until next note
@@ -63,36 +59,36 @@
.startChecks
ld hl, wChannelFlags1
add hl, bc
- bit 6, [hl] ; dutycycle
+ bit BIT_ROTATE_DUTY_CYCLE, [hl]
jr z, .checkForExecuteMusic
- call Audio2_ApplyDutyCycle
+ call Audio2_ApplyDutyCyclePattern
.checkForExecuteMusic
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, .checkForPitchBend
+ bit BIT_EXECUTE_MUSIC, [hl]
+ jr nz, .checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
- bit 2, [hl]
- jr nz, .disablePitchBendVibrato
-.checkForPitchBend
+ bit BIT_NOISE_OR_SFX, [hl]
+ jr nz, .skipPitchSlideVibrato
+.checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
- bit 4, [hl] ; pitchbend
+ bit BIT_PITCH_SLIDE_ON, [hl]
jr z, .checkVibratoDelay
- jp Audio2_ApplyPitchBend
+ jp Audio2_ApplyPitchSlide
.checkVibratoDelay
- ld hl, wChannelVibratoDelayCounters ; vibrato delay
+ ld hl, wChannelVibratoDelayCounters
add hl, bc
ld a, [hl]
and a ; check if delay is over
jr z, .checkForVibrato
dec [hl] ; otherwise, dec delay
-.disablePitchBendVibrato
+.skipPitchSlideVibrato
ret
.checkForVibrato
- ld hl, wChannelVibratoExtents ; vibrato rate
+ ld hl, wChannelVibratoExtents
add hl, bc
ld a, [hl]
and a
@@ -105,22 +101,24 @@
ld a, [hl]
and $f
and a
- jr z, .vibratoAlreadyDone
- dec [hl] ; apply vibrato pitch change
+ jr z, .applyVibrato
+ dec [hl] ; decrement counter
ret
-.vibratoAlreadyDone
+.applyVibrato
ld a, [hl]
swap [hl]
or [hl]
- ld [hl], a ; reset the vibrato value and start again
+ ld [hl], a ; reload the counter
ld hl, wChannelFrequencyLowBytes
add hl, bc
ld e, [hl] ; get note pitch
ld hl, wChannelFlags1
add hl, bc
- bit 3, [hl] ; this is the only code that sets/resets bit three so
- jr z, .unset ; it continuously alternates which path it takes
- res 3, [hl]
+; This is the only code that sets/resets the vibrato direction bit, so it
+; continuously alternates which path it takes.
+ bit BIT_VIBRATO_DIRECTION, [hl]
+ jr z, .unset
+ res BIT_VIBRATO_DIRECTION, [hl]
ld a, d
and $f
ld d, a
@@ -127,11 +125,11 @@
ld a, e
sub d
jr nc, .noCarry
- ld a, $0
+ ld a, 0
.noCarry
jr .done
.unset
- set 3, [hl]
+ set BIT_VIBRATO_DIRECTION, [hl]
ld a, d
and $f0
swap a
@@ -140,15 +138,16 @@
ld a, $ff
.done
ld d, a
- ld b, $3
- call Audio2_21ff7
+ ld b, REG_FREQUENCY_LO
+ call Audio2_GetRegisterPointer
ld [hl], d
ret
; this routine executes all music commands that take up no time,
-; like tempo changes, duty changes etc. and doesn't return
+; like tempo changes, duty cycle changes etc. and doesn't return
; until the first note is reached
Audio2_PlayNextNote:
+; reload the vibrato delay counter
ld hl, wChannelVibratoDelayCounterReloadValues
add hl, bc
ld a, [hl]
@@ -155,55 +154,59 @@
ld hl, wChannelVibratoDelayCounters
add hl, bc
ld [hl], a
+
ld hl, wChannelFlags1
add hl, bc
- res 4, [hl]
- res 5, [hl]
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
+ ; --- this section is only present in this copy of the sound engine
ld a, c
cp Ch5
jr nz, .beginChecks
- ld a, [wLowHealthAlarm] ;low health alarm enabled?
+ ld a, [wLowHealthAlarm] ; low health alarm enabled?
bit 7, a
ret nz
.beginChecks
- call Audio2_endchannel
+ ; ---
+ call Audio2_sound_ret
ret
-Audio2_endchannel:
+Audio2_sound_ret:
call Audio2_GetNextMusicByte
ld d, a
- cp $ff ; is this command an endchannel?
- jp nz, Audio2_callchannel ; no
- ld b, $0 ; yes
+ cp $ff ; is this command a sound_ret?
+ jp nz, Audio2_sound_call ; no
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit 1, [hl]
+ bit BIT_SOUND_CALL, [hl]
jr nz, .returnFromCall
ld a, c
cp Ch4
jr nc, .noiseOrSfxChannel
- jr .asm_219c0
+ jr .disableChannelOutput
.noiseOrSfxChannel
- res 2, [hl]
+ res BIT_NOISE_OR_SFX, [hl]
ld hl, wChannelFlags2
add hl, bc
- res 0, [hl]
+ res BIT_EXECUTE_MUSIC, [hl]
cp Ch7
- jr nz, .notSfxChannel3
+ jr nz, .skipSfxChannel3
+; restart hardware channel 3 (wave channel) output
ld a, $0
ld [rNR30], a
ld a, $80
ld [rNR30], a
-.notSfxChannel3
- jr nz, .asm_219a3
+.skipSfxChannel3
+ jr nz, .dontDisable
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr z, .asm_219a3
+ jr z, .dontDisable
xor a
ld [wDisableChannelOutputWhenSfxEnds], a
- jr .asm_219c0
-.asm_219a3
- jr .asm_219c9
+ jr .disableChannelOutput
+.dontDisable
+ jr .afterDisable
.returnFromCall
res 1, [hl]
ld d, $0
@@ -223,45 +226,45 @@
inc de
ld a, [de]
ld [hl], a ; loads channel address to return to
- jp Audio2_endchannel
-.asm_219c0
- ld hl, Unknown_222de
+ jp Audio2_sound_ret
+.disableChannelOutput
+ ld hl, Audio2_HWChannelDisableMasks
add hl, bc
ld a, [rNR51]
and [hl]
ld [rNR51], a
-.asm_219c9
+.afterDisable
ld a, [wChannelSoundIDs + Ch5]
- cp $14
- jr nc, .asm_219d2
- jr .asm_219ef
-.asm_219d2
+ cp CRY_SFX_START
+ jr nc, .maybeCry
+ jr .skipCry
+.maybeCry
ld a, [wChannelSoundIDs + Ch5]
- cp $86
- jr z, .asm_219ef
- jr c, .asm_219dd
- jr .asm_219ef
-.asm_219dd
+ cp CRY_SFX_END
+ jr z, .skipCry
+ jr c, .cry
+ jr .skipCry
+.cry
ld a, c
cp Ch5
- jr z, .asm_219e6
- call Audio2_21e6d
+ jr z, .skipRewind
+ call Audio2_GoBackOneCommandIfCry
ret c
-.asm_219e6
+.skipRewind
ld a, [wSavedVolume]
ld [rNR50], a
xor a
ld [wSavedVolume], a
-.asm_219ef
+.skipCry
ld hl, wChannelSoundIDs
add hl, bc
ld [hl], b
ret
-Audio2_callchannel:
- cp $fd ; is this command a callchannel?
- jp nz, Audio2_loopchannel ; no
- call Audio2_GetNextMusicByte ; yes
+Audio2_sound_call:
+ cp $fd ; is this command a sound_call?
+ jp nz, Audio2_sound_loop ; no
+ call Audio2_GetNextMusicByte
push af
call Audio2_GetNextMusicByte
ld d, a
@@ -292,17 +295,17 @@
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- set 1, [hl] ; set the call flag
- jp Audio2_endchannel
+ set BIT_SOUND_CALL, [hl] ; set the call flag
+ jp Audio2_sound_ret
-Audio2_loopchannel:
- cp $fe ; is this command a loopchannel?
- jp nz, Audio2_notetype ; no
- call Audio2_GetNextMusicByte ; yes
+Audio2_sound_loop:
+ cp $fe ; is this command a sound_loop?
+ jp nz, Audio2_note_type ; no
+ call Audio2_GetNextMusicByte
ld e, a
and a
jr z, .infiniteLoop
- ld b, $0
+ ld b, 0
ld hl, wChannelLoopCounters
add hl, bc
ld a, [hl]
@@ -312,7 +315,7 @@
ld [hl], a
call Audio2_GetNextMusicByte ; skip pointer
call Audio2_GetNextMusicByte
- jp Audio2_endchannel
+ jp Audio2_sound_ret
.loopAgain ; inc loop count
inc a
ld [hl], a
@@ -331,13 +334,13 @@
pop af
ld [hli], a
ld [hl], b
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-Audio2_notetype:
+Audio2_note_type:
and $f0
- cp $d0 ; is this command a notetype?
- jp nz, Audio2_toggleperfectpitch ; no
- ld a, d ; yes
+ cp $d0 ; is this command a note_type?
+ jp nz, Audio2_toggle_perfect_pitch ; no
+ ld a, d
and $f
ld b, $0
ld hl, wChannelNoteSpeeds
@@ -352,15 +355,15 @@
cp Ch3
jr z, .musicChannel3
cp Ch7
- jr nz, .notChannel3
+ jr nz, .skipChannel3
ld hl, wSfxWaveInstrument
- jr .sfxChannel3
+ jr .channel3
.musicChannel3
ld hl, wMusicWaveInstrument
-.sfxChannel3
+.channel3
ld a, d
and $f
- ld [hl], a ; store low nibble of param as duty
+ ld [hl], a ; store low nibble of param as wave instrument
ld a, d
and $30
sla a
@@ -369,31 +372,31 @@
; if channel 3, store high nibble as volume
; else, store volume (high nibble) and fade (low nibble)
-.notChannel3
- ld b, $0
+.skipChannel3
+ ld b, 0
ld hl, wChannelVolumes
add hl, bc
ld [hl], d
.noiseChannel
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-Audio2_toggleperfectpitch:
+Audio2_toggle_perfect_pitch:
ld a, d
- cp $e8 ; is this command a toggleperfectpitch?
+ cp $e8 ; is this command a toggle_perfect_pitch?
jr nz, Audio2_vibrato ; no
- ld b, $0 ; yes
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
ld a, [hl]
xor $1
ld [hl], a ; flip bit 0 of wChannelFlags1
- jp Audio2_endchannel
+ jp Audio2_sound_ret
Audio2_vibrato:
cp $ea ; is this command a vibrato?
- jr nz, Audio2_pitchbend ; no
- call Audio2_GetNextMusicByte ; yes
- ld b, $0
+ jr nz, Audio2_pitch_slide ; no
+ call Audio2_GetNextMusicByte
+ ld b, 0
ld hl, wChannelVibratoDelayCounters
add hl, bc
ld [hl], a ; store delay
@@ -402,9 +405,16 @@
ld [hl], a ; store delay
call Audio2_GetNextMusicByte
ld d, a
+
+; The high nybble of the command byte is the extent of the vibrato.
+; Let n be the extent.
+; The upper nybble of the channel's byte in the wChannelVibratoExtents
+; array will store the extent above the note: (n / 2) + (n % 2).
+; The lower nybble will store the extent below the note: (n / 2).
+; These two values add to the total extent, n.
and $f0
swap a
- ld b, $0
+ ld b, 0
ld hl, wChannelVibratoExtents
add hl, bc
srl a
@@ -412,7 +422,13 @@
adc b
swap a
or e
- ld [hl], a ; store rate as both high and low nibbles
+ ld [hl], a
+
+; The low nybble of the command byte is the rate of the vibrato.
+; The high and low nybbles of the channel's byte in the wChannelVibratoRates
+; array are both initialised to this value because the high nybble is the
+; counter reload value and the low nybble is the counter itself, which should
+; start at its value upon reload.
ld a, d
and $f
ld d, a
@@ -420,17 +436,18 @@
add hl, bc
swap a
or d
- ld [hl], a ; store depth as both high and low nibbles
- jp Audio2_endchannel
+ ld [hl], a
-Audio2_pitchbend:
- cp $eb ; is this command a pitchbend?
- jr nz, Audio2_duty ; no
- call Audio2_GetNextMusicByte ; yes
- ld b, $0
- ld hl, wChannelPitchBendLengthModifiers
+ jp Audio2_sound_ret
+
+Audio2_pitch_slide:
+ cp $eb ; is this command a pitch_slide?
+ jr nz, Audio2_duty_cycle ; no
+ call Audio2_GetNextMusicByte
+ ld b, 0
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
- ld [hl], a ; store first param
+ ld [hl], a
call Audio2_GetNextMusicByte
ld d, a
and $f0
@@ -438,39 +455,39 @@
ld b, a
ld a, d
and $f
- call Audio2_22017
- ld b, $0
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ call Audio2_CalculateFrequency
+ ld b, 0
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
- ld [hl], d ; store unknown part of second param
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld [hl], d
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
- ld [hl], e ; store unknown part of second param
- ld b, $0
+ ld [hl], e
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set 4, [hl] ; set pitchbend flag
+ set BIT_PITCH_SLIDE_ON, [hl]
call Audio2_GetNextMusicByte
ld d, a
- jp Audio2_notelength
+ jp Audio2_note_length
-Audio2_duty:
- cp $ec ; is this command a duty?
+Audio2_duty_cycle:
+ cp $ec ; is this command a duty_cycle?
jr nz, Audio2_tempo ; no
- call Audio2_GetNextMusicByte ; yes
+ call Audio2_GetNextMusicByte
rrca
rrca
and $c0
- ld b, $0
- ld hl, wChannelDuties
+ ld b, 0
+ ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store duty
- jp Audio2_endchannel
+ ld [hl], a ; store duty cycle
+ jp Audio2_sound_ret
Audio2_tempo:
cp $ed ; is this command a tempo?
- jr nz, Audio2_stereopanning ; no
- ld a, c ; yes
+ jr nz, Audio2_stereo_panning ; no
+ ld a, c
cp Ch5
jr nc, .sfxChannel
call Audio2_GetNextMusicByte
@@ -494,20 +511,20 @@
ld [wChannelNoteDelayCountersFractionalPart + 6], a
ld [wChannelNoteDelayCountersFractionalPart + 7], a
.musicChannelDone
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-Audio2_stereopanning:
- cp $ee ; is this command a stereopanning?
+Audio2_stereo_panning:
+ cp $ee ; is this command a stereo_panning?
jr nz, Audio2_unknownmusic0xef ; no
- call Audio2_GetNextMusicByte ; yes
+ call Audio2_GetNextMusicByte
ld [wStereoPanning], a ; store panning
- jp Audio2_endchannel
+ jp Audio2_sound_ret
; this appears to never be used
Audio2_unknownmusic0xef:
cp $ef ; is this command an unknownmusic0xef?
- jr nz, Audio2_dutycycle ; no
- call Audio2_GetNextMusicByte ; yes
+ jr nz, Audio2_duty_cycle_pattern ; no
+ call Audio2_GetNextMusicByte
push bc
call Audio2_PlaySound
pop bc
@@ -519,124 +536,141 @@
xor a
ld [wChannelSoundIDs + Ch8], a
.skip
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-Audio2_dutycycle:
- cp $fc ; is this command a dutycycle?
+Audio2_duty_cycle_pattern:
+ cp $fc ; is this command a duty_cycle_pattern?
jr nz, Audio2_volume ; no
- call Audio2_GetNextMusicByte ; yes
- ld b, $0
+ call Audio2_GetNextMusicByte
+ ld b, 0
+ ld hl, wChannelDutyCyclePatterns
+ add hl, bc
+ ld [hl], a ; store full pattern
+ and %11000000
ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store full cycle
- and $c0
- ld hl, wChannelDuties
- add hl, bc
- ld [hl], a ; store first duty
+ ld [hl], a ; store first duty cycle
ld hl, wChannelFlags1
add hl, bc
- set 6, [hl] ; set dutycycle flag
- jp Audio2_endchannel
+ set BIT_ROTATE_DUTY_CYCLE, [hl]
+ jp Audio2_sound_ret
Audio2_volume:
cp $f0 ; is this command a volume?
- jr nz, Audio2_executemusic ; no
- call Audio2_GetNextMusicByte ; yes
+ jr nz, Audio2_execute_music ; no
+ call Audio2_GetNextMusicByte
ld [rNR50], a ; store volume
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-Audio2_executemusic:
- cp $f8 ; is this command an executemusic?
+Audio2_execute_music:
+ cp $f8 ; is this command an execute_music?
jr nz, Audio2_octave ; no
- ld b, $0 ; yes
+ ld b, $0
ld hl, wChannelFlags2
add hl, bc
- set 0, [hl]
- jp Audio2_endchannel
+ set BIT_EXECUTE_MUSIC, [hl]
+ jp Audio2_sound_ret
Audio2_octave:
and $f0
cp $e0 ; is this command an octave?
- jr nz, Audio2_sfxnote ; no
- ld hl, wChannelOctaves ; yes
- ld b, $0
+ jr nz, Audio2_sfx_note ; no
+ ld hl, wChannelOctaves
+ ld b, 0
add hl, bc
ld a, d
and $f
ld [hl], a ; store low nibble as octave
- jp Audio2_endchannel
+ jp Audio2_sound_ret
-; sfxnote is either squarenote or noisenote depending on the channel
-Audio2_sfxnote:
- cp $20 ; is this command an sfxnote?
- jr nz, Audio2_pitchenvelope ; no
+; sfx_note is either square_note or noise_note depending on the channel
+Audio2_sfx_note:
+ cp $20 ; is this command a sfx_note?
+ jr nz, Audio2_pitch_sweep
ld a, c
cp Ch4 ; is this a noise or sfx channel?
- jr c, Audio2_pitchenvelope ; no
- ld b, $0
+ jr c, Audio2_pitch_sweep ; no
+ ld b, 0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, Audio2_pitchenvelope ; no
- call Audio2_notelength
+ bit BIT_EXECUTE_MUSIC, [hl] ; is execute_music being used?
+ jr nz, Audio2_pitch_sweep ; yes
+ call Audio2_note_length
+
+; This code seems to do the same thing as what Audio2_ApplyDutyCycleAndSoundLength
+; does below.
ld d, a
- ld b, $0
- ld hl, wChannelDuties
+ ld b, 0
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
ld d, a
- ld b, $1
- call Audio2_21ff7
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio2_GetRegisterPointer
ld [hl], d
+
call Audio2_GetNextMusicByte
ld d, a
- ld b, $2
- call Audio2_21ff7
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio2_GetRegisterPointer
ld [hl], d
call Audio2_GetNextMusicByte
ld e, a
ld a, c
cp Ch8
- ld a, $0
- jr z, .sfxNoiseChannel ; only two params for noise channel
+ ld a, 0
+ jr z, .skip
+; Channels 1 through 3 have 2 registers that control frequency, but the noise
+; channel a single register (the polynomial counter) that controls frequency,
+; so this command has one less byte on the noise channel.
push de
call Audio2_GetNextMusicByte
pop de
-.sfxNoiseChannel
+.skip
ld d, a
push de
- call Audio2_21daa
- call Audio2_21d79
+ call Audio2_ApplyDutyCycleAndSoundLength
+ call Audio2_EnableChannelOutput
pop de
- call Audio2_21dcc
+ call Audio2_ApplyWavePatternAndFrequency
ret
-Audio2_pitchenvelope:
+Audio2_pitch_sweep:
ld a, c
cp Ch5
jr c, Audio2_note ; if not a sfx
ld a, d
- cp $10 ; is this command a pitchenvelope?
+ cp $10 ; is this command a pitch_sweep?
jr nz, Audio2_note ; no
ld b, $0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
+ bit BIT_EXECUTE_MUSIC, [hl]
jr nz, Audio2_note ; no
- call Audio2_GetNextMusicByte ; yes
+ call Audio2_GetNextMusicByte
ld [rNR10], a
- jp Audio2_endchannel
+ jp Audio2_sound_ret
Audio2_note:
ld a, c
cp Ch4
- jr nz, Audio2_notelength ; if not noise channel
+ jr nz, Audio2_note_length ; if not noise channel
ld a, d
and $f0
cp $b0 ; is this command a dnote?
- jr z, Audio2_dnote ; yes
- jr nc, Audio2_notelength ; no
+ jr z, .dnote
+ jr nc, Audio2_note_length ; no
+
+ ; this executes when on the noise channel and
+ ; the command id is less than $b0
+ ; in this case, the upper nybble is used as the noise instrument ($1-$a)
+ ; and the lower nybble is the length minus 1 (0-15)
+ ; however, this doesn't work for instrument #2 because the command id
+ ; is captured by the noise_note command (command id $2x)
+ ; this essentially acts like a dnote command that is only 1 byte
+ ; instead of 2 and can only be used with instruments 1 and 3 through 10
+ ; this is unused by the game
swap a
ld b, a
ld a, d
@@ -645,38 +679,38 @@
ld a, b
push de
push bc
- jr asm_21c7e
+ jr .playDnote
-Audio2_dnote:
+.dnote
ld a, d
and $f
push af
push bc
call Audio2_GetNextMusicByte ; get dnote instrument
-asm_21c7e
+.playDnote
ld d, a
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr nz, .asm_21c89
+ jr nz, .skipDnote
ld a, d
call Audio2_PlaySound
-.asm_21c89
+.skipDnote
pop bc
pop de
-Audio2_notelength:
+Audio2_note_length:
ld a, d
push af
and $f
inc a
- ld b, $0
- ld e, a ; store note length (in 16ths)
+ ld b, 0
+ ld e, a ; store note length (in 16ths)
ld d, b
ld hl, wChannelNoteSpeeds
add hl, bc
ld a, [hl]
ld l, b
- call Audio2_22006
+ call Audio2_MultiplyAdd
ld a, c
cp Ch5
jr nc, .sfxChannel
@@ -690,20 +724,20 @@
ld e, $0
cp Ch8
jr z, .skip ; if noise channel
- call Audio2_21e2f
+ call Audio2_SetSfxTempo
ld a, [wSfxTempo]
ld d, a
ld a, [wSfxTempo + 1]
ld e, a
.skip
- ld a, l
- ld b, $0
+ ld a, l ; a = note_length * note_speed
+ ld b, 0
ld hl, wChannelNoteDelayCountersFractionalPart
add hl, bc
ld l, [hl]
- call Audio2_22006
+ call Audio2_MultiplyAdd
ld e, l
- ld d, h
+ ld d, h ; de = note_delay_frac_part + (note_length * note_speed * tempo)
ld hl, wChannelNoteDelayCountersFractionalPart
add hl, bc
ld [hl], e
@@ -713,16 +747,16 @@
ld [hl], a
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, Audio2_notepitch
+ bit BIT_EXECUTE_MUSIC, [hl]
+ jr nz, Audio2_note_pitch
ld hl, wChannelFlags1
add hl, bc
- bit 2, [hl]
- jr z, Audio2_notepitch
+ bit BIT_NOISE_OR_SFX, [hl]
+ jr z, Audio2_note_pitch
pop hl
ret
-Audio2_notepitch:
+Audio2_note_pitch:
pop af
and $f0
cp $c0 ; compare to rest
@@ -729,7 +763,8 @@
jr nz, .notRest
ld a, c
cp Ch5
- jr nc, .sfxChannel
+ jr nc, .next
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
add hl, bc
ld a, [hl]
@@ -736,113 +771,117 @@
and a
jr nz, .done
; fall through
-.sfxChannel
+.next
ld a, c
cp Ch3
- jr z, .musicChannel3
+ jr z, .channel3
cp Ch7
- jr nz, .notSfxChannel3
-.musicChannel3
- ld b, $0
- ld hl, Unknown_222de
+ jr nz, .notChannel3
+.channel3
+ ld b, 0
+ ld hl, Audio2_HWChannelDisableMasks
add hl, bc
ld a, [rNR51]
and [hl]
- ld [rNR51], a
+ ld [rNR51], a ; disable hardware channel 3's output
jr .done
-.notSfxChannel3
- ld b, $2
- call Audio2_21ff7
- ld a, $8
+.notChannel3
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio2_GetRegisterPointer
+ ld a, $8 ; fade in sound
ld [hli], a
inc hl
- ld a, $80
+ ld a, $80 ; restart sound
ld [hl], a
.done
ret
.notRest
swap a
- ld b, $0
+ ld b, 0
ld hl, wChannelOctaves
add hl, bc
ld b, [hl]
- call Audio2_22017
- ld b, $0
+ call Audio2_CalculateFrequency
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit 4, [hl]
- jr z, .asm_21d39
- call Audio2_21f4e
-.asm_21d39
+ bit BIT_PITCH_SLIDE_ON, [hl]
+ jr z, .skipPitchSlide
+ call Audio2_InitPitchSlideVars
+.skipPitchSlide
push de
ld a, c
cp Ch5
- jr nc, .skip ; if sfx channel
+ jr nc, .sfxChannel ; if sfx channel
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
- ld d, $0
+ ld d, 0
ld e, a
add hl, de
ld a, [hl]
and a
- jr nz, .asm_21d4c
- jr .skip
-.asm_21d4c
+ jr nz, .noSfx
+ jr .sfxChannel
+.noSfx
pop de
ret
-.skip
- ld b, $0
+.sfxChannel
+ ld b, 0
ld hl, wChannelVolumes
add hl, bc
ld d, [hl]
- ld b, $2
- call Audio2_21ff7
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio2_GetRegisterPointer
ld [hl], d
- call Audio2_21daa
- call Audio2_21d79
+ call Audio2_ApplyDutyCycleAndSoundLength
+ call Audio2_EnableChannelOutput
pop de
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- bit 0, [hl] ; has toggleperfectpitch been used?
- jr z, .skip2
- inc e ; if yes, increment the pitch by 1
- jr nc, .skip2
+ bit BIT_PERFECT_PITCH, [hl] ; has toggle_perfect_pitch been used?
+ jr z, .skipFrequencyInc
+ inc e ; if yes, increment the frequency by 1
+ jr nc, .skipFrequencyInc
inc d
-.skip2
+.skipFrequencyInc
ld hl, wChannelFrequencyLowBytes
add hl, bc
ld [hl], e
- call Audio2_21dcc
+ call Audio2_ApplyWavePatternAndFrequency
ret
-Audio2_21d79:
- ld b, $0
- ld hl, Unknown_222e6
+Audio2_EnableChannelOutput:
+ ld b, 0
+ ld hl, Audio2_HWChannelEnableMasks
add hl, bc
ld a, [rNR51]
- or [hl]
+ or [hl] ; set this channel's bits
ld d, a
ld a, c
cp Ch8
- jr z, .sfxNoiseChannel
+ jr z, .noiseChannelOrNoSfx
cp Ch5
jr nc, .skip ; if sfx channel
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
add hl, bc
ld a, [hl]
and a
jr nz, .skip
-.sfxNoiseChannel
+.noiseChannelOrNoSfx
+; If this is the SFX noise channel or a music channel whose corresponding
+; SFX channel is off, apply stereo panning.
ld a, [wStereoPanning]
- ld hl, Unknown_222e6
+ ld hl, Audio2_HWChannelEnableMasks
add hl, bc
and [hl]
ld d, a
ld a, [rNR51]
- ld hl, Unknown_222de
+ ld hl, Audio2_HWChannelDisableMasks
add hl, bc
- and [hl]
- or d
+ and [hl] ; reset this channel's output bits
+ or d ; set this channel's output bits that enabled in [wStereoPanning]
ld d, a
.skip
ld a, d
@@ -849,47 +888,48 @@
ld [rNR51], a
ret
-Audio2_21daa:
- ld b, $0
- ld hl, wChannelNoteDelayCounters
+Audio2_ApplyDutyCycleAndSoundLength:
+ ld b, 0
+ ld hl, wChannelNoteDelayCounters ; use the note delay as sound length
add hl, bc
ld d, [hl]
ld a, c
cp Ch3
- jr z, .channel3 ; if music channel 3
+ jr z, .skipDuty ; if music channel 3
cp Ch7
- jr z, .channel3 ; if sfx channel 3
+ jr z, .skipDuty ; if sfx channel 3
+; include duty cycle (except on channel 3 which doesn't have it)
ld a, d
and $3f
ld d, a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
ld d, a
-.channel3
- ld b, $1
- call Audio2_21ff7
+.skipDuty
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio2_GetRegisterPointer
ld [hl], d
ret
-Audio2_21dcc:
+Audio2_ApplyWavePatternAndFrequency:
ld a, c
cp Ch3
jr z, .channel3
cp Ch7
- jr nz, .notSfxChannel3
+ jr nz, .notChannel3
; fall through
.channel3
push de
ld de, wMusicWaveInstrument
cp Ch3
- jr z, .musicChannel3
+ jr z, .next
ld de, wSfxWaveInstrument
-.musicChannel3
+.next
ld a, [de]
add a
- ld d, $0
+ ld d, 0
ld e, a
ld hl, Audio2_WavePointers
add hl, de
@@ -896,9 +936,9 @@
ld e, [hl]
inc hl
ld d, [hl]
- ld hl, $ff30
+ ld hl, $ff30 ; wave pattern RAM
ld b, $f
- ld a, $0
+ ld a, $0 ; stop hardware channel 3
ld [rNR30], a
.loop
ld a, [de]
@@ -908,155 +948,166 @@
dec b
and a
jr nz, .loop
- ld a, $80
+ ld a, $80 ; start hardware channel 3
ld [rNR30], a
pop de
-.notSfxChannel3
+.notChannel3
ld a, d
- or $80
- and $c7
+ or $80 ; use counter mode (i.e. disable output when the counter reaches 0)
+ and $c7 ; zero the unused bits in the register
ld d, a
- ld b, $3
- call Audio2_21ff7
- ld [hl], e
+ ld b, REG_FREQUENCY_LO
+ call Audio2_GetRegisterPointer
+ ld [hl], e ; store frequency low byte
inc hl
- ld [hl], d
+ ld [hl], d ; store frequency high byte
+ ; --- this section is only present in this copy of the sound engine
ld a, c
cp Ch5
jr c, .musicChannel
- call Audio2_21e56
+ call Audio2_ApplyFrequencyModifier
.musicChannel
+ ; ---
ret
-Audio2_21e19:
+; --- this section is only present in this copy of the sound engine
+; unused
+Audio2_ResetCryModifiers:
ld a, c
cp Ch5
- jr nz, .asm_21e2e
+ jr nz, .skip
ld a, [wLowHealthAlarm]
bit 7, a
- jr z, .asm_21e2e
+ jr z, .skip
xor a
ld [wFrequencyModifier], a
ld a, $80
ld [wTempoModifier], a
-.asm_21e2e
+.skip
ret
+; ---
-Audio2_21e2f:
- call Audio2_21e8b
- jr c, .asm_21e39
- call Audio2_21e9f
- jr nc, .asm_21e4c
-.asm_21e39
- ld d, $0
+Audio2_SetSfxTempo:
+ call Audio2_IsCry
+ jr c, .skipCryCheck
+ call Audio2_IsBattleSFX
+ jr nc, .notCry
+.skipCryCheck
+ ld d, 0
ld a, [wTempoModifier]
add $80
- jr nc, .asm_21e43
+ jr nc, .next
inc d
-.asm_21e43
+.next
ld [wSfxTempo + 1], a
ld a, d
ld [wSfxTempo], a
- jr .asm_21e55
-.asm_21e4c
+ jr .done
+.notCry
xor a
ld [wSfxTempo + 1], a
ld a, $1
ld [wSfxTempo], a
-.asm_21e55
+.done
ret
-Audio2_21e56:
- call Audio2_21e8b
- jr c, .asm_21e60
- call Audio2_21e9f
- jr nc, .asm_21e6c
-.asm_21e60
+Audio2_ApplyFrequencyModifier:
+ call Audio2_IsCry
+ jr c, .skipCryCheck
+ call Audio2_IsBattleSFX
+ jr nc, .done
+.skipCryCheck
+; if playing a cry, add the cry's frequency modifier
ld a, [wFrequencyModifier]
add e
- jr nc, .asm_21e67
+ jr nc, .noCarry
inc d
-.asm_21e67
+.noCarry
dec hl
ld e, a
ld [hl], e
inc hl
ld [hl], d
-.asm_21e6c
+.done
ret
-Audio2_21e6d:
- call Audio2_21e8b
- jr nc, .asm_21e88
+Audio2_GoBackOneCommandIfCry:
+ call Audio2_IsCry
+ jr nc, .done
ld hl, wChannelCommandPointers
ld e, c
- ld d, $0
+ ld d, 0
sla e
rl d
add hl, de
ld a, [hl]
- sub $1
+ sub 1
ld [hl], a
inc hl
ld a, [hl]
- sbc $0
+ sbc 0
ld [hl], a
scf
ret
-.asm_21e88
+.done
scf
ccf
ret
-Audio2_21e8b:
+Audio2_IsCry:
+; Returns whether the currently playing audio is a cry in carry.
ld a, [wChannelSoundIDs + Ch5]
- cp $14
- jr nc, .asm_21e94
- jr .asm_21e9a
-.asm_21e94
- cp $86
- jr z, .asm_21e9a
- jr c, .asm_21e9d
-.asm_21e9a
+ cp CRY_SFX_START
+ jr nc, .next
+ jr .no
+.next
+ cp CRY_SFX_END
+ jr z, .no
+ jr c, .yes
+.no
scf
ccf
ret
-.asm_21e9d
+.yes
scf
ret
-Audio2_21e9f:
+; --- this section is only present in this copy of the sound engine
+Audio2_IsBattleSFX:
+; Returns whether the currently playing audio is a cry in carry.
ld a, [wChannelSoundIDs + Ch8]
ld b, a
ld a, [wChannelSoundIDs + Ch5]
or b
- cp $9d
- jr nc, .asm_21ead
- jr .asm_21eb3
-.asm_21ead
- cp $ea
- jr z, .asm_21eb3
- jr c, .asm_21eb6
-.asm_21eb3
+ cp BATTLE_SFX_START
+ jr nc, .next
+ jr .no
+.next
+ cp BATTLE_SFX_END
+ jr z, .no
+ jr c, .yes
+.no
scf
ccf
ret
-.asm_21eb6
+.yes
scf
ret
+; ---
-Audio2_ApplyPitchBend:
+Audio2_ApplyPitchSlide:
ld hl, wChannelFlags1
add hl, bc
- bit 5, [hl]
- jp nz, .asm_21eff
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ bit BIT_PITCH_SLIDE_DECREASING, [hl]
+ jp nz, .frequencyDecreasing
+; frequency increasing
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld l, [hl]
ld h, b
@@ -1063,41 +1114,41 @@
add hl, de
ld d, h
ld e, l
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
push hl
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
pop hl
add [hl]
ld [hl], a
- ld a, $0
+ ld a, 0
adc e
ld e, a
- ld a, $0
+ ld a, 0
adc d
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
cp d
- jp c, .asm_21f45
- jr nz, .asm_21f32
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ jp c, .reachedTargetFrequency
+ jr nz, .applyUpdatedFrequency
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
cp e
- jp c, .asm_21f45
- jr .asm_21f32
-.asm_21eff
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ jp c, .reachedTargetFrequency
+ jr .applyUpdatedFrequency
+.frequencyDecreasing
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld e, [hl]
sub e
@@ -1105,7 +1156,7 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
add a
@@ -1116,55 +1167,56 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, d
cp [hl]
- jr c, .asm_21f45
- jr nz, .asm_21f32
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ jr c, .reachedTargetFrequency
+ jr nz, .applyUpdatedFrequency
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
cp [hl]
- jr c, .asm_21f45
-.asm_21f32
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ jr c, .reachedTargetFrequency
+.applyUpdatedFrequency
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
- ld b, $3
- call Audio2_21ff7
+ ld b, REG_FREQUENCY_LO
+ call Audio2_GetRegisterPointer
ld a, e
ld [hli], a
ld [hl], d
ret
-.asm_21f45
+.reachedTargetFrequency
+; Turn off pitch slide when the target frequency has been reached.
ld hl, wChannelFlags1
add hl, bc
- res 4, [hl]
- res 5, [hl]
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
ret
-Audio2_21f4e:
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+Audio2_InitPitchSlideVars:
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
ld hl, wChannelNoteDelayCounters
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
sub [hl]
- jr nc, .asm_21f66
- ld a, $1
-.asm_21f66
+ jr nc, .next
+ ld a, 1
+.next
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
sub [hl]
@@ -1171,74 +1223,84 @@
ld e, a
ld a, d
sbc b
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
sub [hl]
- jr c, .asm_21f82
+ jr c, .targetFrequencyGreater
ld d, a
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set 5, [hl]
- jr .asm_21fa5
-.asm_21f82
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ set BIT_PITCH_SLIDE_DECREASING, [hl]
+ jr .next2
+.targetFrequencyGreater
+; If the target frequency is greater, subtract the current frequency from
+; the target frequency to get the absolute difference.
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
sub e
ld e, a
+
+; Bug. Instead of borrowing from the high byte of the target frequency as it
+; should, it borrows from the high byte of the current frequency instead.
+; This means that the result will be 0x200 greater than it should be if the
+; low byte of the current frequency is greater than the low byte of the
+; target frequency.
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
sub d
ld d, a
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- res 5, [hl]
-.asm_21fa5
- ld hl, wChannelPitchBendLengthModifiers
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
+
+.next2
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
-.asm_21fa9
+.divideLoop
inc b
ld a, e
sub [hl]
ld e, a
- jr nc, .asm_21fa9
+ jr nc, .divideLoop
ld a, d
and a
- jr z, .asm_21fb7
+ jr z, .doneDividing
dec a
ld d, a
- jr .asm_21fa9
-.asm_21fb7
- ld a, e
+ jr .divideLoop
+.doneDividing
+ ld a, e ; a = remainder - dividend
add [hl]
- ld d, b
- ld b, $0
- ld hl, wChannelPitchBendFrequencySteps
+ ld d, b ; d = quotient + 1
+ ld b, 0
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
- ld [hl], d
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld [hl], d ; store quotient + 1
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
- ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld [hl], a ; store remainder - dividend
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
- ld [hl], a
+ ld [hl], a ; store remainder - dividend
ret
-Audio2_ApplyDutyCycle:
- ld b, $0
- ld hl, wChannelDutyCycles
+Audio2_ApplyDutyCyclePattern:
+ ld b, 0
+ ld hl, wChannelDutyCyclePatterns
add hl, bc
ld a, [hl]
rlca
@@ -1246,8 +1308,8 @@
ld [hl], a
and $c0
ld d, a
- ld b, $1
- call Audio2_21ff7
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio2_GetRegisterPointer
ld a, [hl]
and $3f
or d
@@ -1255,7 +1317,7 @@
ret
Audio2_GetNextMusicByte:
- ld d, $0
+ ld d, 0
ld a, c
add a
ld e, a
@@ -1272,9 +1334,10 @@
ld [hl], d
ret
-Audio2_21ff7:
+Audio2_GetRegisterPointer:
+; hl = address of hardware sound register b for software channel c
ld a, c
- ld hl, Unknown_222d6
+ ld hl, Audio2_HWChannelBaseAddresses
add l
jr nc, .noCarry
inc h
@@ -1286,13 +1349,14 @@
ld h, $ff
ret
-Audio2_22006:
- ld h, $0
+Audio2_MultiplyAdd:
+; hl = l + (a * de)
+ ld h, 0
.loop
srl a
- jr nc, .noCarry
+ jr nc, .skipAdd
add hl, de
-.noCarry
+.skipAdd
sla e
rl d
and a
@@ -1301,8 +1365,9 @@
.done
ret
-Audio2_22017:
- ld h, $0
+Audio2_CalculateFrequency:
+; return the frequency for note a, octave b in de
+ ld h, 0
ld l, a
add hl, hl
ld d, h
@@ -1314,7 +1379,7 @@
ld d, [hl]
ld a, b
.loop
- cp Ch8
+ cp 7
jr z, .done
sra d
rr e
@@ -1321,7 +1386,7 @@
inc a
jr .loop
.done
- ld a, $8
+ ld a, 8
add d
ld d, a
ret
@@ -1329,14 +1394,15 @@
Audio2_PlaySound::
ld [wSoundID], a
cp $ff
- jp z, Audio2_221f3
- cp $e9
- jp z, Audio2_2210d
- jp c, Audio2_2210d
+ jp z, .stopAllAudio
+ cp MAX_SFX_ID_2
+ jp z, .playSfx
+ jp c, .playSfx
cp $fe
- jr z, .asm_2204c
- jp nc, Audio2_2210d
-.asm_2204c
+ jr z, .playMusic
+ jp nc, .playSfx
+
+.playMusic
xor a
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
@@ -1345,53 +1411,53 @@
ld [wSfxWaveInstrument], a
ld d, $8
ld hl, wChannelReturnAddresses
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelCommandPointers
- call FillAudioRAM2
+ call .FillMem
ld d, $4
ld hl, wChannelSoundIDs
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelFlags1
- call FillAudioRAM2
- ld hl, wChannelDuties
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelDutyCycles
- call FillAudioRAM2
+ call .FillMem
+ ld hl, wChannelDutyCyclePatterns
+ call .FillMem
ld hl, wChannelVibratoDelayCounters
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelVibratoExtents
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelVibratoRates
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelFrequencyLowBytes
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelVibratoDelayCounterReloadValues
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelFlags2
- call FillAudioRAM2
- ld hl, wChannelPitchBendLengthModifiers
- call FillAudioRAM2
- ld hl, wChannelPitchBendFrequencySteps
- call FillAudioRAM2
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
- call FillAudioRAM2
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
- call FillAudioRAM2
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
- call FillAudioRAM2
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
- call FillAudioRAM2
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
- call FillAudioRAM2
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
- call FillAudioRAM2
+ call .FillMem
+ ld hl, wChannelPitchSlideLengthModifiers
+ call .FillMem
+ ld hl, wChannelPitchSlideFrequencySteps
+ call .FillMem
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
+ call .FillMem
ld a, $1
ld hl, wChannelLoopCounters
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelNoteDelayCounters
- call FillAudioRAM2
+ call .FillMem
ld hl, wChannelNoteSpeeds
- call FillAudioRAM2
+ call .FillMem
ld [wMusicTempo], a
ld a, $ff
ld [wStereoPanning], a
@@ -1399,7 +1465,7 @@
ld [rNR50], a
ld a, $8
ld [rNR10], a
- ld a, $0
+ ld a, 0
ld [rNR51], a
xor a
ld [rNR30], a
@@ -1407,12 +1473,12 @@
ld [rNR30], a
ld a, $77
ld [rNR50], a
- jp Audio2_2224e
+ jp .playSoundCommon
-Audio2_2210d:
+.playSfx
ld l, a
ld e, a
- ld h, $0
+ ld h, 0
ld d, h
add hl, hl
add hl, de
@@ -1427,13 +1493,13 @@
rlca
rlca
ld c, a
-.asm_22126
+.sfxChannelLoop
ld d, c
ld a, c
add a
add c
ld c, a
- ld b, $0
+ ld b, 0
ld a, [wSfxHeaderPointer]
ld h, a
ld a, [wSfxHeaderPointer + 1]
@@ -1442,32 +1508,32 @@
ld c, d
ld a, [hl]
and $f
- ld e, a
- ld d, $0
+ ld e, a ; software channel ID
+ ld d, 0
ld hl, wChannelSoundIDs
add hl, de
ld a, [hl]
and a
- jr z, .asm_22162
+ jr z, .playChannel
ld a, e
- cp $7
- jr nz, .asm_22159
+ cp Ch8
+ jr nz, .notNoiseChannel
ld a, [wSoundID]
- cp $14
- jr nc, .asm_22152
+ cp NOISE_INSTRUMENTS_END
+ jr nc, .notNoiseInstrument
ret
-.asm_22152
+.notNoiseInstrument
ld a, [hl]
- cp $14
- jr z, .asm_22162
- jr c, .asm_22162
-.asm_22159
+ cp NOISE_INSTRUMENTS_END
+ jr z, .playChannel
+ jr c, .playChannel
+.notNoiseChannel
ld a, [wSoundID]
cp [hl]
- jr z, .asm_22162
- jr c, .asm_22162
+ jr z, .playChannel
+ jr c, .playChannel
ret
-.asm_22162
+.playChannel
xor a
push de
ld h, d
@@ -1490,10 +1556,10 @@
ld hl, wChannelFlags1
add hl, de
ld [hl], a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, de
ld [hl], a
- ld hl, wChannelDutyCycles
+ ld hl, wChannelDutyCyclePatterns
add hl, de
ld [hl], a
ld hl, wChannelVibratoDelayCounters
@@ -1511,28 +1577,28 @@
ld hl, wChannelVibratoDelayCounterReloadValues
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, de
ld [hl], a
ld hl, wChannelFlags2
@@ -1549,35 +1615,35 @@
add hl, de
ld [hl], a
ld a, e
- cp $4
- jr nz, .asm_221ea
+ cp Ch5
+ jr nz, .skipSweepDisable
ld a, $8
- ld [rNR10], a
-.asm_221ea
+ ld [rNR10], a ; sweep off
+.skipSweepDisable
ld a, c
and a
- jp z, Audio2_2224e
+ jp z, .playSoundCommon
dec c
- jp .asm_22126
+ jp .sfxChannelLoop
-Audio2_221f3:
+.stopAllAudio
ld a, $80
- ld [rNR52], a
- ld [rNR30], a
+ ld [rNR52], a ; sound hardware on
+ ld [rNR30], a ; wave playback on
xor a
- ld [rNR51], a
- ld [rNR32], a
+ ld [rNR51], a ; no sound output
+ ld [rNR32], a ; mute channel 3 (wave channel)
ld a, $8
- ld [rNR10], a
- ld [rNR12], a
- ld [rNR22], a
- ld [rNR42], a
+ ld [rNR10], a ; sweep off
+ ld [rNR12], a ; mute channel 1 (pulse channel 1)
+ ld [rNR22], a ; mute channel 2 (pulse channel 2)
+ ld [rNR42], a ; mute channel 4 (noise channel)
ld a, $40
- ld [rNR14], a
+ ld [rNR14], a ; counter mode
ld [rNR24], a
ld [rNR44], a
ld a, $77
- ld [rNR50], a
+ ld [rNR50], a ; full volume
xor a
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
@@ -1588,11 +1654,11 @@
ld [wSfxWaveInstrument], a
ld d, $a0
ld hl, wChannelCommandPointers
- call FillAudioRAM2
+ call .FillMem
ld a, $1
ld d, $18
ld hl, wChannelNoteDelayCounters
- call FillAudioRAM2
+ call .FillMem
ld [wMusicTempo], a
ld [wSfxTempo], a
ld a, $ff
@@ -1600,7 +1666,7 @@
ret
; fills d bytes at hl with a
-FillAudioRAM2:
+.FillMem
ld b, d
.loop
ld [hli], a
@@ -1608,11 +1674,11 @@
jr nz, .loop
ret
-Audio2_2224e:
+.playSoundCommon
ld a, [wSoundID]
ld l, a
ld e, a
- ld h, $0
+ ld h, 0
ld d, h
add hl, hl
add hl, de
@@ -1632,19 +1698,19 @@
ld b, c
inc b
inc de
- ld c, $0
-.asm_22270
+ ld c, 0
+.commandPointerLoop
cp c
- jr z, .asm_22278
+ jr z, .next
inc c
inc hl
inc hl
- jr .asm_22270
-.asm_22278
+ jr .commandPointerLoop
+.next
push hl
push bc
push af
- ld b, $0
+ ld b, 0
ld c, a
ld hl, wChannelSoundIDs
add hl, bc
@@ -1651,12 +1717,12 @@
ld a, [wSoundID]
ld [hl], a
pop af
- cp $3
- jr c, .asm_22291
+ cp Ch4
+ jr c, .skipSettingFlag
ld hl, wChannelFlags1
add hl, bc
- set 2, [hl]
-.asm_22291
+ set BIT_NOISE_OR_SFX, [hl]
+.skipSettingFlag
pop bc
pop hl
ld a, [de] ; get channel pointer
@@ -1671,52 +1737,53 @@
and a
ld a, [de]
inc de
- jr nz, .asm_22270
+ jr nz, .commandPointerLoop
ld a, [wSoundID]
- cp $14
- jr nc, .asm_222aa
- jr .asm_222d4
-.asm_222aa
+ cp CRY_SFX_START
+ jr nc, .maybeCry
+ jr .done
+.maybeCry
ld a, [wSoundID]
- cp $86
- jr z, .asm_222d4
- jr c, .asm_222b5
- jr .asm_222d4
-.asm_222b5
+ cp CRY_SFX_END
+ jr z, .done
+ jr c, .cry
+ jr .done
+.cry
ld hl, wChannelSoundIDs + Ch5
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
- ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx noise channel pointer
- ld de, Noise2_endchannel
+ ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
+ ld de, Audio2_CryRet
ld [hl], e
inc hl
- ld [hl], d ; overwrite pointer to point to endchannel
+ ld [hl], d ; overwrite pointer to point to sound_ret
ld a, [wSavedVolume]
and a
- jr nz, .asm_222d4
+ jr nz, .done
ld a, [rNR50]
ld [wSavedVolume], a
ld a, $77
- ld [rNR50], a
-.asm_222d4
+ ld [rNR50], a ; full volume
+.done
ret
-Noise2_endchannel:
+Audio2_CryRet:
sound_ret
-Unknown_222d6:
- db $10, $15, $1A, $1F ; channels 0-3
- db $10, $15, $1A, $1F ; channels 4-7
+Audio2_HWChannelBaseAddresses:
+; the low bytes of each HW channel's base address
+ db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 0-3
+ db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 4-7
-Unknown_222de:
- db $EE, $DD, $BB, $77 ; channels 0-3
- db $EE, $DD, $BB, $77 ; channels 4-7
+Audio2_HWChannelDisableMasks:
+ db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 0-3
+ db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 4-7
-Unknown_222e6:
- db $11, $22, $44, $88 ; channels 0-3
- db $11, $22, $44, $88 ; channels 4-7
+Audio2_HWChannelEnableMasks:
+ db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 0-3
+ db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 4-7
Audio2_Pitches:
dw $F82C ; C_
@@ -1731,5 +1798,3 @@
dw $FB58 ; A_
dw $FB9B ; A#
dw $FBDA ; B_
-
-
--- a/audio/engine_3.asm
+++ b/audio/engine_3.asm
@@ -3,7 +3,7 @@
Audio3_UpdateMusic::
ld c, Ch1
.loop
- ld b, $0
+ ld b, 0
ld hl, wChannelSoundIDs
add hl, bc
ld a, [hl]
@@ -19,7 +19,7 @@
jr nz, .nextChannel
set 7, a
ld [wMuteAudioAndPauseMusic], a
- xor a
+ xor a ; disable all channels' output
ld [rNR51], a
ld [rNR30], a
ld a, $80
@@ -36,18 +36,12 @@
; this routine checks flags for music effects currently applied
; to the channel and calls certain functions based on flags.
-; known flags for wChannelFlags1:
-; 0: toggleperfectpitch has been used
-; 1: call has been used
-; 3: a toggle used only by this routine for vibrato
-; 4: pitchbend flag
-; 6: dutycycle flag
Audio3_ApplyMusicAffects:
ld b, $0
ld hl, wChannelNoteDelayCounters ; delay until next note
add hl, bc
ld a, [hl]
- cp $1 ; if delay is 1, play next note
+ cp $1 ; if the delay is 1, play next note
jp z, Audio3_PlayNextNote
dec a ; otherwise, decrease the delay timer
ld [hl], a
@@ -63,36 +57,36 @@
.startChecks
ld hl, wChannelFlags1
add hl, bc
- bit 6, [hl] ; dutycycle
+ bit BIT_ROTATE_DUTY_CYCLE, [hl]
jr z, .checkForExecuteMusic
- call Audio3_ApplyDutyCycle
+ call Audio3_ApplyDutyCyclePattern
.checkForExecuteMusic
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, .checkForPitchBend
+ bit BIT_EXECUTE_MUSIC, [hl]
+ jr nz, .checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
- bit 2, [hl]
- jr nz, .disablePitchBendVibrato
-.checkForPitchBend
+ bit BIT_NOISE_OR_SFX, [hl]
+ jr nz, .skipPitchSlideVibrato
+.checkForPitchSlide
ld hl, wChannelFlags1
add hl, bc
- bit 4, [hl] ; pitchbend
+ bit BIT_PITCH_SLIDE_ON, [hl]
jr z, .checkVibratoDelay
- jp Audio3_ApplyPitchBend
+ jp Audio3_ApplyPitchSlide
.checkVibratoDelay
- ld hl, wChannelVibratoDelayCounters ; vibrato delay
+ ld hl, wChannelVibratoDelayCounters
add hl, bc
ld a, [hl]
and a ; check if delay is over
jr z, .checkForVibrato
dec [hl] ; otherwise, dec delay
-.disablePitchBendVibrato
+.skipPitchSlideVibrato
ret
.checkForVibrato
- ld hl, wChannelVibratoExtents ; vibrato rate
+ ld hl, wChannelVibratoExtents
add hl, bc
ld a, [hl]
and a
@@ -105,22 +99,24 @@
ld a, [hl]
and $f
and a
- jr z, .vibratoAlreadyDone
- dec [hl] ; apply vibrato pitch change
+ jr z, .applyVibrato
+ dec [hl] ; decrement counter
ret
-.vibratoAlreadyDone
+.applyVibrato
ld a, [hl]
swap [hl]
or [hl]
- ld [hl], a ; reset the vibrato value and start again
+ ld [hl], a ; reload the counter
ld hl, wChannelFrequencyLowBytes
add hl, bc
ld e, [hl] ; get note pitch
ld hl, wChannelFlags1
add hl, bc
- bit 3, [hl] ; this is the only code that sets/resets bit three so
- jr z, .unset ; it continuously alternates which path it takes
- res 3, [hl]
+; This is the only code that sets/resets the vibrato direction bit, so it
+; continuously alternates which path it takes.
+ bit BIT_VIBRATO_DIRECTION, [hl]
+ jr z, .unset
+ res BIT_VIBRATO_DIRECTION, [hl]
ld a, d
and $f
ld d, a
@@ -127,11 +123,11 @@
ld a, e
sub d
jr nc, .noCarry
- ld a, $0
+ ld a, 0
.noCarry
jr .done
.unset
- set 3, [hl]
+ set BIT_VIBRATO_DIRECTION, [hl]
ld a, d
and $f0
swap a
@@ -140,15 +136,16 @@
ld a, $ff
.done
ld d, a
- ld b, $3
- call Audio3_7d8ac
+ ld b, REG_FREQUENCY_LO
+ call Audio3_GetRegisterPointer
ld [hl], d
ret
; this routine executes all music commands that take up no time,
-; like tempo changes, duty changes etc. and doesn't return
+; like tempo changes, duty cycle changes etc. and doesn't return
; until the first note is reached
Audio3_PlayNextNote:
+; reload the vibrato delay counter
ld hl, wChannelVibratoDelayCounterReloadValues
add hl, bc
ld a, [hl]
@@ -155,48 +152,50 @@
ld hl, wChannelVibratoDelayCounters
add hl, bc
ld [hl], a
+
ld hl, wChannelFlags1
add hl, bc
- res 4, [hl]
- res 5, [hl]
- call Audio3_endchannel
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
+ call Audio3_sound_ret
ret
-Audio3_endchannel:
+Audio3_sound_ret:
call Audio3_GetNextMusicByte
ld d, a
- cp $ff ; is this command an endchannel?
- jp nz, Audio3_callchannel ; no
- ld b, $0 ; yes
+ cp $ff ; is this command a sound_ret?
+ jp nz, Audio3_sound_call ; no
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit 1, [hl]
+ bit BIT_SOUND_CALL, [hl]
jr nz, .returnFromCall
ld a, c
cp Ch4
jr nc, .noiseOrSfxChannel
- jr .asm_7d2b3
+ jr .disableChannelOutput
.noiseOrSfxChannel
- res 2, [hl]
+ res BIT_NOISE_OR_SFX, [hl]
ld hl, wChannelFlags2
add hl, bc
- res 0, [hl]
+ res BIT_EXECUTE_MUSIC, [hl]
cp Ch7
- jr nz, .notSfxChannel3
+ jr nz, .skipSfxChannel3
+; restart hardware channel 3 (wave channel) output
ld a, $0
ld [rNR30], a
ld a, $80
ld [rNR30], a
-.notSfxChannel3
- jr nz, .asm_7d296
+.skipSfxChannel3
+ jr nz, .dontDisable
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr z, .asm_7d296
+ jr z, .dontDisable
xor a
ld [wDisableChannelOutputWhenSfxEnds], a
- jr .asm_7d2b3
-.asm_7d296
- jr .asm_7d2bc
+ jr .disableChannelOutput
+.dontDisable
+ jr .afterDisable
.returnFromCall
res 1, [hl]
ld d, $0
@@ -216,45 +215,45 @@
inc de
ld a, [de]
ld [hl], a ; loads channel address to return to
- jp Audio3_endchannel
-.asm_7d2b3
- ld hl, Unknown_7db93
+ jp Audio3_sound_ret
+.disableChannelOutput
+ ld hl, Audio3_HWChannelDisableMasks
add hl, bc
ld a, [rNR51]
and [hl]
ld [rNR51], a
-.asm_7d2bc
+.afterDisable
ld a, [wChannelSoundIDs + Ch5]
- cp $14
- jr nc, .asm_7d2c5
- jr .asm_7d2e2
-.asm_7d2c5
+ cp CRY_SFX_START
+ jr nc, .maybeCry
+ jr .skipCry
+.maybeCry
ld a, [wChannelSoundIDs + Ch5]
- cp $86
- jr z, .asm_7d2e2
- jr c, .asm_7d2d0
- jr .asm_7d2e2
-.asm_7d2d0
+ cp CRY_SFX_END
+ jr z, .skipCry
+ jr c, .cry
+ jr .skipCry
+.cry
ld a, c
cp Ch5
- jr z, .asm_7d2d9
- call Audio3_7d73b
+ jr z, .skipRewind
+ call Audio3_GoBackOneCommandIfCry
ret c
-.asm_7d2d9
+.skipRewind
ld a, [wSavedVolume]
ld [rNR50], a
xor a
ld [wSavedVolume], a
-.asm_7d2e2
+.skipCry
ld hl, wChannelSoundIDs
add hl, bc
ld [hl], b
ret
-Audio3_callchannel:
- cp $fd ; is this command a callchannel?
- jp nz, Audio3_loopchannel ; no
- call Audio3_GetNextMusicByte ; yes
+Audio3_sound_call:
+ cp $fd ; is this command a sound_call?
+ jp nz, Audio3_sound_loop ; no
+ call Audio3_GetNextMusicByte
push af
call Audio3_GetNextMusicByte
ld d, a
@@ -285,27 +284,27 @@
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- set 1, [hl] ; set the call flag
- jp Audio3_endchannel
+ set BIT_SOUND_CALL, [hl] ; set the call flag
+ jp Audio3_sound_ret
-Audio3_loopchannel:
- cp $fe ; is this command a loopchannel?
- jp nz, Audio3_notetype ; no
- call Audio3_GetNextMusicByte ; yes
+Audio3_sound_loop:
+ cp $fe ; is this command a sound_loop?
+ jp nz, Audio3_note_type ; no
+ call Audio3_GetNextMusicByte
ld e, a
and a
jr z, .infiniteLoop
- ld b, $0
+ ld b, 0
ld hl, wChannelLoopCounters
add hl, bc
ld a, [hl]
cp e
jr nz, .loopAgain
- ld a, $1 ; if no more loops to make
+ ld a, $1 ; if no more loops to make,
ld [hl], a
call Audio3_GetNextMusicByte ; skip pointer
call Audio3_GetNextMusicByte
- jp Audio3_endchannel
+ jp Audio3_sound_ret
.loopAgain ; inc loop count
inc a
ld [hl], a
@@ -324,13 +323,13 @@
pop af
ld [hli], a
ld [hl], b
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-Audio3_notetype:
+Audio3_note_type:
and $f0
- cp $d0 ; is this command a notetype?
- jp nz, Audio3_toggleperfectpitch ; no
- ld a, d ; yes
+ cp $d0 ; is this command a note_type?
+ jp nz, Audio3_toggle_perfect_pitch ; no
+ ld a, d
and $f
ld b, $0
ld hl, wChannelNoteSpeeds
@@ -345,15 +344,15 @@
cp Ch3
jr z, .musicChannel3
cp Ch7
- jr nz, .notChannel3
+ jr nz, .skipChannel3
ld hl, wSfxWaveInstrument
- jr .sfxChannel3
+ jr .channel3
.musicChannel3
ld hl, wMusicWaveInstrument
-.sfxChannel3
+.channel3
ld a, d
and $f
- ld [hl], a ; store low nibble of param as duty
+ ld [hl], a ; store low nibble of param as wave instrument
ld a, d
and $30
sla a
@@ -362,31 +361,31 @@
; if channel 3, store high nibble as volume
; else, store volume (high nibble) and fade (low nibble)
-.notChannel3
- ld b, $0
+.skipChannel3
+ ld b, 0
ld hl, wChannelVolumes
add hl, bc
ld [hl], d
.noiseChannel
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-Audio3_toggleperfectpitch:
+Audio3_toggle_perfect_pitch:
ld a, d
- cp $e8 ; is this command a toggleperfectpitch?
+ cp $e8 ; is this command a toggle_perfect_pitch?
jr nz, Audio3_vibrato ; no
- ld b, $0 ; yes
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
ld a, [hl]
xor $1
ld [hl], a ; flip bit 0 of wChannelFlags1
- jp Audio3_endchannel
+ jp Audio3_sound_ret
Audio3_vibrato:
cp $ea ; is this command a vibrato?
- jr nz, Audio3_pitchbend ; no
- call Audio3_GetNextMusicByte ; yes
- ld b, $0
+ jr nz, Audio3_pitch_slide ; no
+ call Audio3_GetNextMusicByte
+ ld b, 0
ld hl, wChannelVibratoDelayCounters
add hl, bc
ld [hl], a ; store delay
@@ -395,9 +394,16 @@
ld [hl], a ; store delay
call Audio3_GetNextMusicByte
ld d, a
+
+; The high nybble of the command byte is the extent of the vibrato.
+; Let n be the extent.
+; The upper nybble of the channel's byte in the wChannelVibratoExtents
+; array will store the extent above the note: (n / 2) + (n % 2).
+; The lower nybble will store the extent below the note: (n / 2).
+; These two values add to the total extent, n.
and $f0
swap a
- ld b, $0
+ ld b, 0
ld hl, wChannelVibratoExtents
add hl, bc
srl a
@@ -405,7 +411,13 @@
adc b
swap a
or e
- ld [hl], a ; store rate as both high and low nibbles
+ ld [hl], a
+
+; The low nybble of the command byte is the rate of the vibrato.
+; The high and low nybbles of the channel's byte in the wChannelVibratoRates
+; array are both initialised to this value because the high nybble is the
+; counter reload value and the low nybble is the counter itself, which should
+; start at its value upon reload.
ld a, d
and $f
ld d, a
@@ -413,17 +425,18 @@
add hl, bc
swap a
or d
- ld [hl], a ; store depth as both high and low nibbles
- jp Audio3_endchannel
+ ld [hl], a
-Audio3_pitchbend:
- cp $eb ; is this command a pitchbend?
- jr nz, Audio3_duty ; no
- call Audio3_GetNextMusicByte ; yes
- ld b, $0
- ld hl, wChannelPitchBendLengthModifiers
+ jp Audio3_sound_ret
+
+Audio3_pitch_slide:
+ cp $eb ; is this command a pitch_slide?
+ jr nz, Audio3_duty_cycle ; no
+ call Audio3_GetNextMusicByte
+ ld b, 0
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
- ld [hl], a ; store first param
+ ld [hl], a
call Audio3_GetNextMusicByte
ld d, a
and $f0
@@ -431,39 +444,39 @@
ld b, a
ld a, d
and $f
- call Audio3_7d8cc
- ld b, $0
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ call Audio3_CalculateFrequency
+ ld b, 0
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
- ld [hl], d ; store unknown part of second param
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld [hl], d
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
- ld [hl], e ; store unknown part of second param
- ld b, $0
+ ld [hl], e
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set 4, [hl] ; set pitchbend flag
+ set BIT_PITCH_SLIDE_ON, [hl]
call Audio3_GetNextMusicByte
ld d, a
- jp Audio3_notelength
+ jp Audio3_note_length
-Audio3_duty:
- cp $ec ; is this command a duty?
+Audio3_duty_cycle:
+ cp $ec ; is this command a duty_cycle?
jr nz, Audio3_tempo ; no
- call Audio3_GetNextMusicByte ; yes
+ call Audio3_GetNextMusicByte
rrca
rrca
and $c0
- ld b, $0
- ld hl, wChannelDuties
+ ld b, 0
+ ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store duty
- jp Audio3_endchannel
+ ld [hl], a ; store duty cycle
+ jp Audio3_sound_ret
Audio3_tempo:
cp $ed ; is this command a tempo?
- jr nz, Audio3_stereopanning ; no
- ld a, c ; yes
+ jr nz, Audio3_stereo_panning ; no
+ ld a, c
cp Ch5
jr nc, .sfxChannel
call Audio3_GetNextMusicByte
@@ -487,20 +500,20 @@
ld [wChannelNoteDelayCountersFractionalPart + 6], a
ld [wChannelNoteDelayCountersFractionalPart + 7], a
.musicChannelDone
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-Audio3_stereopanning:
- cp $ee ; is this command a stereopanning?
+Audio3_stereo_panning:
+ cp $ee ; is this command a stereo_panning?
jr nz, Audio3_unknownmusic0xef ; no
- call Audio3_GetNextMusicByte ; yes
+ call Audio3_GetNextMusicByte
ld [wStereoPanning], a ; store panning
- jp Audio3_endchannel
+ jp Audio3_sound_ret
; this appears to never be used
Audio3_unknownmusic0xef:
cp $ef ; is this command an unknownmusic0xef?
- jr nz, Audio3_dutycycle ; no
- call Audio3_GetNextMusicByte ; yes
+ jr nz, Audio3_duty_cycle_pattern ; no
+ call Audio3_GetNextMusicByte
push bc
call Audio3_PlaySound
pop bc
@@ -512,124 +525,141 @@
xor a
ld [wChannelSoundIDs + Ch8], a
.skip
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-Audio3_dutycycle:
- cp $fc ; is this command a dutycycle?
+Audio3_duty_cycle_pattern:
+ cp $fc ; is this command a duty_cycle_pattern?
jr nz, Audio3_volume ; no
- call Audio3_GetNextMusicByte ; yes
- ld b, $0
+ call Audio3_GetNextMusicByte
+ ld b, 0
+ ld hl, wChannelDutyCyclePatterns
+ add hl, bc
+ ld [hl], a ; store full pattern
+ and %11000000
ld hl, wChannelDutyCycles
add hl, bc
- ld [hl], a ; store full cycle
- and $c0
- ld hl, wChannelDuties
- add hl, bc
- ld [hl], a ; store first duty
+ ld [hl], a ; store first duty cycle
ld hl, wChannelFlags1
add hl, bc
- set 6, [hl] ; set duty flag
- jp Audio3_endchannel
+ set BIT_ROTATE_DUTY_CYCLE, [hl]
+ jp Audio3_sound_ret
Audio3_volume:
cp $f0 ; is this command a volume?
- jr nz, Audio3_executemusic ; no
- call Audio3_GetNextMusicByte ; yes
+ jr nz, Audio3_execute_music ; no
+ call Audio3_GetNextMusicByte
ld [rNR50], a ; store volume
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-Audio3_executemusic:
- cp $f8 ; is this command an executemusic?
+Audio3_execute_music:
+ cp $f8 ; is this command an execute_music?
jr nz, Audio3_octave ; no
- ld b, $0 ; yes
+ ld b, $0
ld hl, wChannelFlags2
add hl, bc
- set 0, [hl]
- jp Audio3_endchannel
+ set BIT_EXECUTE_MUSIC, [hl]
+ jp Audio3_sound_ret
Audio3_octave:
and $f0
cp $e0 ; is this command an octave?
- jr nz, Audio3_sfxnote ; no
- ld hl, wChannelOctaves ; yes
- ld b, $0
+ jr nz, Audio3_sfx_note ; no
+ ld hl, wChannelOctaves
+ ld b, 0
add hl, bc
ld a, d
and $f
ld [hl], a ; store low nibble as octave
- jp Audio3_endchannel
+ jp Audio3_sound_ret
-; sfxnote is either squarenote or noisenote depending on the channel
-Audio3_sfxnote:
- cp $20 ; is this command an sfxnote?
- jr nz, Audio3_pitchenvelope ; no
+; sfx_note is either square_note or noise_note depending on the channel
+Audio3_sfx_note:
+ cp $20 ; is this command a sfx_note?
+ jr nz, Audio3_pitch_sweep
ld a, c
cp Ch4 ; is this a noise or sfx channel?
- jr c, Audio3_pitchenvelope ; no
- ld b, $0
+ jr c, Audio3_pitch_sweep ; no
+ ld b, 0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, Audio3_pitchenvelope ; no
- call Audio3_notelength ; yes
+ bit BIT_EXECUTE_MUSIC, [hl] ; is execute_music being used?
+ jr nz, Audio3_pitch_sweep ; yes
+ call Audio3_note_length
+
+; This code seems to do the same thing as what Audio3_ApplyDutyCycleAndSoundLength
+; does below.
ld d, a
- ld b, $0
- ld hl, wChannelDuties
+ ld b, 0
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
ld d, a
- ld b, $1
- call Audio3_7d8ac
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio3_GetRegisterPointer
ld [hl], d
+
call Audio3_GetNextMusicByte
ld d, a
- ld b, $2
- call Audio3_7d8ac
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio3_GetRegisterPointer
ld [hl], d
call Audio3_GetNextMusicByte
ld e, a
ld a, c
cp Ch8
- ld a, $0
- jr z, .sfxNoiseChannel ; only two params for noise channel
+ ld a, 0
+ jr z, .skip
+; Channels 1 through 3 have 2 registers that control frequency, but the noise
+; channel a single register (the polynomial counter) that controls frequency,
+; so this command has one less byte on the noise channel.
push de
call Audio3_GetNextMusicByte
pop de
-.sfxNoiseChannel
+.skip
ld d, a
push de
- call Audio3_7d69d
- call Audio3_7d66c
+ call Audio3_ApplyDutyCycleAndSoundLength
+ call Audio3_EnableChannelOutput
pop de
- call Audio3_7d6bf
+ call Audio3_ApplyWavePatternAndFrequency
ret
-Audio3_pitchenvelope:
+Audio3_pitch_sweep:
ld a, c
cp Ch5
jr c, Audio3_note ; if not a sfx
ld a, d
- cp $10 ; is this command an pitchenvelope?
+ cp $10 ; is this command a pitch_sweep?
jr nz, Audio3_note ; no
ld b, $0
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
+ bit BIT_EXECUTE_MUSIC, [hl]
jr nz, Audio3_note ; no
- call Audio3_GetNextMusicByte ; yes
+ call Audio3_GetNextMusicByte
ld [rNR10], a
- jp Audio3_endchannel
+ jp Audio3_sound_ret
Audio3_note:
ld a, c
cp Ch4
- jr nz, Audio3_notelength ; if not noise channel
+ jr nz, Audio3_note_length ; if not noise channel
ld a, d
and $f0
cp $b0 ; is this command a dnote?
- jr z, Audio3_dnote ; yes
- jr nc, Audio3_notelength ; no
+ jr z, .dnote
+ jr nc, Audio3_note_length ; no
+
+ ; this executes when on the noise channel and
+ ; the command id is less than $b0
+ ; in this case, the upper nybble is used as the noise instrument ($1-$a)
+ ; and the lower nybble is the length minus 1 (0-15)
+ ; however, this doesn't work for instrument #2 because the command id
+ ; is captured by the noise_note command (command id $2x)
+ ; this essentially acts like a dnote command that is only 1 byte
+ ; instead of 2 and can only be used with instruments 1 and 3 through 10
+ ; this is unused by the game
swap a
ld b, a
ld a, d
@@ -638,31 +668,31 @@
ld a, b
push de
push bc
- jr asm_7d571
+ jr .playDnote
-Audio3_dnote:
+.dnote
ld a, d
and $f
push af
push bc
call Audio3_GetNextMusicByte ; get dnote instrument
-asm_7d571
+.playDnote
ld d, a
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
- jr nz, .asm_7d57c
+ jr nz, .skipDnote
ld a, d
call Audio3_PlaySound
-.asm_7d57c
+.skipDnote
pop bc
pop de
-Audio3_notelength:
+Audio3_note_length:
ld a, d
push af
and $f
inc a
- ld b, $0
+ ld b, 0
ld e, a ; store note length (in 16ths)
ld d, b
ld hl, wChannelNoteSpeeds
@@ -669,7 +699,7 @@
add hl, bc
ld a, [hl]
ld l, b
- call Audio3_7d8bb
+ call Audio3_MultiplyAdd
ld a, c
cp Ch5
jr nc, .sfxChannel
@@ -683,20 +713,20 @@
ld e, $0
cp Ch8
jr z, .skip ; if noise channel
- call Audio3_7d707
+ call Audio3_SetSfxTempo
ld a, [wSfxTempo]
ld d, a
ld a, [wSfxTempo + 1]
ld e, a
.skip
- ld a, l
- ld b, $0
+ ld a, l ; a = note_length * note_speed
+ ld b, 0
ld hl, wChannelNoteDelayCountersFractionalPart
add hl, bc
ld l, [hl]
- call Audio3_7d8bb
+ call Audio3_MultiplyAdd
ld e, l
- ld d, h
+ ld d, h ; de = note_delay_frac_part + (note_length * note_speed * tempo)
ld hl, wChannelNoteDelayCountersFractionalPart
add hl, bc
ld [hl], e
@@ -706,16 +736,16 @@
ld [hl], a
ld hl, wChannelFlags2
add hl, bc
- bit 0, [hl]
- jr nz, Audio3_notepitch
+ bit BIT_EXECUTE_MUSIC, [hl]
+ jr nz, Audio3_note_pitch
ld hl, wChannelFlags1
add hl, bc
- bit 2, [hl]
- jr z, Audio3_notepitch
+ bit BIT_NOISE_OR_SFX, [hl]
+ jr z, Audio3_note_pitch
pop hl
ret
-Audio3_notepitch:
+Audio3_note_pitch:
pop af
and $f0
cp $c0 ; compare to rest
@@ -722,120 +752,125 @@
jr nz, .notRest
ld a, c
cp Ch5
- jr nc, .sfxChannel
+ jr nc, .next
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
add hl, bc
ld a, [hl]
and a
- jr nz, .quit
+ jr nz, .done
; fall through
-.sfxChannel
+.next
ld a, c
cp Ch3
- jr z, .musicChannel3
+ jr z, .channel3
cp Ch7
- jr nz, .notSfxChannel3
-.musicChannel3
- ld b, $0
- ld hl, Unknown_7db93
+ jr nz, .notChannel3
+.channel3
+ ld b, 0
+ ld hl, Audio3_HWChannelDisableMasks
add hl, bc
ld a, [rNR51]
and [hl]
- ld [rNR51], a
- jr .quit
-.notSfxChannel3
- ld b, $2
- call Audio3_7d8ac
- ld a, $8
+ ld [rNR51], a ; disable hardware channel 3's output
+ jr .done
+.notChannel3
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio3_GetRegisterPointer
+ ld a, $8 ; fade in sound
ld [hli], a
inc hl
- ld a, $80
+ ld a, $80 ; restart sound
ld [hl], a
-.quit
+.done
ret
.notRest
swap a
- ld b, $0
+ ld b, 0
ld hl, wChannelOctaves
add hl, bc
ld b, [hl]
- call Audio3_7d8cc
- ld b, $0
+ call Audio3_CalculateFrequency
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- bit 4, [hl]
- jr z, .asm_7d62c
- call Audio3_7d803
-.asm_7d62c
+ bit BIT_PITCH_SLIDE_ON, [hl]
+ jr z, .skipPitchSlide
+ call Audio3_InitPitchSlideVars
+.skipPitchSlide
push de
ld a, c
cp Ch5
- jr nc, .skip ; if sfx Channel
+ jr nc, .sfxChannel ; if sfx channel
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
- ld d, $0
+ ld d, 0
ld e, a
add hl, de
ld a, [hl]
and a
- jr nz, .done
- jr .skip
-.done
+ jr nz, .noSfx
+ jr .sfxChannel
+.noSfx
pop de
ret
-.skip
- ld b, $0
+.sfxChannel
+ ld b, 0
ld hl, wChannelVolumes
add hl, bc
ld d, [hl]
- ld b, $2
- call Audio3_7d8ac
+ ld b, REG_VOLUME_ENVELOPE
+ call Audio3_GetRegisterPointer
ld [hl], d
- call Audio3_7d69d
- call Audio3_7d66c
+ call Audio3_ApplyDutyCycleAndSoundLength
+ call Audio3_EnableChannelOutput
pop de
ld b, $0
ld hl, wChannelFlags1
add hl, bc
- bit 0, [hl] ; has toggleperfectpitch been used?
- jr z, .skip2
- inc e ; if yes, increment the pitch by 1
- jr nc, .skip2
+ bit BIT_PERFECT_PITCH, [hl] ; has toggle_perfect_pitch been used?
+ jr z, .skipFrequencyInc
+ inc e ; if yes, increment the frequency by 1
+ jr nc, .skipFrequencyInc
inc d
-.skip2
+.skipFrequencyInc
ld hl, wChannelFrequencyLowBytes
add hl, bc
ld [hl], e
- call Audio3_7d6bf
+ call Audio3_ApplyWavePatternAndFrequency
ret
-Audio3_7d66c:
- ld b, $0
- ld hl, Unknown_7db9b
+Audio3_EnableChannelOutput:
+ ld b, 0
+ ld hl, Audio3_HWChannelEnableMasks
add hl, bc
ld a, [rNR51]
- or [hl]
+ or [hl] ; set this channel's bits
ld d, a
ld a, c
cp Ch8
- jr z, .sfxNoiseChannel
+ jr z, .noiseChannelOrNoSfx
cp Ch5
jr nc, .skip ; if sfx channel
+; If this isn't an SFX channel, try the corresponding SFX channel.
ld hl, wChannelSoundIDs + Ch5
add hl, bc
ld a, [hl]
and a
jr nz, .skip
-.sfxNoiseChannel
+.noiseChannelOrNoSfx
+; If this is the SFX noise channel or a music channel whose corresponding
+; SFX channel is off, apply stereo panning.
ld a, [wStereoPanning]
- ld hl, Unknown_7db9b
+ ld hl, Audio3_HWChannelEnableMasks
add hl, bc
and [hl]
ld d, a
ld a, [rNR51]
- ld hl, Unknown_7db93
+ ld hl, Audio3_HWChannelDisableMasks
add hl, bc
- and [hl]
- or d
+ and [hl] ; reset this channel's output bits
+ or d ; set this channel's output bits that enabled in [wStereoPanning]
ld d, a
.skip
ld a, d
@@ -842,47 +877,48 @@
ld [rNR51], a
ret
-Audio3_7d69d:
- ld b, $0
- ld hl, wChannelNoteDelayCounters
+Audio3_ApplyDutyCycleAndSoundLength:
+ ld b, 0
+ ld hl, wChannelNoteDelayCounters ; use the note delay as sound length
add hl, bc
ld d, [hl]
ld a, c
cp Ch3
- jr z, .channel3 ; if music channel 3
+ jr z, .skipDuty ; if music channel 3
cp Ch7
- jr z, .channel3 ; if sfx channel 3
+ jr z, .skipDuty ; if sfx channel 3
+; include duty cycle (except on channel 3 which doesn't have it)
ld a, d
and $3f
ld d, a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, bc
ld a, [hl]
or d
ld d, a
-.channel3
- ld b, $1
- call Audio3_7d8ac
+.skipDuty
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio3_GetRegisterPointer
ld [hl], d
ret
-Audio3_7d6bf:
+Audio3_ApplyWavePatternAndFrequency:
ld a, c
cp Ch3
jr z, .channel3
cp Ch7
- jr nz, .notSfxChannel3
+ jr nz, .notChannel3
; fall through
.channel3
push de
ld de, wMusicWaveInstrument
cp Ch3
- jr z, .musicChannel3
+ jr z, .next
ld de, wSfxWaveInstrument
-.musicChannel3
+.next
ld a, [de]
add a
- ld d, $0
+ ld d, 0
ld e, a
ld hl, Audio3_WavePointers
add hl, de
@@ -889,9 +925,9 @@
ld e, [hl]
inc hl
ld d, [hl]
- ld hl, $ff30
+ ld hl, $ff30 ; wave pattern RAM
ld b, $f
- ld a, $0
+ ld a, $0 ; stop hardware channel 3
ld [rNR30], a
.loop
ld a, [de]
@@ -901,111 +937,114 @@
dec b
and a
jr nz, .loop
- ld a, $80
+ ld a, $80 ; start hardware channel 3
ld [rNR30], a
pop de
-.notSfxChannel3
+.notChannel3
ld a, d
- or $80
- and $c7
+ or $80 ; use counter mode (i.e. disable output when the counter reaches 0)
+ and $c7 ; zero the unused bits in the register
ld d, a
- ld b, $3
- call Audio3_7d8ac
- ld [hl], e
+ ld b, REG_FREQUENCY_LO
+ call Audio3_GetRegisterPointer
+ ld [hl], e ; store frequency low byte
inc hl
- ld [hl], d
- call Audio3_7d729
+ ld [hl], d ; store frequency high byte
+ call Audio3_ApplyFrequencyModifier
ret
-Audio3_7d707:
- call Audio3_7d759
- jr nc, .asm_7d71f
- ld d, $0
+Audio3_SetSfxTempo:
+ call Audio3_IsCry
+ jr nc, .notCry
+ ld d, 0
ld a, [wTempoModifier]
add $80
- jr nc, .asm_7d716
+ jr nc, .next
inc d
-.asm_7d716
+.next
ld [wSfxTempo + 1], a
ld a, d
ld [wSfxTempo], a
- jr .asm_7d728
-.asm_7d71f
+ jr .done
+.notCry
xor a
ld [wSfxTempo + 1], a
ld a, $1
ld [wSfxTempo], a
-.asm_7d728
+.done
ret
-Audio3_7d729:
- call Audio3_7d759
- jr nc, .asm_7d73a
+Audio3_ApplyFrequencyModifier:
+ call Audio3_IsCry
+ jr nc, .done
+; if playing a cry, add the cry's frequency modifier
ld a, [wFrequencyModifier]
add e
- jr nc, .asm_7d735
+ jr nc, .noCarry
inc d
-.asm_7d735
+.noCarry
dec hl
ld e, a
ld [hl], e
inc hl
ld [hl], d
-.asm_7d73a
+.done
ret
-Audio3_7d73b:
- call Audio3_7d759
- jr nc, .asm_7d756
+Audio3_GoBackOneCommandIfCry:
+ call Audio3_IsCry
+ jr nc, .done
ld hl, wChannelCommandPointers
ld e, c
- ld d, $0
+ ld d, 0
sla e
rl d
add hl, de
ld a, [hl]
- sub $1
+ sub 1
ld [hl], a
inc hl
ld a, [hl]
- sbc $0
+ sbc 0
ld [hl], a
scf
ret
-.asm_7d756
+.done
scf
ccf
ret
-Audio3_7d759:
+Audio3_IsCry:
+; Returns whether the currently playing audio is a cry in carry.
ld a, [wChannelSoundIDs + Ch5]
- cp $14
- jr nc, .asm_7d762
- jr .asm_7d768
-.asm_7d762
- cp $86
- jr z, .asm_7d768
- jr c, .asm_7d76b
-.asm_7d768
+ cp CRY_SFX_START
+ jr nc, .next
+ jr .no
+.next
+ cp CRY_SFX_END
+ jr z, .no
+ jr c, .yes
+.no
scf
ccf
ret
-.asm_7d76b
+.yes
scf
ret
-Audio3_ApplyPitchBend:
+Audio3_ApplyPitchSlide:
ld hl, wChannelFlags1
add hl, bc
- bit 5, [hl]
- jp nz, .asm_7d7b4
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ bit BIT_PITCH_SLIDE_DECREASING, [hl]
+ jp nz, .frequencyDecreasing
+; frequency increasing
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld l, [hl]
ld h, b
@@ -1012,41 +1051,41 @@
add hl, de
ld d, h
ld e, l
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
push hl
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
pop hl
add [hl]
ld [hl], a
- ld a, $0
+ ld a, 0
adc e
ld e, a
- ld a, $0
+ ld a, 0
adc d
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
cp d
- jp c, .asm_7d7fa
- jr nz, .asm_7d7e7
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ jp c, .reachedTargetFrequency
+ jr nz, .applyUpdatedFrequency
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
cp e
- jp c, .asm_7d7fa
- jr .asm_7d7e7
-.asm_7d7b4
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ jp c, .reachedTargetFrequency
+ jr .applyUpdatedFrequency
+.frequencyDecreasing
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
ld e, [hl]
sub e
@@ -1054,7 +1093,7 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
ld a, [hl]
add a
@@ -1065,55 +1104,56 @@
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, d
cp [hl]
- jr c, .asm_7d7fa
- jr nz, .asm_7d7e7
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ jr c, .reachedTargetFrequency
+ jr nz, .applyUpdatedFrequency
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
cp [hl]
- jr c, .asm_7d7fa
-.asm_7d7e7
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ jr c, .reachedTargetFrequency
+.applyUpdatedFrequency
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
- ld b, $3
- call Audio3_7d8ac
+ ld b, REG_FREQUENCY_LO
+ call Audio3_GetRegisterPointer
ld a, e
ld [hli], a
ld [hl], d
ret
-.asm_7d7fa
+.reachedTargetFrequency
+; Turn off pitch slide when the target frequency has been reached.
ld hl, wChannelFlags1
add hl, bc
- res 4, [hl]
- res 5, [hl]
+ res BIT_PITCH_SLIDE_ON, [hl]
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
ret
-Audio3_7d803:
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+Audio3_InitPitchSlideVars:
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld [hl], d
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld [hl], e
ld hl, wChannelNoteDelayCounters
add hl, bc
ld a, [hl]
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
sub [hl]
- jr nc, .asm_7d81b
- ld a, $1
-.asm_7d81b
+ jr nc, .next
+ ld a, 1
+.next
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, e
sub [hl]
@@ -1120,74 +1160,84 @@
ld e, a
ld a, d
sbc b
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
sub [hl]
- jr c, .asm_7d837
+ jr c, .targetFrequencyGreater
ld d, a
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- set 5, [hl]
- jr .asm_7d85a
-.asm_7d837
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ set BIT_PITCH_SLIDE_DECREASING, [hl]
+ jr .next2
+.targetFrequencyGreater
+; If the target frequency is greater, subtract the current frequency from
+; the target frequency to get the absolute difference.
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, bc
ld d, [hl]
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, bc
ld e, [hl]
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, bc
ld a, [hl]
sub e
ld e, a
+
+; Bug. Instead of borrowing from the high byte of the target frequency as it
+; should, it borrows from the high byte of the current frequency instead.
+; This means that the result will be 0x200 greater than it should be if the
+; low byte of the current frequency is greater than the low byte of the
+; target frequency.
ld a, d
sbc b
ld d, a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, bc
ld a, [hl]
sub d
ld d, a
- ld b, $0
+ ld b, 0
ld hl, wChannelFlags1
add hl, bc
- res 5, [hl]
-.asm_7d85a
- ld hl, wChannelPitchBendLengthModifiers
+ res BIT_PITCH_SLIDE_DECREASING, [hl]
+
+.next2
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, bc
-.asm_7d85e
+.divideLoop
inc b
ld a, e
sub [hl]
ld e, a
- jr nc, .asm_7d85e
+ jr nc, .divideLoop
ld a, d
and a
- jr z, .asm_7d86c
+ jr z, .doneDividing
dec a
ld d, a
- jr .asm_7d85e
-.asm_7d86c
- ld a, e
+ jr .divideLoop
+.doneDividing
+ ld a, e ; a = remainder - dividend
add [hl]
- ld d, b
- ld b, $0
- ld hl, wChannelPitchBendFrequencySteps
+ ld d, b ; d = quotient + 1
+ ld b, 0
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, bc
- ld [hl], d
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld [hl], d ; store quotient + 1
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, bc
- ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld [hl], a ; store remainder - dividend
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, bc
- ld [hl], a
+ ld [hl], a ; store remainder - dividend
ret
-Audio3_ApplyDutyCycle:
- ld b, $0
- ld hl, wChannelDutyCycles
+Audio3_ApplyDutyCyclePattern:
+ ld b, 0
+ ld hl, wChannelDutyCyclePatterns
add hl, bc
ld a, [hl]
rlca
@@ -1195,8 +1245,8 @@
ld [hl], a
and $c0
ld d, a
- ld b, $1
- call Audio3_7d8ac
+ ld b, REG_DUTY_SOUND_LEN
+ call Audio3_GetRegisterPointer
ld a, [hl]
and $3f
or d
@@ -1204,7 +1254,7 @@
ret
Audio3_GetNextMusicByte:
- ld d, $0
+ ld d, 0
ld a, c
add a
ld e, a
@@ -1221,9 +1271,10 @@
ld [hl], d
ret
-Audio3_7d8ac:
+Audio3_GetRegisterPointer:
+; hl = address of hardware sound register b for software channel c
ld a, c
- ld hl, Unknown_7db8b
+ ld hl, Audio3_HWChannelBaseAddresses
add l
jr nc, .noCarry
inc h
@@ -1235,13 +1286,14 @@
ld h, $ff
ret
-Audio3_7d8bb:
- ld h, $0
+Audio3_MultiplyAdd:
+; hl = l + (a * de)
+ ld h, 0
.loop
srl a
- jr nc, .noCarry
+ jr nc, .skipAdd
add hl, de
-.noCarry
+.skipAdd
sla e
rl d
and a
@@ -1250,8 +1302,9 @@
.done
ret
-Audio3_7d8cc:
- ld h, $0
+Audio3_CalculateFrequency:
+; return the frequency for note a, octave b in de
+ ld h, 0
ld l, a
add hl, hl
ld d, h
@@ -1263,7 +1316,7 @@
ld d, [hl]
ld a, b
.loop
- cp $7
+ cp 7
jr z, .done
sra d
rr e
@@ -1270,7 +1323,7 @@
inc a
jr .loop
.done
- ld a, $8
+ ld a, 8
add d
ld d, a
ret
@@ -1278,14 +1331,15 @@
Audio3_PlaySound::
ld [wSoundID], a
cp $ff
- jp z, Audio3_7daa8
- cp $c2
- jp z, Audio3_7d9c2
- jp c, Audio3_7d9c2
+ jp z, .stopAllAudio
+ cp MAX_SFX_ID_3
+ jp z, .playSfx
+ jp c, .playSfx
cp $fe
- jr z, .asm_7d901
- jp nc, Audio3_7d9c2
-.asm_7d901
+ jr z, .playMusic
+ jp nc, .playSfx
+
+.playMusic
xor a
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
@@ -1294,53 +1348,53 @@
ld [wSfxWaveInstrument], a
ld d, $8
ld hl, wChannelReturnAddresses
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelCommandPointers
- call FillAudioRAM3
+ call .FillMem
ld d, $4
ld hl, wChannelSoundIDs
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelFlags1
- call FillAudioRAM3
- ld hl, wChannelDuties
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelDutyCycles
- call FillAudioRAM3
+ call .FillMem
+ ld hl, wChannelDutyCyclePatterns
+ call .FillMem
ld hl, wChannelVibratoDelayCounters
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelVibratoExtents
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelVibratoRates
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelFrequencyLowBytes
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelVibratoDelayCounterReloadValues
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelFlags2
- call FillAudioRAM3
- ld hl, wChannelPitchBendLengthModifiers
- call FillAudioRAM3
- ld hl, wChannelPitchBendFrequencySteps
- call FillAudioRAM3
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
- call FillAudioRAM3
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
- call FillAudioRAM3
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
- call FillAudioRAM3
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
- call FillAudioRAM3
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
- call FillAudioRAM3
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
- call FillAudioRAM3
+ call .FillMem
+ ld hl, wChannelPitchSlideLengthModifiers
+ call .FillMem
+ ld hl, wChannelPitchSlideFrequencySteps
+ call .FillMem
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
+ call .FillMem
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
+ call .FillMem
ld a, $1
ld hl, wChannelLoopCounters
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelNoteDelayCounters
- call FillAudioRAM3
+ call .FillMem
ld hl, wChannelNoteSpeeds
- call FillAudioRAM3
+ call .FillMem
ld [wMusicTempo], a
ld a, $ff
ld [wStereoPanning], a
@@ -1348,7 +1402,7 @@
ld [rNR50], a
ld a, $8
ld [rNR10], a
- ld a, $0
+ ld a, 0
ld [rNR51], a
xor a
ld [rNR30], a
@@ -1356,12 +1410,12 @@
ld [rNR30], a
ld a, $77
ld [rNR50], a
- jp Audio3_7db03
+ jp .playSoundCommon
-Audio3_7d9c2:
+.playSfx
ld l, a
ld e, a
- ld h, $0
+ ld h, 0
ld d, h
add hl, hl
add hl, de
@@ -1376,13 +1430,13 @@
rlca
rlca
ld c, a
-.asm_7d9db
+.sfxChannelLoop
ld d, c
ld a, c
add a
add c
ld c, a
- ld b, $0
+ ld b, 0
ld a, [wSfxHeaderPointer]
ld h, a
ld a, [wSfxHeaderPointer + 1]
@@ -1391,32 +1445,32 @@
ld c, d
ld a, [hl]
and $f
- ld e, a
- ld d, $0
+ ld e, a ; software channel ID
+ ld d, 0
ld hl, wChannelSoundIDs
add hl, de
ld a, [hl]
and a
- jr z, .asm_7da17
+ jr z, .playChannel
ld a, e
- cp $7
- jr nz, .asm_7da0e
+ cp Ch8
+ jr nz, .notNoiseChannel
ld a, [wSoundID]
- cp $14
- jr nc, .asm_7da07
+ cp NOISE_INSTRUMENTS_END
+ jr nc, .notNoiseInstrument
ret
-.asm_7da07
+.notNoiseInstrument
ld a, [hl]
- cp $14
- jr z, .asm_7da17
- jr c, .asm_7da17
-.asm_7da0e
+ cp NOISE_INSTRUMENTS_END
+ jr z, .playChannel
+ jr c, .playChannel
+.notNoiseChannel
ld a, [wSoundID]
cp [hl]
- jr z, .asm_7da17
- jr c, .asm_7da17
+ jr z, .playChannel
+ jr c, .playChannel
ret
-.asm_7da17
+.playChannel
xor a
push de
ld h, d
@@ -1439,10 +1493,10 @@
ld hl, wChannelFlags1
add hl, de
ld [hl], a
- ld hl, wChannelDuties
+ ld hl, wChannelDutyCycles
add hl, de
ld [hl], a
- ld hl, wChannelDutyCycles
+ ld hl, wChannelDutyCyclePatterns
add hl, de
ld [hl], a
ld hl, wChannelVibratoDelayCounters
@@ -1460,28 +1514,28 @@
ld hl, wChannelVibratoDelayCounterReloadValues
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendLengthModifiers
+ ld hl, wChannelPitchSlideLengthModifiers
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencySteps
+ ld hl, wChannelPitchSlideFrequencySteps
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendFrequencyStepsFractionalPart
+ ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
+ ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyHighBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendCurrentFrequencyLowBytes
+ ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyHighBytes
+ ld hl, wChannelPitchSlideTargetFrequencyHighBytes
add hl, de
ld [hl], a
- ld hl, wChannelPitchBendTargetFrequencyLowBytes
+ ld hl, wChannelPitchSlideTargetFrequencyLowBytes
add hl, de
ld [hl], a
ld hl, wChannelFlags2
@@ -1498,35 +1552,35 @@
add hl, de
ld [hl], a
ld a, e
- cp $4
- jr nz, .asm_7da9f
+ cp Ch5
+ jr nz, .skipSweepDisable
ld a, $8
- ld [rNR10], a
-.asm_7da9f
+ ld [rNR10], a ; sweep off
+.skipSweepDisable
ld a, c
and a
- jp z, Audio3_7db03
+ jp z, .playSoundCommon
dec c
- jp .asm_7d9db
+ jp .sfxChannelLoop
-Audio3_7daa8:
+.stopAllAudio
ld a, $80
- ld [rNR52], a
- ld [rNR30], a
+ ld [rNR52], a ; sound hardware on
+ ld [rNR30], a ; wave playback on
xor a
- ld [rNR51], a
- ld [rNR32], a
+ ld [rNR51], a ; no sound output
+ ld [rNR32], a ; mute channel 3 (wave channel)
ld a, $8
- ld [rNR10], a
- ld [rNR12], a
- ld [rNR22], a
- ld [rNR42], a
+ ld [rNR10], a ; sweep off
+ ld [rNR12], a ; mute channel 1 (pulse channel 1)
+ ld [rNR22], a ; mute channel 2 (pulse channel 2)
+ ld [rNR42], a ; mute channel 4 (noise channel)
ld a, $40
- ld [rNR14], a
+ ld [rNR14], a ; counter mode
ld [rNR24], a
ld [rNR44], a
ld a, $77
- ld [rNR50], a
+ ld [rNR50], a ; full volume
xor a
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
@@ -1537,11 +1591,11 @@
ld [wSfxWaveInstrument], a
ld d, $a0
ld hl, wChannelCommandPointers
- call FillAudioRAM3
+ call .FillMem
ld a, $1
ld d, $18
ld hl, wChannelNoteDelayCounters
- call FillAudioRAM3
+ call .FillMem
ld [wMusicTempo], a
ld [wSfxTempo], a
ld a, $ff
@@ -1549,7 +1603,7 @@
ret
; fills d bytes at hl with a
-FillAudioRAM3:
+.FillMem
ld b, d
.loop
ld [hli], a
@@ -1557,11 +1611,11 @@
jr nz, .loop
ret
-Audio3_7db03:
+.playSoundCommon
ld a, [wSoundID]
ld l, a
ld e, a
- ld h, $0
+ ld h, 0
ld d, h
add hl, hl
add hl, de
@@ -1581,19 +1635,19 @@
ld b, c
inc b
inc de
- ld c, $0
-.asm_7db25
+ ld c, 0
+.commandPointerLoop
cp c
- jr z, .asm_7db2d
+ jr z, .next
inc c
inc hl
inc hl
- jr .asm_7db25
-.asm_7db2d
+ jr .commandPointerLoop
+.next
push hl
push bc
push af
- ld b, $0
+ ld b, 0
ld c, a
ld hl, wChannelSoundIDs
add hl, bc
@@ -1600,12 +1654,12 @@
ld a, [wSoundID]
ld [hl], a
pop af
- cp $3
- jr c, .asm_7db46
+ cp Ch4
+ jr c, .skipSettingFlag
ld hl, wChannelFlags1
add hl, bc
- set 2, [hl]
-.asm_7db46
+ set BIT_NOISE_OR_SFX, [hl]
+.skipSettingFlag
pop bc
pop hl
ld a, [de] ; get channel pointer
@@ -1620,52 +1674,53 @@
and a
ld a, [de]
inc de
- jr nz, .asm_7db25
+ jr nz, .commandPointerLoop
ld a, [wSoundID]
- cp $14
- jr nc, .asm_7db5f
- jr .asm_7db89
-.asm_7db5f
+ cp CRY_SFX_START
+ jr nc, .maybeCry
+ jr .done
+.maybeCry
ld a, [wSoundID]
- cp $86
- jr z, .asm_7db89
- jr c, .asm_7db6a
- jr .asm_7db89
-.asm_7db6a
+ cp CRY_SFX_END
+ jr z, .done
+ jr c, .cry
+ jr .done
+.cry
ld hl, wChannelSoundIDs + Ch5
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
- ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx noise channel pointer
- ld de, Noise3_endchannel
+ ld hl, wChannelCommandPointers + Ch7 * 2 ; sfx wave channel pointer
+ ld de, Audio3_CryRet
ld [hl], e
inc hl
- ld [hl], d ; overwrite pointer to point to endchannel
+ ld [hl], d ; overwrite pointer to point to sound_ret
ld a, [wSavedVolume]
and a
- jr nz, .asm_7db89
+ jr nz, .done
ld a, [rNR50]
ld [wSavedVolume], a
ld a, $77
- ld [rNR50], a
-.asm_7db89
+ ld [rNR50], a ; full volume
+.done
ret
-Noise3_endchannel:
+Audio3_CryRet:
sound_ret
-Unknown_7db8b:
- db $10, $15, $1A, $1F ; channels 0-3
- db $10, $15, $1A, $1F ; channels 4-7
+Audio3_HWChannelBaseAddresses:
+; the low bytes of each HW channel's base address
+ db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 0-3
+ db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 4-7
-Unknown_7db93:
- db $EE, $DD, $BB, $77 ; channels 0-3
- db $EE, $DD, $BB, $77 ; channels 4-7
+Audio3_HWChannelDisableMasks:
+ db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 0-3
+ db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 4-7
-Unknown_7db9b:
- db $11, $22, $44, $88 ; channels 0-3
- db $11, $22, $44, $88 ; channels 4-7
+Audio3_HWChannelEnableMasks:
+ db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 0-3
+ db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 4-7
Audio3_Pitches:
dw $F82C ; C_
@@ -1680,5 +1735,3 @@
dw $FB58 ; A_
dw $FB9B ; A#
dw $FBDA ; B_
-
-
--- a/audio/music/yellow/meetjessiejames.asm
+++ b/audio/music/yellow/meetjessiejames.asm
@@ -306,4 +306,3 @@
note E_, 1
rest 1
sound_loop 0, Music_MeetJessieJames_branch_83235
- sound_ret
--- a/constants/music_constants.asm
+++ b/constants/music_constants.asm
@@ -20,19 +20,27 @@
REG_VOLUME_ENVELOPE EQU 2
REG_FREQUENCY_LO EQU 3
-MAX_SFX_ID EQU $B9
+MAX_SFX_ID_1 EQUS "SFX_SAFARI_ZONE_PA"
+MAX_SFX_ID_2 EQUS "SFX_SILPH_SCOPE"
+MAX_SFX_ID_3 EQUS "SFX_SHOOTING_STAR"
-CRY_SFX_START EQU $14
-CRY_SFX_END EQU $86
+NOISE_INSTRUMENTS_START EQUS "SFX_NOISE_INSTRUMENT01"
+NOISE_INSTRUMENTS_END EQUS "SFX_NOISE_INSTRUMENT19 + 1"
+CRY_SFX_START EQUS "SFX_CRY_00"
+CRY_SFX_END EQUS "SFX_CRY_25 + 3"
+
+BATTLE_SFX_START EQUS "SFX_PECK"
+BATTLE_SFX_END EQUS "SFX_SILPH_SCOPE + 1"
+
; wChannelFlags1 constants
-BIT_PERFECT_PITCH EQU 0 ; controlled by toggleperfectpitch command
-BIT_CHANNEL_CALL EQU 1 ; if in channel call
-BIT_NOISE_OR_SFX EQU 2 ; if channel is the music noise channel or an SFX channel
-BIT_VIBRATO_DIRECTION EQU 3 ; if the pitch is above or below normal (cycles)
-BIT_PITCH_BEND_ON EQU 4 ; if pitch bend is active
-BIT_PITCH_BEND_DECREASING EQU 5 ; if the pitch bend frequency is decreasing (instead of increasing)
-BIT_ROTATE_DUTY EQU 6 ; if rotating duty
+BIT_PERFECT_PITCH EQU 0 ; controlled by toggle_perfect_pitch command
+BIT_SOUND_CALL EQU 1 ; if in sound call
+BIT_NOISE_OR_SFX EQU 2 ; if channel is the music noise channel or an SFX channel
+BIT_VIBRATO_DIRECTION EQU 3 ; if the pitch is above or below normal (cycles)
+BIT_PITCH_SLIDE_ON EQU 4 ; if pitch slide is active
+BIT_PITCH_SLIDE_DECREASING EQU 5 ; if the pitch slide frequency is decreasing (instead of increasing)
+BIT_ROTATE_DUTY_CYCLE EQU 6 ; if rotating duty cycle
; wChannelFlags2 constant (only has one flag)
BIT_EXECUTE_MUSIC EQU 0 ; if in execute music
--- a/macros/audio_macros.asm
+++ b/macros/audio_macros.asm
@@ -86,6 +86,14 @@
db \1
ENDM
+;format: instrument [1, 3-10], length (in 16ths)
+; like dnote but one 1 byte instead of 2
+; can only be used with instruments 1-10, excluding 2
+; unused
+dnote_short: MACRO
+ db (\1 << 4) | (\2 - 1)
+ENDM
+
;format: length (in 16ths)
rest: MACRO
db $C0 | (\1 - 1)
--- a/wram.asm
+++ b/wram.asm
@@ -101,10 +101,10 @@
wChannelFlags2:: ; c036
ds 8
-wChannelDuties:: ; c03e
+wChannelDutyCycles:: ; c03e
ds 8
-wChannelDutyCycles:: ; c046
+wChannelDutyCyclePatterns:: ; c046
ds 8
wChannelVibratoDelayCounters:: ; c04e
@@ -126,28 +126,28 @@
; delay of the beginning of the vibrato from the start of the note
ds 8
-wChannelPitchBendLengthModifiers:: ; c076
+wChannelPitchSlideLengthModifiers:: ; c076
ds 8
-wChannelPitchBendFrequencySteps:: ; c07e
+wChannelPitchSlideFrequencySteps:: ; c07e
ds 8
-wChannelPitchBendFrequencyStepsFractionalPart:: ; c086
+wChannelPitchSlideFrequencyStepsFractionalPart:: ; c086
ds 8
-wChannelPitchBendCurrentFrequencyFractionalPart:: ; c08e
+wChannelPitchSlideCurrentFrequencyFractionalPart:: ; c08e
ds 8
-wChannelPitchBendCurrentFrequencyHighBytes:: ; c096
+wChannelPitchSlideCurrentFrequencyHighBytes:: ; c096
ds 8
-wChannelPitchBendCurrentFrequencyLowBytes:: ; c09e
+wChannelPitchSlideCurrentFrequencyLowBytes:: ; c09e
ds 8
-wChannelPitchBendTargetFrequencyHighBytes:: ; c0a6
+wChannelPitchSlideTargetFrequencyHighBytes:: ; c0a6
ds 8
-wChannelPitchBendTargetFrequencyLowBytes:: ; c0ae
+wChannelPitchSlideTargetFrequencyLowBytes:: ; c0ae
ds 8
wChannelNoteDelayCounters:: ; c0b6