diff options
author | DizzyEggg <jajkodizzy@wp.pl> | 2017-09-02 17:03:46 +0200 |
---|---|---|
committer | DizzyEggg <jajkodizzy@wp.pl> | 2017-09-02 17:03:46 +0200 |
commit | 591837e3c33837e72dd1282d59159999ba344ac3 (patch) | |
tree | 19b93b57a6ea8ff192edd93adaa46c98f0a30a02 /src | |
parent | 2089dd0f86559d8cbbfba1e3effec22ad538662f (diff) |
decompile sound.s
Diffstat (limited to 'src')
-rw-r--r-- | src/sound.c | 274 | ||||
-rw-r--r-- | src/text.c | 10 |
2 files changed, 269 insertions, 15 deletions
diff --git a/src/sound.c b/src/sound.c index 31e97b132..7b94a8027 100644 --- a/src/sound.c +++ b/src/sound.c @@ -8,6 +8,8 @@ #include "songs.h" #include "task.h" +extern u16 SpeciesToCryId(u16); + struct Fanfare { u16 songNum; @@ -32,15 +34,8 @@ extern struct MusicPlayerInfo gMPlay_SE1; extern struct MusicPlayerInfo gMPlay_SE2; extern struct MusicPlayerInfo gMPlay_SE3; -extern struct ToneData voicegroup_8452590[]; -extern struct ToneData voicegroup_8452B90[]; -extern struct ToneData voicegroup_8453190[]; -extern struct ToneData voicegroup_8453790[]; - -extern struct ToneData voicegroup_84537C0[]; -extern struct ToneData voicegroup_8453DC0[]; -extern struct ToneData voicegroup_84543C0[]; -extern struct ToneData voicegroup_84549C0[]; +extern struct ToneData gCryTable[]; +extern struct ToneData gCryTable2[]; extern const struct Fanfare sFanfares[]; @@ -48,7 +43,7 @@ static void Task_Fanfare(u8 taskId); static void CreateFanfareTask(void); void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode); static void Task_DuckBGMForPokemonCry(u8 taskId); -void RestoreBGMVolumeAfterPokemonCry(void); +static void RestoreBGMVolumeAfterPokemonCry(void); #define CRY_VOLUME 120 // was 125 in R/S @@ -356,3 +351,262 @@ void PlayCry5(u16 species, u8 mode) gPokemonCryBGMDuckingCounter = 2; RestoreBGMVolumeAfterPokemonCry(); } + +void PlayCryInternal(u16 species, s8 pan, s8 volume, u8 priority, u8 mode) +{ + bool32 v0; + u32 release; + u32 length; + u32 pitch; + u32 chorus; + u32 index; + u8 table; + + species--; + length = 140; + v0 = FALSE; + release = 0; + pitch = 15360; + chorus = 0; + + switch (mode) + { + case 0: + break; + case 1: + length = 20; + release = 225; + break; + case 2: + release = 225; + pitch = 15600; + chorus = 20; + volume = 90; + break; + case 3: + length = 50; + release = 200; + pitch = 15800; + chorus = 20; + volume = 90; + break; + case 4: + length = 25; + v0 = TRUE; + release = 100; + pitch = 15600; + chorus = 192; + volume = 90; + break; + case 5: + release = 200; + pitch = 14440; + break; + case 6: + release = 220; + pitch = 15555; + chorus = 192; + volume = 70; + break; + case 7: + length = 10; + release = 100; + pitch = 14848; + break; + case 8: + length = 60; + release = 225; + pitch = 15616; + break; + case 9: + length = 15; + v0 = TRUE; + release = 125; + pitch = 15200; + break; + case 10: + length = 100; + release = 225; + pitch = 15200; + break; + case 12: + length = 20; + release = 225; + case 11: + pitch = 15000; + break; + } + + SetPokemonCryVolume(volume); + SetPokemonCryPanpot(pan); + SetPokemonCryPitch(pitch); + SetPokemonCryLength(length); + SetPokemonCryProgress(0); + SetPokemonCryRelease(release); + SetPokemonCryChorus(chorus); + SetPokemonCryPriority(priority); + + // This is a fancy way to get a cry of a pokemon. + // It creates 4 sets of 128 mini cry tables. + // If you wish to expand pokemon, you need to + // append new cases to the switch. + species = SpeciesToCryId(species); + index = species & 0x7F; + table = species / 128; + + switch (table) + { + case 0: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &gCryTable2[(128 * 0) + index] : &gCryTable[(128 * 0) + index]); + break; + case 1: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &gCryTable2[(128 * 1) + index] : &gCryTable[(128 * 1) + index]); + break; + case 2: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &gCryTable2[(128 * 2) + index] : &gCryTable[(128 * 2) + index]); + break; + case 3: + gMPlay_PokemonCry = SetPokemonCryTone( + v0 ? &gCryTable2[(128 * 3) + index] : &gCryTable[(128 * 3) + index]); + break; + } +} + +bool8 IsCryFinished(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) == TRUE) + { + return FALSE; + } + else + { + ClearPokemonCrySongs(); + return TRUE; + } +} + +void StopCryAndClearCrySongs(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); + ClearPokemonCrySongs(); +} + +void StopCry(void) +{ + m4aMPlayStop(gMPlay_PokemonCry); +} + +bool8 IsCryPlayingOrClearCrySongs(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + return TRUE; + } + else + { + ClearPokemonCrySongs(); + return FALSE; + } +} + +bool8 IsCryPlaying(void) +{ + if (IsPokemonCryPlaying(gMPlay_PokemonCry)) + return TRUE; + else + return FALSE; +} + +static void Task_DuckBGMForPokemonCry(u8 taskId) +{ + if (gPokemonCryBGMDuckingCounter) + { + gPokemonCryBGMDuckingCounter--; + return; + } + + if (!IsPokemonCryPlaying(gMPlay_PokemonCry)) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + DestroyTask(taskId); + } +} + +static void RestoreBGMVolumeAfterPokemonCry(void) +{ + if (FuncIsActiveTask(Task_DuckBGMForPokemonCry) != TRUE) + CreateTask(Task_DuckBGMForPokemonCry, 80); +} + +void PlayBGM(u16 songNum) +{ + if (gDisableMusic) + songNum = 0; + if (songNum == 0xFFFF) + songNum = 0; + m4aSongNumStart(songNum); +} + +void PlaySE(u16 songNum) +{ + m4aSongNumStart(songNum); +} + +void PlaySE12WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void PlaySE1WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE1); + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); +} + +void PlaySE2WithPanning(u16 songNum, s8 pan) +{ + m4aSongNumStart(songNum); + m4aMPlayImmInit(&gMPlay_SE2); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +void SE12PanpotControl(s8 pan) +{ + m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan); + m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan); +} + +bool8 IsSEPlaying(void) +{ + if ((gMPlay_SE1.status & MUSICPLAYER_STATUS_PAUSE) && (gMPlay_SE2.status & MUSICPLAYER_STATUS_PAUSE)) + return FALSE; + if (!(gMPlay_SE1.status & MUSICPLAYER_STATUS_TRACK) && !(gMPlay_SE2.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsBGMPlaying(void) +{ + if (gMPlay_BGM.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_BGM.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} + +bool8 IsSpecialSEPlaying(void) +{ + if (gMPlay_SE3.status & MUSICPLAYER_STATUS_PAUSE) + return FALSE; + if (!(gMPlay_SE3.status & MUSICPLAYER_STATUS_TRACK)) + return FALSE; + return TRUE; +} diff --git a/src/text.c b/src/text.c index 2bf882a56..6754e1a42 100644 --- a/src/text.c +++ b/src/text.c @@ -12,7 +12,7 @@ extern u8 GetKeypadIconWidth(u8 keypadIconId); extern void CopyWindowToVram(u8 windowId, u8 mode); extern u16 Font6Func(struct TextPrinter *textPrinter); extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); -extern void audio_play(u16 songNum); +extern void PlaySE(u16 songNum); extern u8* sub_81AFC74(u8 a1); EWRAM_DATA struct TextPrinter gTempTextPrinter = {0}; @@ -1986,7 +1986,7 @@ bool8 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter) if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { result = TRUE; - audio_play(5); + PlaySE(5); } } return result; @@ -2004,7 +2004,7 @@ bool8 TextPrinterWait(struct TextPrinter *textPrinter) if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { result = TRUE; - audio_play(5); + PlaySE(5); } } return result; @@ -2394,7 +2394,7 @@ _08005A76:\n\ add r1, #0x1\n\ str r1, [r6]\n\ add r0, r3, #0\n\ - bl audio_play\n\ + bl PlaySE\n\ b _08005A0A\n\ _08005A90:\n\ ldr r1, [r6]\n\ @@ -2751,7 +2751,7 @@ _08005D44:\n\ strb r0, [r6, #0x1C]\n\ b _08005B56\n\ _08005D48:\n\ - bl mplay_has_finished_maybe\n\ + bl IsSEPlaying\n\ lsl r0, #24\n\ lsr r0, #24\n\ cmp r0, #0\n\ |