summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-09-02 17:03:46 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2017-09-02 17:03:46 +0200
commit591837e3c33837e72dd1282d59159999ba344ac3 (patch)
tree19b93b57a6ea8ff192edd93adaa46c98f0a30a02 /src
parent2089dd0f86559d8cbbfba1e3effec22ad538662f (diff)
decompile sound.s
Diffstat (limited to 'src')
-rw-r--r--src/sound.c274
-rw-r--r--src/text.c10
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\