diff options
Diffstat (limited to 'audio/engine.asm')
-rw-r--r-- | audio/engine.asm | 337 |
1 files changed, 164 insertions, 173 deletions
diff --git a/audio/engine.asm b/audio/engine.asm index c8e976cc4..2cc921bd0 100644 --- a/audio/engine.asm +++ b/audio/engine.asm @@ -111,7 +111,7 @@ _UpdateSound:: ; e805c cp $2 ; 1 or 0? jr c, .noteover dec [hl] - jr .asm_e8093 + jr .continue_sound_update .noteover ; reset vibrato delay @@ -124,12 +124,11 @@ _UpdateSound:: ; e805c ; turn vibrato off for now ld hl, Channel1Flags2 - Channel1 add hl, bc - res SOUND_UNKN_09, [hl] + res SOUND_PITCH_WHEEL, [hl] ; get next note call ParseMusic -.asm_e8093 - ; - call Functione84f9 +.continue_sound_update + call ApplyPitchWheel ; duty cycle ld hl, Channel1DutyCycle - Channel1 add hl, bc @@ -143,8 +142,8 @@ _UpdateSound:: ; e805c ld [wCurTrackFrequency], a ld a, [hl] ld [wCurTrackFrequency + 1], a - ; - call Functione8466 ; handle vibrato and other things + ; vibrato, noise + call HandleTrackVibrato ; handle vibrato and other things call HandleNoise ; turn off music when playing sfx? ld a, [SFXPriority] @@ -176,19 +175,19 @@ _UpdateSound:: ; e805c ; are we in a sfx channel right now? ld a, [CurChannel] cp $4 ; sfx - jr nc, .asm_e80ee + jr nc, .sfx_channel ld hl, Channel5Flags - Channel1 add hl, bc bit SOUND_CHANNEL_ON, [hl] - jr nz, .asm_e80fc -.asm_e80ee + jr nz, .sound_channel_on +.sfx_channel call UpdateChannels ld hl, Channel1Tracks - Channel1 add hl, bc ld a, [SoundOutput] or [hl] ld [SoundOutput], a -.asm_e80fc +.sound_channel_on ; clear note flags ld hl, Channel1NoteFlags - Channel1 add hl, bc @@ -232,7 +231,6 @@ UpdateChannels: ; e8125 ld l, a jp [hl] - .ChannelFnPtrs: dw .Channel1 dw .Channel2 @@ -260,21 +258,21 @@ UpdateChannels: ; e8125 .asm_e8159 bit NOTE_REST, [hl] ; rest jr nz, .ch1rest - bit NOTE_UNKN_4, [hl] + bit NOTE_NOISE_SAMPLING, [hl] jr nz, .asm_e81a2 - bit NOTE_UNKN_1, [hl] - jr nz, .asm_e816b - bit NOTE_UNKN_6, [hl] + bit NOTE_FREQ_OVERRIDE, [hl] + jr nz, .frequency_override + bit NOTE_VIBRATO_OVERRIDE, [hl] jr nz, .asm_e8184 - jr .asm_e8175 + jr .check_duty_override -.asm_e816b +.frequency_override ld a, [wCurTrackFrequency] ld [rNR13], a ld a, [wCurTrackFrequency + 1] ld [rNR14], a -.asm_e8175 - bit NOTE_UNKN_0, [hl] +.check_duty_override + bit NOTE_DUTY_OVERRIDE, [hl] ret z ld a, [wCurTrackDuty] ld d, a @@ -323,11 +321,11 @@ UpdateChannels: ; e8125 add hl, bc bit NOTE_REST, [hl] ; rest jr nz, .ch2rest - bit NOTE_UNKN_4, [hl] + bit NOTE_NOISE_SAMPLING, [hl] jr nz, .asm_e8204 - bit NOTE_UNKN_6, [hl] + bit NOTE_VIBRATO_OVERRIDE, [hl] jr nz, .asm_e81e6 - bit NOTE_UNKN_0, [hl] + bit NOTE_DUTY_OVERRIDE, [hl] ret z ld a, [wCurTrackDuty] ld d, a @@ -383,9 +381,9 @@ UpdateChannels: ; e8125 add hl, bc bit NOTE_REST, [hl] ; rest jr nz, .ch3rest - bit NOTE_UNKN_4, [hl] + bit NOTE_NOISE_SAMPLING, [hl] jr nz, .asm_e824d - bit NOTE_UNKN_6, [hl] + bit NOTE_VIBRATO_OVERRIDE, [hl] jr nz, .asm_e823a ret @@ -484,7 +482,7 @@ endr add hl, bc bit NOTE_REST, [hl] ; rest jr nz, .ch4rest - bit NOTE_UNKN_4, [hl] + bit NOTE_NOISE_SAMPLING, [hl] jr nz, .asm_e82d4 ret @@ -644,7 +642,6 @@ FadeMusic: ; e8358 dec a jr .updatevolume - .novolume ; make sure volume is off xor a @@ -719,16 +716,16 @@ FadeMusic: ; e8358 ; e83d1 LoadNote: ; e83d1 - ; check mute?? + ; wait for pitch wheel to finish ld hl, Channel1Flags2 - Channel1 add hl, bc - bit SOUND_UNKN_09, [hl] + bit SOUND_PITCH_WHEEL, [hl] ret z ; get note duration ld hl, Channel1NoteDuration - Channel1 add hl, bc ld a, [hl] - ld hl, wc297 ; ???? + ld hl, wCurNoteDuration sub [hl] jr nc, .ok ld a, 1 @@ -740,8 +737,8 @@ LoadNote: ; e83d1 ld e, [hl] inc hl ld d, [hl] - ; ???? - ld hl, Channel1Field0x21 - Channel1 + ; get direction of pitch wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e sub [hl] @@ -749,15 +746,13 @@ LoadNote: ; e83d1 ld a, d sbc a, 0 ld d, a - ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc sub [hl] jr nc, .greater_than - ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - set SOUND_UNKN_11, [hl] + set SOUND_PITCH_WHEEL_DIR, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc @@ -765,7 +760,7 @@ LoadNote: ; e83d1 inc hl ld d, [hl] ; ???? - ld hl, Channel1Field0x21 - Channel1 + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, [hl] sub e @@ -774,7 +769,7 @@ LoadNote: ; e83d1 sbc a, 0 ld d, a ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, [hl] sub d @@ -782,18 +777,17 @@ LoadNote: ; e83d1 jr .resume .greater_than - ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - res SOUND_UNKN_11, [hl] + res SOUND_PITCH_WHEEL_DIR, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc ld e, [hl] inc hl ld d, [hl] - ; ???? - ld hl, Channel1Field0x21 - Channel1 + ; get distance from pitch wheel target + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e sub [hl] @@ -801,15 +795,17 @@ LoadNote: ; e83d1 ld a, d sbc a, 0 ld d, a - ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc sub [hl] ld d, a .resume + ; de = x * [wCurNoteDuration] + y + ; x + 1 -> d + ; y -> a push bc - ld hl, wc297 - ld b, 0; loop count + ld hl, wCurNoteDuration + ld b, 0 ; quotient .loop inc b ld a, e @@ -823,18 +819,16 @@ LoadNote: ; e83d1 jr .loop .quit - ld a, e ; result + ld a, e ; remainder add [hl] - ld d, b ; loop count - ; ???? + ld d, b ; quotient pop bc - ld hl, Channel1Field0x23 - Channel1 + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc - ld [hl], d - ld hl, Channel1Field0x24 - Channel1 + ld [hl], d ; quotient + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc - ld [hl], a - ; clear ???? + ld [hl], a ; remainder ld hl, Channel1Field0x25 - Channel1 add hl, bc xor a @@ -843,14 +837,13 @@ LoadNote: ; e83d1 ; e8466 -Functione8466: ; e8466 -; handle vibrato and other things -; unknowns: wCurTrackDuty, wCurTrackFrequency +HandleTrackVibrato: ; e8466 +; handle duty, cry pitch, and vibrato ld hl, Channel1Flags2 - Channel1 add hl, bc bit SOUND_DUTY, [hl] ; duty jr z, .next - ld hl, Channel1Field0x1c - Channel1 + ld hl, Channel1SFXDutyLoop - Channel1 add hl, bc ld a, [hl] rlca @@ -860,7 +853,7 @@ Functione8466: ; e8466 ld [wCurTrackDuty], a ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_0, [hl] + set NOTE_DUTY_OVERRIDE, [hl] .next ld hl, Channel1Flags2 - Channel1 add hl, bc @@ -937,9 +930,9 @@ Functione8466: ; e8466 ld d, a ld a, e sub d - jr nc, .asm_e84ef + jr nc, .no_carry ld a, 0 - jr .asm_e84ef + jr .no_carry .down ; vibrato up @@ -950,24 +943,24 @@ Functione8466: ; e8466 swap a ; move it to lo ; add e - jr nc, .asm_e84ef + jr nc, .no_carry ld a, $ff -.asm_e84ef +.no_carry ld [wCurTrackFrequency], a ; ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_6, [hl] + set NOTE_VIBRATO_OVERRIDE, [hl] .quit ret ; e84f9 -Functione84f9: ; e84f9 - ; quit if ???? +ApplyPitchWheel: ; e84f9 + ; quit if pitch wheel inactive ld hl, Channel1Flags2 - Channel1 add hl, bc - bit SOUND_UNKN_09, [hl] + bit SOUND_PITCH_WHEEL, [hl] ret z ; de = Frequency ld hl, Channel1Frequency - Channel1 @@ -975,24 +968,24 @@ Functione84f9: ; e84f9 ld e, [hl] inc hl ld d, [hl] - ; + ; check whether pitch wheel is going up or down ld hl, Channel1Flags3 - Channel1 add hl, bc - bit SOUND_UNKN_11, [hl] - jr z, .next - ; - ld hl, Channel1Field0x23 - Channel1 + bit SOUND_PITCH_WHEEL_DIR, [hl] + jr z, .decreasing + ; frequency += [Channel*PitchWheelAmount] + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc ld l, [hl] ld h, 0 add hl, de ld d, h ld e, l - ; get ???? - ld hl, Channel1Field0x24 - Channel1 + ; [Channel*Field0x25] += [Channel*PitchWheelAmountFraction] + ; if rollover: Frequency += 1 + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc ld a, [hl] - ; add it to ???? ld hl, Channel1Field0x25 - Channel1 add hl, bc add [hl] @@ -1003,23 +996,26 @@ Functione84f9: ; e84f9 ld a, 0 adc d ld d, a - ; - ld hl, Channel1Field0x22 - Channel1 + ; Compare the dw at [Channel*PitchWheelTarget] to de. + ; If frequency is greater, we're finished. + ; Otherwise, load the frequency and set two flags. + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, [hl] cp d - jp c, .quit1 - jr nz, .quit2 - ld hl, Channel1Field0x21 - Channel1 + jp c, .finished_pitch_wheel + jr nz, .continue_pitch_wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, [hl] cp e - jp c, .quit1 - jr .quit2 + jp c, .finished_pitch_wheel + jr .continue_pitch_wheel -.next +.decreasing + ; frequency -= [Channel*PitchWheelAmount] ld a, e - ld hl, Channel1Field0x23 - Channel1 + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc ld e, [hl] sub e @@ -1027,7 +1023,9 @@ Functione84f9: ; e84f9 ld a, d sbc a, 0 ld d, a - ld hl, Channel1Field0x24 - Channel1 + ; [Channel*Field0x25] *= 2 + ; if rollover: Frequency -= 1 + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc ld a, [hl] add a @@ -1037,28 +1035,31 @@ Functione84f9: ; e84f9 ld e, a ld a, d sbc a, 0 - ld d,a - ld hl, Channel1Field0x22 - Channel1 + ld d, a + ; Compare the dw at [Channel*PitchWheelTarget] to de. + ; If frequency is lower, we're finished. + ; Otherwise, load the frequency and set two flags. + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, d cp [hl] - jr c, .quit1 - jr nz, .quit2 - ld hl, Channel1Field0x21 - Channel1 + jr c, .finished_pitch_wheel + jr nz, .continue_pitch_wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e cp [hl] - jr nc, .quit2 -.quit1 + jr nc, .continue_pitch_wheel +.finished_pitch_wheel ld hl, Channel1Flags2 - Channel1 add hl, bc - res SOUND_UNKN_09, [hl] + res SOUND_PITCH_WHEEL, [hl] ld hl, Channel1Flags3 - Channel1 add hl, bc - res SOUND_UNKN_11, [hl] + res SOUND_PITCH_WHEEL_DIR, [hl] ret -.quit2 +.continue_pitch_wheel ld hl, Channel1Frequency - Channel1 add hl, bc ld [hl], e @@ -1066,8 +1067,8 @@ Functione84f9: ; e84f9 ld [hl], d ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_1, [hl] - set NOTE_UNKN_0, [hl] + set NOTE_FREQ_OVERRIDE, [hl] + set NOTE_DUTY_OVERRIDE, [hl] ret ; e858c @@ -1144,7 +1145,7 @@ ReadNoiseSample: ; e85af ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_4, [hl] + set NOTE_NOISE_SAMPLING, [hl] ret .quit @@ -1170,9 +1171,9 @@ ParseMusic: ; e85e1 ld hl, Channel1Flags - Channel1 add hl, bc bit SOUND_SFX, [hl] - jp nz, Functione8698 + jp nz, ParseSFXOrRest bit SOUND_REST, [hl] ; rest - jp nz, Functione8698 + jp nz, ParseSFXOrRest bit SOUND_NOISE, [hl] ; noise sample jp nz, GetNoiseSample ; normal note @@ -1205,11 +1206,9 @@ ParseMusic: ; e85e1 ; ???? ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_4, [hl] + set NOTE_NOISE_SAMPLING, [hl] jp LoadNote - - .rest ; note = rest ld hl, Channel1NoteFlags - Channel1 @@ -1217,7 +1216,6 @@ ParseMusic: ; e85e1 set NOTE_REST, [hl] ; Rest ret -; .endchannel ; $ff is reached in music data ld hl, Channel1Flags - Channel1 @@ -1286,11 +1284,11 @@ RestoreVolume: ; e8679 ; e8698 -Functione8698: ; e8698 +ParseSFXOrRest: ; e8698 ; turn noise sampling on ld hl, Channel1NoteFlags - Channel1 add hl, bc - set NOTE_UNKN_4, [hl] ; noise sample + set NOTE_NOISE_SAMPLING, [hl] ; noise sample ; update note duration ld a, [CurMusicByte] call SetNoteDuration ; top nybble doesnt matter? @@ -1348,9 +1346,8 @@ GetNoiseSample: ; e86c5 ld d, 0 ; load ptr to noise sample set in hl ld hl, Drumkits -rept 2 add hl, de -endr + add hl, de ld a, [hli] ld h, [hl] ld l, a @@ -1363,9 +1360,8 @@ endr ; use 'pitch' to seek noise sample set ld e, a ld d, 0 -rept 2 add hl, de -endr + add hl, de ; load sample pointer into NoiseSampleAddress ld a, [hli] ld [NoiseSampleAddressLo], a @@ -1387,9 +1383,8 @@ ParseMusicCommand: ; e870f ld d, 0 ; seek command pointer ld hl, MusicCommands -rept 2 add hl, de -endr + add hl, de ; jump to the new pointer ld a, [hli] ld h, [hl] @@ -1415,9 +1410,9 @@ MusicCommands: ; e8720 dw Music_DutyCycle ; duty cycle dw Music_Intensity ; intensity dw Music_SoundStatus ; update sound status - dw MusicDE ; ???? + duty cycle - dw Music_ToggleSFX ; - dw MusicE0 ; + dw Music_SoundDuty ; sfx duty + dw Music_ToggleSFX ; sound on/off + dw Music_SlidePitchTo ; pitch wheel dw Music_Vibrato ; vibrato dw MusicE2 ; unused dw Music_ToggleNoise ; music noise sampling @@ -1443,8 +1438,8 @@ MusicCommands: ; e8720 dw MusicF7 ; nothing dw MusicF8 ; nothing dw MusicF9 ; unused - dw Music_SetCondition ; - dw Music_JumpIf ; + dw Music_SetCondition ; setcondition + dw Music_JumpIf ; jumpif dw Music_JumpChannel ; jump dw Music_LoopChannel ; loop dw Music_CallChannel ; call @@ -1639,9 +1634,8 @@ Music_JumpIf: ; e8817 inc hl ld d, [hl] ; skip pointer -rept 2 inc de -endr + inc de ; update address ld [hl], d dec hl @@ -1693,9 +1687,8 @@ MusicEE; e883e inc hl ld d, [hl] ; skip pointer -rept 2 inc de -endr + inc de ; update address ld [hl], d dec hl @@ -1801,38 +1794,42 @@ Music_Vibrato: ; e8882 ; e88bd -MusicE0: ; e88bd -; ???? +Music_SlidePitchTo: ; e88bd +; set the target for pitch wheel ; params: 2 +; note duration +; target note call GetMusicByte - ld [wc297], a + ld [wCurNoteDuration], a call GetMusicByte + ; pitch in e ld d, a and $f ld e, a + ; octave in d ld a, d swap a and $f ld d, a call GetFrequency - ld hl, Channel1Field0x21 - Channel1 + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld [hl], e - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld [hl], d ld hl, Channel1Flags2 - Channel1 add hl, bc - set SOUND_UNKN_09, [hl] + set SOUND_PITCH_WHEEL, [hl] ret ; e88e4 Music_Tone: ; e88e4 ; tone -; params: 2 +; params: 1 (dw) ld hl, Channel1Flags2 - Channel1 add hl, bc set SOUND_CRY_PITCH, [hl] @@ -1860,18 +1857,17 @@ MusicE7: ; e88f7 ; e8906 -MusicDE: ; e8906 -; ???? + duty cycle -; params: 1 - ; +Music_SoundDuty: ; e8906 +; sequence of 4 duty cycles to be looped +; params: 1 (4 2-bit duty cycle arguments) ld hl, Channel1Flags2 - Channel1 add hl, bc set SOUND_DUTY, [hl] ; duty cycle - ; + ; sound duty sequence call GetMusicByte rrca rrca - ld hl, Channel1Field0x1c - Channel1 + ld hl, Channel1SFXDutyLoop - Channel1 add hl, bc ld [hl], a ; update duty cycle @@ -2055,7 +2051,7 @@ Music_ForceOctave: ; e89b1 ; this forces all notes up by the starting octave ; params: 1 call GetMusicByte - ld hl, Channel1StartingOctave - Channel1 + ld hl, Channel1PitchOffset - Channel1 add hl, bc ld [hl], a ret @@ -2247,7 +2243,7 @@ GetFrequency: ; e8a5d ; get octave ; get starting octave - ld hl, Channel1StartingOctave - Channel1 + ld hl, Channel1PitchOffset - Channel1 add hl, bc ld a, [hl] swap a ; hi nybble @@ -2256,7 +2252,7 @@ GetFrequency: ; e8a5d add d push af ; we'll use this later ; get starting octave - ld hl, Channel1StartingOctave - Channel1 + ld hl, Channel1PitchOffset - Channel1 add hl, bc ld a, [hl] and $f ; lo nybble @@ -2494,9 +2490,9 @@ _PlayCryHeader:: ; e8b79 ; 3-byte pointers (bank, address) ld hl, Cries -rept 3 add hl, de -endr + add hl, de + add hl, de ld a, [hli] ld [MusicBank], a @@ -2574,7 +2570,6 @@ endr dec a jr nz, .loop - ; Cries play at max volume, so we save the current volume for later. ld a, [LastVolume] and a @@ -2694,7 +2689,6 @@ _PlaySFX:: ; e8c04 ; e8ca6 - PlayStereoSFX:: ; e8ca6 ; play sfx de @@ -2713,9 +2707,9 @@ PlayStereoSFX:: ; e8ca6 ; get sfx ptr ld hl, SFX -rept 3 add hl, de -endr + add hl, de + add hl, de ; bank ld a, [hli] @@ -2798,7 +2792,6 @@ endr ; e8d1b - LoadChannel: ; e8d1b ; prep channel for use ; input: @@ -2811,9 +2804,8 @@ LoadChannel: ; e8d1b ld c, a ld b, 0 ld hl, ChannelPointers -rept 2 add hl, bc -endr + add hl, bc ld c, [hl] inc hl ld b, [hl] ; bc = channel pointer @@ -2891,31 +2883,31 @@ LoadMusicByte:: ; e8d76 ; e8d80 FrequencyTable: ; e8d80 - dw 0 ; filler - dw $f82c - dw $f89d - dw $f907 - dw $f96b - dw $f9ca - dw $fa23 - dw $fa77 - dw $fac7 - dw $fb12 - dw $fb58 - dw $fb9b - dw $fbda - dw $fc16 - dw $fc4e - dw $fc83 - dw $fcb5 - dw $fce5 - dw $fd11 - dw $fd3b - dw $fd63 - dw $fd89 - dw $fdac - dw $fdcd - dw $fded + dw 0 ; __ + dw $f82c ; C_ + dw $f89d ; C# + dw $f907 ; D_ + dw $f96b ; D# + dw $f9ca ; E_ + dw $fa23 ; F_ + dw $fa77 ; F# + dw $fac7 ; G_ + dw $fb12 ; G# + dw $fb58 ; A_ + dw $fb9b ; A# + dw $fbda ; B_ + dw $fc16 ; C_ + dw $fc4e ; C# + dw $fc83 ; D_ + dw $fcb5 ; D# + dw $fce5 ; E_ + dw $fd11 ; F_ + dw $fd3b ; F# + dw $fd63 ; G_ + dw $fd89 ; G# + dw $fdac ; A_ + dw $fdcd ; A# + dw $fded ; B_ ; e8db2 WaveSamples: ; e8db2 @@ -3282,9 +3274,8 @@ ClearChannels:: ; e8fe9 ; doesn't seem to be used, but functionally identical to MapSetup_Sound_Off ld hl, rNR50 xor a -rept 2 ld [hli], a -endr + ld [hli], a ld a, $80 ld [hli], a ld hl, rNR10 |