From 09f7f07827b925e9a772ecc0072e21be3e213e8d Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Fri, 27 Oct 2023 12:20:33 +0200 Subject: [PATCH] The sound update. --- src/field.asm | 24 +----- src/main.asm | 1 + src/res/sfx_data.inc | 157 +++++++++++++++------------------------- src/res/sources/sfx.fur | Bin 2312 -> 2289 bytes src/sfx.asm | 111 ++++++++++++++++++++-------- 5 files changed, 146 insertions(+), 147 deletions(-) diff --git a/src/field.asm b/src/field.asm index 12b2e62..2edd26a 100644 --- a/src/field.asm +++ b/src/field.asm @@ -1238,12 +1238,8 @@ FieldProcess:: ldh [hCurrentPieceY], a xor a, a ldh [hCurrentLockDelayRemaining], a - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jp nz, .draw - call SFXKill ld a, SFX_LOCK - call SFXEnqueue + call SFXTriggerNoise jp .draw ; If we press down, we want to do a soft drop. @@ -1342,12 +1338,8 @@ FieldProcess:: ; Play the firm drop sound, and also reset the lock delay since the piece stepped down. .playfirmdropsound - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, .postcheckforfirmdropsound - call SFXKill ld a, SFX_LAND - call SFXEnqueue + call SFXTriggerNoise ; If the down button is held, lock. .postcheckforfirmdropsound @@ -1428,12 +1420,8 @@ FieldProcess:: ; Play the locking sound and draw the piece. .dolock - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, .draw - call SFXKill ld a, SFX_LOCK - call SFXEnqueue + call SFXTriggerNoise jr .draw ; If we weren't grounded, reset the lock force. @@ -1825,12 +1813,8 @@ FieldDelay:: ret nz call ClearLines - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, :+ - call SFXKill ld a, SFX_LINE_CLEAR - call SFXEnqueue + call SFXTriggerNoise : ldh a, [hCurrentLineARE] ldh [hRemainingDelay], a diff --git a/src/main.asm b/src/main.asm index b27346e..9012594 100644 --- a/src/main.asm +++ b/src/main.asm @@ -131,6 +131,7 @@ Main:: EventLoop:: ; Play the sound effect, if any. call SFXPlay + call SFXPlayNoise ; Wrangle inputs and timers at the start of every frame. call GetInput diff --git a/src/res/sfx_data.inc b/src/res/sfx_data.inc index 634f632..bdf9b84 100644 --- a/src/res/sfx_data.inc +++ b/src/res/sfx_data.inc @@ -2,10 +2,8 @@ IF !DEF(SFX_DATA_INC) DEF SFX_DATA_INC EQU 1 SECTION "SFX Data", ROMX, BANK[2] +; These sound effects can contain any channel. sSFXPieceI:: - db REG_NR12_CH1_VOLEV, $00, REG_NR14_CH1_FRQHI, $80, REG_NR22_CH2_VOLEV, $00, REG_NR24_CH2_FRQHI, $80 - db REG_NR32_CH3_VOLUM, $00, REG_NR34_CH3_FRQHI, $80, REG_NR42_CH4_VOLEV, $00, REG_NR44_CH4_CNTRL, $80 - db REG_NR10_CH1_SWEEP, $00, REG_NR52_MASTERCTL, $8F, REG_NR51_MASTERPAN, $FF, REG_NR50_MVOLVINPN, $77 db REG_NR12_CH1_VOLEV, $F0, REG_NR22_CH2_VOLEV, $F0, REG_NR11_CH1_LENDT, $BF, REG_NR11_CH1_LENDT, $BF db REG_NR12_CH1_VOLEV, $F0, REG_NR13_CH1_FRQLO, $AC, REG_NR14_CH1_FRQHI, $85, REG_NR21_CH2_LENDT, $7F db REG_NR21_CH2_LENDT, $7F, REG_NR22_CH2_VOLEV, $80, REG_NR23_CH2_FRQLO, $14, REG_NR24_CH2_FRQHI, $87 @@ -1352,101 +1350,6 @@ sSFXIHSIRS:: db REG_NR12_CH1_VOLEV, $08, REG_NR12_CH1_VOLEV, $09, REG_NR12_CH1_VOLEV, $11, REG_NR12_CH1_VOLEV, $08 db REG_NR12_CH1_VOLEV, $09, REG_NR12_CH1_VOLEV, $11, REG_NR12_CH1_VOLEV, $08, $FE sSFXIHSIRSEnd:: -sSFXLineClear:: - db REG_NR12_CH1_VOLEV, $F0, REG_NR32_CH3_VOLUM, $20, REG_NR42_CH4_VOLEV, $F1, REG_NR11_CH1_LENDT, $7F - db REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $F0, REG_NR13_CH1_FRQLO, $9D, REG_NR14_CH1_FRQHI, $84 - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $57, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR13_CH1_FRQLO, $12, REG_NR14_CH1_FRQHI, $03, $FF - - db REG_NR13_CH1_FRQLO, $D2, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR11_CH1_LENDT, $7F, REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $80, REG_NR13_CH1_FRQLO, $39 - db REG_NR14_CH1_FRQHI, $81, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $47 - db REG_NR44_CH4_CNTRL, $80, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR12_CH1_VOLEV, $08, REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $80, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FE -sSFXLineClearEnd:: -sSFXLand:: - db REG_NR42_CH4_VOLEV, $21, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $C1, REG_NR43_CH4_FQRND, $00 - db REG_NR44_CH4_CNTRL, $80, $FE -sSFXLandEnd:: -sSFXLock:: - db REG_NR42_CH4_VOLEV, $F2, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $14 - db REG_NR44_CH4_CNTRL, $80, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F2, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $22, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FE -sSFXLockEnd:: sSFXLevelLock:: db REG_NR12_CH1_VOLEV, $F1, REG_NR11_CH1_LENDT, $7F, REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $F1 db REG_NR13_CH1_FRQLO, $A7, REG_NR14_CH1_FRQHI, $87, $FF, $FF, $FF, $FF @@ -2016,4 +1919,62 @@ sSFXReadyGo:: db REG_NR22_CH2_VOLEV, $11, REG_NR22_CH2_VOLEV, $08, $FE sSFXReadyGoEnd:: +; These sound effects contain only noise. +sSFXLineClear:: + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $57, REG_NR44_CH4_CNTRL, $80 + db $FF, $FF, $FF, $FF, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $47, REG_NR44_CH4_CNTRL, $80, + db $FE +sSFXLineClearEnd:: +sSFXLand:: + db REG_NR42_CH4_VOLEV, $21, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $C1, REG_NR43_CH4_FQRND, $00 + db REG_NR44_CH4_CNTRL, $80, $FE +sSFXLandEnd:: +sSFXLock:: + db REG_NR42_CH4_VOLEV, $F2, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $14 + db REG_NR44_CH4_CNTRL, $80, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F2, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $22, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FE +sSFXLockEnd:: + ENDC diff --git a/src/res/sources/sfx.fur b/src/res/sources/sfx.fur index c7e70a75324cdc809aba69a25b2fd3386f806dd7..b2b5f811dd68076c02181361a6006eaf88531b9d 100644 GIT binary patch literal 2289 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 diff --git a/src/sfx.asm b/src/sfx.asm index 0f1dc8b..a8ee8e4 100644 --- a/src/sfx.asm +++ b/src/sfx.asm @@ -66,6 +66,7 @@ INCLUDE "res/music_data.inc" SECTION "High SFX Variables", HRAM hPlayhead:: ds 2 hPlayQueue:: ds 4 +hNoisePlayhead:: ds 2 SECTION "SFX Functions", ROM0 @@ -86,6 +87,8 @@ SFXInit:: xor a, a ldh [hPlayhead], a ldh [hPlayhead+1], a + ldh [hNoisePlayhead], a + ldh [hNoisePlayhead+1], a ret @@ -151,6 +154,32 @@ SFXProcessQueue: ret +SFXTriggerNoise:: + cp a, SFX_LINE_CLEAR + jr nz, :+ + ld a, LOW(sSFXLineClear) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLineClear) + ldh [hNoisePlayhead+1], a + ret + +: cp a, SFX_LAND + jr nz, :+ + ld a, LOW(sSFXLand) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLand) + ldh [hNoisePlayhead+1], a + ret + +: cp a, SFX_LOCK + ret nz + ld a, LOW(sSFXLock) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLock) + ldh [hNoisePlayhead+1], a + ret + + ; Attempt to play the sound effect in A. Will enqueue the sound effect if the play routine is currently busy. SFXEnqueue:: ; If the playhead isn't null, then we're already playing something. @@ -340,35 +369,6 @@ SFXEnqueue:: ret - ; Pieces dropping -: cp a, SFX_LINE_CLEAR - jr nz, :+ - ld a, LOW(sSFXLineClear) - ldh [hPlayhead], a - ld a, HIGH(sSFXLineClear) - ldh [hPlayhead+1], a - call SFXPlay - ret - -: cp a, SFX_LAND - jr nz, :+ - ld a, LOW(sSFXLand) - ldh [hPlayhead], a - ld a, HIGH(sSFXLand) - ldh [hPlayhead+1], a - call SFXPlay - ret - -: cp a, SFX_LOCK - jr nz, :+ - ld a, LOW(sSFXLock) - ldh [hPlayhead], a - ld a, HIGH(sSFXLock) - ldh [hPlayhead+1], a - call SFXPlay - ret - - ; Leveling : cp a, SFX_LEVELLOCK jr nz, :+ @@ -435,6 +435,59 @@ SFXKill:: ret +SFXPlayNoise:: + ; Get the noise playhead. + ldh a, [hNoisePlayhead] + ld l, a + ldh a, [hNoisePlayhead+1] + ld h, a + or a, l + + ; Bail if it's null + ret z + + ld b, BANK("SFX Data") + rst RSTSwitchBank + + ; Get the register to write to +.noisereg + ld a, [hl] + inc hl + + ; If it's $FE, then we're done. + cp a, $FE + jr nz, :+ + rst RSTRestoreBank + xor a, a + ldh [hNoisePlayhead], a + ldh [hNoisePlayhead+1], a + ret + + ; If it's $FF, then we're done for this frame. +: cp a, $FF + jr z, .savenoiseplayhead + + ; Otherwise, put the register in C. + ld c, a + + ; Get the value to write. + ld a, [hl] + inc hl + + ; Write it and loop. + ldh [$ff00+c], a + jr .noisereg + + ; Save the playhead position. +.savenoiseplayhead + ld a, l + ldh [hNoisePlayhead], a + ld a, h + ldh [hNoisePlayhead+1], a + rst RSTRestoreBank + ret + + ; This play routine must be called every frame. SFXPlay:: ; Bank to correct bank.