decompile sound.s
This commit is contained in:
+264
-10
@@ -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;
|
||||
}
|
||||
|
||||
+5
-5
@@ -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\
|
||||
|
||||
Reference in New Issue
Block a user