You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
Audio pitch correction PoC
This commit is contained in:
@@ -26,13 +26,13 @@
|
||||
.ascii "E" /* NTSC-U (North America) */
|
||||
#endif
|
||||
#if defined(SRAM)
|
||||
.byte 0x30 /* Version */
|
||||
.byte 0x32 /* Version */
|
||||
#elif defined(EEP16K)
|
||||
.byte 0x20 /* Version */
|
||||
.byte 0x22 /* Version */
|
||||
#elif defined(SRAM768K)
|
||||
.byte 0x40 /* Version */
|
||||
.byte 0x42 /* Version */
|
||||
#elif defined(FLASHRAM)
|
||||
.byte 0x50 /* Version */
|
||||
.byte 0x52 /* Version */
|
||||
#else
|
||||
.byte 0x10 /* Version */
|
||||
.byte 0x12 /* Version */
|
||||
#endif
|
||||
|
||||
@@ -69,4 +69,8 @@
|
||||
#define VIRTUAL_TO_PHYSICAL2(addr) ((void *)(addr))
|
||||
#endif
|
||||
|
||||
#define MODE_NTSC 0
|
||||
#define MODE_MPAL 1
|
||||
#define MODE_PAL 2
|
||||
|
||||
#endif // MACROS_H
|
||||
|
||||
@@ -19,6 +19,14 @@
|
||||
#define BAD_RETURN(cmd) cmd
|
||||
#endif
|
||||
|
||||
struct Config
|
||||
{
|
||||
f32 audioFrequency;
|
||||
#ifdef WIDE
|
||||
s16 widescreen;
|
||||
#endif
|
||||
u8 tvType;
|
||||
};
|
||||
|
||||
struct Controller
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "load.h"
|
||||
#include "data.h"
|
||||
#include "seqplayer.h"
|
||||
#include "game/main.h"
|
||||
|
||||
#ifdef VERSION_JP
|
||||
#define US_FLOAT2(x) x##.0
|
||||
@@ -73,7 +74,7 @@ static void sequence_channel_process_sound(struct SequenceChannel *seqChannel) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
struct SequenceChannelLayer *layer = seqChannel->layers[i];
|
||||
if (layer != NULL && layer->enabled && layer->note != NULL) {
|
||||
layer->noteFreqScale = layer->freqScale * seqChannel->freqScale;
|
||||
layer->noteFreqScale = layer->freqScale * seqChannel->freqScale * gConfig.audioFrequency;
|
||||
layer->noteVelocity = layer->velocitySquare * channelVolume;
|
||||
layer->notePan = (layer->pan * panLayerWeight) + panFromChannel;
|
||||
}
|
||||
@@ -402,7 +403,7 @@ s32 adsr_update(struct AdsrState *adsr) {
|
||||
restart:
|
||||
#endif
|
||||
// fall through
|
||||
|
||||
|
||||
case ADSR_STATE_LOOP:
|
||||
adsr->delay = BSWAP16(adsr->envelope[adsr->envIndex].delay);
|
||||
switch (adsr->delay) {
|
||||
|
||||
@@ -1013,7 +1013,6 @@ void clear_curr_ai_buffer(void) {
|
||||
s32 audio_shut_down_and_reset_step(void) {
|
||||
s32 i;
|
||||
s32 j;
|
||||
OSTime first;
|
||||
|
||||
switch (gAudioResetStatus) {
|
||||
case 5:
|
||||
@@ -1050,7 +1049,6 @@ s32 audio_shut_down_and_reset_step(void) {
|
||||
case 1:
|
||||
audio_reset_session();
|
||||
gAudioResetStatus = 0;
|
||||
first = osGetTime();
|
||||
for (i = 0; i < NUMAIBUFFERS; i++) {
|
||||
gAiBufferLengths[i] = gAudioBufferParameters.maxAiBufferLength;
|
||||
}
|
||||
@@ -1082,37 +1080,26 @@ void wait_for_audio_frames(s32 frames) {
|
||||
|
||||
s32 sAudioFirstBoot = 0;
|
||||
//Separate the reverb settings into their own func. Bit unstable currently, so still only runs at boot.
|
||||
#ifdef VERSION_EU
|
||||
#if defined(VERSION_EU) || defined(VERSION_SH)
|
||||
void init_reverb_eu(void)
|
||||
{
|
||||
s16 *mem;
|
||||
struct AudioSessionSettingsEU *preset = &gAudioSessionPresets[0];
|
||||
struct SynthesisReverb *reverb;
|
||||
struct ReverbSettingsEU *reverbSettings;
|
||||
s32 j, i;
|
||||
for (j = 0; j < 4; j++) {
|
||||
s32 i, j;
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
gSynthesisReverbs[j].useReverb = 0;
|
||||
}
|
||||
//gAudioResetPresetIdToLoad
|
||||
gNumSynthesisReverbs = preset->numReverbs;
|
||||
for (j = 0; j < gNumSynthesisReverbs; j++) {
|
||||
for (j = 0; j < gNumSynthesisReverbs; j++)
|
||||
{
|
||||
reverb = &gSynthesisReverbs[j];
|
||||
reverbSettings = &sReverbSettings[j];
|
||||
#ifdef VERSION_SH
|
||||
reverb->downsampleRate = reverbSettings->downsampleRate;
|
||||
reverb->windowSize = reverbSettings->windowSize * 64;
|
||||
reverb->windowSize /= reverb->downsampleRate;
|
||||
#else
|
||||
reverbSettings = &sReverbSettings[gAudioResetPresetIdToLoad+j];
|
||||
reverb->windowSize = reverbSettings->windowSize * 64;
|
||||
reverb->downsampleRate = reverbSettings->downsampleRate;
|
||||
#endif
|
||||
reverb->reverbGain = reverbSettings->gain;
|
||||
#ifdef VERSION_SH
|
||||
reverb->panRight = reverbSettings->unk4;
|
||||
reverb->panLeft = reverbSettings->unk6;
|
||||
reverb->unk5 = reverbSettings->unk8;
|
||||
reverb->unk08 = reverbSettings->unkA;
|
||||
#endif
|
||||
reverb->useReverb = 8;
|
||||
reverb->ringBuffer.left = soundAlloc(&gNotesAndBuffersPool, reverb->windowSize * 2);
|
||||
reverb->ringBuffer.right = soundAlloc(&gNotesAndBuffersPool, reverb->windowSize * 2);
|
||||
@@ -1121,19 +1108,17 @@ void init_reverb_eu(void)
|
||||
reverb->curFrame = 0;
|
||||
reverb->bufSizePerChannel = reverb->windowSize;
|
||||
reverb->framesLeftToIgnore = 2;
|
||||
#ifdef VERSION_SH
|
||||
reverb->resampleFlags = A_INIT;
|
||||
#endif
|
||||
if (reverb->downsampleRate != 1) {
|
||||
#ifndef VERSION_SH
|
||||
reverb->resampleFlags = A_INIT;
|
||||
#endif
|
||||
if (sAudioFirstBoot)
|
||||
return;
|
||||
if (reverb->downsampleRate != 1)
|
||||
{
|
||||
reverb->resampleRate = 0x8000 / reverb->downsampleRate;
|
||||
reverb->resampleStateLeft = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
reverb->resampleStateRight = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
reverb->unk24 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
reverb->unk28 = soundAlloc(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
for (i = 0; i < gAudioBufferParameters.updatesPerFrame; i++) {
|
||||
for (i = 0; i < gAudioBufferParameters.updatesPerFrame; i++)
|
||||
{
|
||||
mem = soundAlloc(&gNotesAndBuffersPool, DEFAULT_LEN_2CH);
|
||||
reverb->items[0][i].toDownsampleLeft = mem;
|
||||
reverb->items[0][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
|
||||
@@ -1142,47 +1127,35 @@ void init_reverb_eu(void)
|
||||
reverb->items[1][i].toDownsampleRight = mem + DEFAULT_LEN_1CH / sizeof(s16);
|
||||
}
|
||||
}
|
||||
#ifdef VERSION_SH
|
||||
if (reverbSettings->unkC != 0) {
|
||||
reverb->unk108 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
reverb->unk100 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 8 * sizeof(s16));
|
||||
func_sh_802F0DE8(reverb->unk100, reverbSettings->unkC);
|
||||
} else {
|
||||
reverb->unk100 = NULL;
|
||||
}
|
||||
if (reverbSettings->unkE != 0) {
|
||||
reverb->unk10C = sound_alloc_uninitialized(&gNotesAndBuffersPool, 16 * sizeof(s16));
|
||||
reverb->unk104 = sound_alloc_uninitialized(&gNotesAndBuffersPool, 8 * sizeof(s16));
|
||||
func_sh_802F0DE8(reverb->unk104, reverbSettings->unkE);
|
||||
} else {
|
||||
reverb->unk104 = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(VERSION_JP) || defined(VERSION_US)
|
||||
void audio_reset_session(struct AudioSessionSettings *preset) {
|
||||
if (sAudioFirstBoot)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#else
|
||||
void audio_reset_session(void) {
|
||||
if (sAudioFirstBoot)
|
||||
{
|
||||
//init_reverb_eu();
|
||||
init_reverb_eu();
|
||||
return;
|
||||
}
|
||||
struct AudioSessionSettingsEU *preset = &gAudioSessionPresets[0];
|
||||
#endif
|
||||
s16 *mem;
|
||||
#if defined(VERSION_JP) || defined(VERSION_US)
|
||||
s8 updatesPerFrame;
|
||||
s32 reverbWindowSize;
|
||||
s32 k;
|
||||
s16 *mem;
|
||||
s32 i;
|
||||
#endif
|
||||
#ifdef PUPPYPRINT
|
||||
OSTime first = osGetTime();
|
||||
#endif
|
||||
s32 i;
|
||||
s32 j;
|
||||
s32 persistentMem;
|
||||
s32 temporaryMem;
|
||||
@@ -1194,8 +1167,6 @@ void audio_reset_session(void) {
|
||||
#ifdef BETTER_REVERB
|
||||
s8 reverbConsole;
|
||||
#endif
|
||||
#else
|
||||
struct SynthesisReverb *reverb;
|
||||
#endif
|
||||
#ifdef VERSION_EU
|
||||
eu_stubbed_printf_1("Heap Reconstruct Start %x\n", gAudioResetPresetIdToLoad);
|
||||
|
||||
@@ -51,6 +51,8 @@ OSMesg gUnknownMesgBuf[16];
|
||||
|
||||
OSViMode VI;
|
||||
|
||||
struct Config gConfig;
|
||||
|
||||
struct VblankHandler *gVblankHandler1 = NULL;
|
||||
struct VblankHandler *gVblankHandler2 = NULL;
|
||||
struct VblankHandler *gVblankHandler3 = NULL;
|
||||
@@ -450,6 +452,34 @@ void change_vi(OSViMode *mode, int width, int height){
|
||||
}
|
||||
}
|
||||
|
||||
void get_audio_frequency(void)
|
||||
{
|
||||
switch (gConfig.tvType)
|
||||
{
|
||||
#if defined(VERSION_JP) || defined(VERSION_US)
|
||||
case MODE_NTSC:
|
||||
gConfig.audioFrequency = 1.0f;
|
||||
break;
|
||||
case MODE_MPAL:
|
||||
gConfig.audioFrequency = 0.9915f;
|
||||
break;
|
||||
case MODE_PAL:
|
||||
gConfig.audioFrequency = 0.9876f;
|
||||
break;
|
||||
#else
|
||||
case MODE_NTSC:
|
||||
gConfig.audioFrequency = 1.0126f;
|
||||
break;
|
||||
case MODE_MPAL:
|
||||
gConfig.audioFrequency = 1.0086f;
|
||||
break;
|
||||
case MODE_PAL:
|
||||
gConfig.audioFrequency = 1.0f;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize hardware, start main thread, then idle.
|
||||
*/
|
||||
@@ -461,18 +491,22 @@ void thread1_idle(UNUSED void *arg) {
|
||||
// NTSC
|
||||
//osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
|
||||
VI = osViModeTable[OS_VI_NTSC_LAN1];
|
||||
gConfig.tvType = MODE_NTSC;
|
||||
break;
|
||||
case OS_TV_MPAL:
|
||||
// MPAL
|
||||
//osViSetMode(&osViModeTable[OS_VI_MPAL_LAN1]);
|
||||
VI = osViModeTable[OS_VI_MPAL_LAN1];
|
||||
VI = osViModeTable[OS_VI_NTSC_LAN1];
|
||||
gConfig.tvType = MODE_MPAL;
|
||||
break;
|
||||
case OS_TV_PAL:
|
||||
// PAL
|
||||
//osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]);
|
||||
VI = osViModeTable[OS_VI_PAL_LAN1];
|
||||
VI = osViModeTable[OS_VI_NTSC_LAN1];
|
||||
gConfig.tvType = MODE_PAL;
|
||||
break;
|
||||
}
|
||||
get_audio_frequency();
|
||||
change_vi(&VI, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||
osViSetMode(&VI);
|
||||
osViBlack(TRUE);
|
||||
|
||||
@@ -83,9 +83,6 @@ UNUSED static s32 sUnusedGameInitValue = 0;
|
||||
|
||||
// General timer that runs as the game starts
|
||||
u32 gGlobalTimer = 0;
|
||||
#ifdef WIDE
|
||||
s16 gWidescreen;
|
||||
#endif
|
||||
u8 *gAreaSkyboxStart[AREA_COUNT];
|
||||
u8 *gAreaSkyboxEnd[AREA_COUNT];
|
||||
|
||||
@@ -740,7 +737,7 @@ void thread5_game_loop(UNUSED void *arg) {
|
||||
play_music(SEQ_PLAYER_SFX, SEQUENCE_ARGS(0, SEQ_SOUND_PLAYER), 0);
|
||||
set_sound_mode(save_file_get_sound_mode());
|
||||
#ifdef WIDE
|
||||
gWidescreen = save_file_get_widescreen_mode();
|
||||
gConfig.widescreen = save_file_get_widescreen_mode();
|
||||
#endif
|
||||
render_init();
|
||||
|
||||
|
||||
@@ -42,9 +42,6 @@ extern u8 *gGfxPoolEnd;
|
||||
extern struct GfxPool *gGfxPool;
|
||||
extern u8 gControllerBits;
|
||||
extern u8 gIsConsole;
|
||||
#ifdef WIDE
|
||||
extern s16 gWidescreen;
|
||||
#endif
|
||||
extern u8 gBorderHeight;
|
||||
#ifdef CUSTOM_DEBUG
|
||||
extern u8 gCustomDebugMode;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "types.h"
|
||||
#include "config.h"
|
||||
#include "puppycam2.h"
|
||||
#include "main.h"
|
||||
|
||||
u16 gDialogColorFadeTimer;
|
||||
s8 gLastDialogLineNum;
|
||||
@@ -1567,7 +1568,7 @@ void render_pause_red_coins(void) {
|
||||
void render_widescreen_setting(void) {
|
||||
gSPDisplayList(gDisplayListHead++, dl_ia_text_begin);
|
||||
gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, gDialogTextAlpha);
|
||||
if (!gWidescreen) {
|
||||
if (!gConfig.widescreen) {
|
||||
print_generic_string(10, 20, textCurrRatio43);
|
||||
print_generic_string(10, 7, textPressL);
|
||||
}
|
||||
@@ -1577,8 +1578,8 @@ void render_widescreen_setting(void) {
|
||||
}
|
||||
gSPDisplayList(gDisplayListHead++, dl_ia_text_end);
|
||||
if (gPlayer1Controller->buttonPressed & L_TRIG){
|
||||
gWidescreen ^= 1;
|
||||
save_file_set_widescreen_mode(gWidescreen);
|
||||
gConfig.widescreen ^= 1;
|
||||
save_file_set_widescreen_mode(gConfig.widescreen);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -20,6 +20,7 @@ struct StructSH8031D9B0 {
|
||||
s16 unk0C;
|
||||
s16 unk0E;
|
||||
};
|
||||
extern struct Config gConfig;
|
||||
|
||||
extern OSThread D_80339210;
|
||||
extern OSThread gIdleThread;
|
||||
|
||||
@@ -84,7 +84,7 @@ static const struct gPCOptionStruct
|
||||
static const struct gPCOptionStruct gPCOptions[]=
|
||||
{ //If the min and max are 0 and 1, then the value text is used, otherwise it's ignored.
|
||||
#ifdef WIDE
|
||||
{/*Option Name*/ 7, /*Option Variable*/ &gWidescreen, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE},
|
||||
{/*Option Name*/ 7, /*Option Variable*/ &gConfig.widescreen, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE},
|
||||
#endif
|
||||
#if MULTILANG
|
||||
{/*Option Name*/ 8, /*Option Variable*/ &gInGameLanguage, /*Option Value Text Start*/ 4, /*Option Minimum*/ 1, /*Option Maximum*/ 3},
|
||||
|
||||
@@ -251,7 +251,7 @@ static void geo_process_perspective(struct GraphNodePerspective *node) {
|
||||
u16 perspNorm;
|
||||
Mtx *mtx = alloc_display_list(sizeof(*mtx));
|
||||
#ifdef WIDE
|
||||
if (gWidescreen && (gCurrLevelNum != 0x01)){
|
||||
if (gConfig.widescreen && (gCurrLevelNum != 0x01)){
|
||||
aspect = 1.775f;
|
||||
} else {
|
||||
aspect = 1.33333f;
|
||||
@@ -259,6 +259,8 @@ static void geo_process_perspective(struct GraphNodePerspective *node) {
|
||||
#else
|
||||
aspect = 1.33333f;
|
||||
#endif
|
||||
if (!gIsConsole)
|
||||
aspect *= 3.0f;
|
||||
|
||||
if (gCamera)
|
||||
gWorldScale = MAX(((gCamera->pos[0] * gCamera->pos[0]) + (gCamera->pos[1] * gCamera->pos[1]) + (gCamera->pos[2] * gCamera->pos[2]))/67108864, 1.0f);
|
||||
|
||||
@@ -408,7 +408,7 @@ void puppycam_get_save(void)
|
||||
|
||||
gSaveBuffer.menuData[0].firstBoot = gSaveBuffer.menuData[0].firstBoot;
|
||||
#ifdef WIDE
|
||||
gWidescreen = save_file_get_widescreen_mode();
|
||||
gConfig.widescreen = save_file_get_widescreen_mode();
|
||||
#endif
|
||||
|
||||
puppycam_check_save();
|
||||
@@ -421,7 +421,7 @@ void puppycam_set_save(void)
|
||||
gSaveBuffer.menuData[0].firstBoot = 4;
|
||||
|
||||
#ifdef WIDE
|
||||
save_file_set_widescreen_mode(gWidescreen);
|
||||
save_file_set_widescreen_mode(gConfig.widescreen);
|
||||
#endif
|
||||
|
||||
gMainMenuDataModified = TRUE;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include "star_select.h"
|
||||
#include "text_strings.h"
|
||||
#include "prevent_bss_reordering.h"
|
||||
#include "game/game_init.h"
|
||||
#include "game/main.h"
|
||||
|
||||
/**
|
||||
* @file star_select.c
|
||||
@@ -94,7 +94,7 @@ void render_100_coin_star(u8 stars) {
|
||||
if (stars & (1 << 6)) {
|
||||
// If the 100 coin star has been collected, create a new star selector next to the coin score.
|
||||
#ifdef WIDE
|
||||
if (gWidescreen) {
|
||||
if (gConfig.widescreen) {
|
||||
sStarSelectorModels[6] = spawn_object_abs_with_rot(gCurrentObject, 0, MODEL_STAR,
|
||||
bhvActSelectorStarType, ((370*4.0f)/3), 24, -300, 0, 0, 0);
|
||||
} else {
|
||||
@@ -160,7 +160,7 @@ void bhv_act_selector_init(void) {
|
||||
|
||||
// Render star selector objects
|
||||
#ifdef WIDE
|
||||
if (gWidescreen) {
|
||||
if (gConfig.widescreen) {
|
||||
for (i = 0; i < sVisibleStars; i++) {
|
||||
sStarSelectorModels[i] =
|
||||
spawn_object_abs_with_rot(gCurrentObject, 0, selectorModelIDs[i], bhvActSelectorStarType,
|
||||
|
||||
Reference in New Issue
Block a user