Audio pitch correction PoC

This commit is contained in:
Fazana
2021-09-10 14:18:23 +01:00
parent 295ec48802
commit b5f10496d2
14 changed files with 91 additions and 75 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -19,6 +19,14 @@
#define BAD_RETURN(cmd) cmd
#endif
struct Config
{
f32 audioFrequency;
#ifdef WIDE
s16 widescreen;
#endif
u8 tvType;
};
struct Controller
{

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;

View File

@@ -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

View File

@@ -20,6 +20,7 @@ struct StructSH8031D9B0 {
s16 unk0C;
s16 unk0E;
};
extern struct Config gConfig;
extern OSThread D_80339210;
extern OSThread gIdleThread;

View File

@@ -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},

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,