diff --git a/README.md b/README.md
index ad31d9b2..c15fc5cb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# banjo (97.8580%)
+# banjo (98.0621%)
diff --git a/include/2.0L/PR/n_libaudio.h b/include/2.0L/PR/n_libaudio.h
index e3248169..184aa044 100644
--- a/include/2.0L/PR/n_libaudio.h
+++ b/include/2.0L/PR/n_libaudio.h
@@ -148,7 +148,7 @@ typedef struct {
} N_ALGenericEvent;
typedef struct {
- s16 type;
+ u16 type;
union {
ALMIDIEvent midi;
ALTempoEvent tempo;
diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg
index 87473591..64b21518 100644
--- a/progress/progress_core1.svg
+++ b/progress/progress_core1.svg
@@ -9,7 +9,7 @@
-
+
@@ -17,7 +17,7 @@
core1
- 97.0254%
- 97.0254%
+ 98.4321%
+ 98.4321%
\ No newline at end of file
diff --git a/progress/progress_total.svg b/progress/progress_total.svg
index 316298a5..f9f550f6 100644
--- a/progress/progress_total.svg
+++ b/progress/progress_total.svg
@@ -9,7 +9,7 @@
-
+
@@ -17,7 +17,7 @@
Banjo-Kazooie (us.v10)
- 97.8580%
- 97.8580%
+ 98.0621%
+ 98.0621%
\ No newline at end of file
diff --git a/src/core1/code_5650.c b/src/core1/code_5650.c
index 95ef078e..03c7ad01 100644
--- a/src/core1/code_5650.c
+++ b/src/core1/code_5650.c
@@ -4,18 +4,23 @@
#include "n_libaudio.h"
#include "n_synth.h"
-void func_802444C0(N_AL_Struct81s *arg0);
-void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2);
-
-
-
-void func_8024324C(N_ALSndPlayer *arg0);
-void func_80244190(N_AL_Struct81s *arg0);
+void func_802444C0(N_AL_Struct81s *arg0);
+void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2);
+void func_8024324C(N_ALSndPlayer *arg0);
+void func_802432F8(N_ALSndPlayer *sndp, N_ALEvent *event);
+void func_80243F84(N_AL_Struct81s *arg0);
+void func_80243FE4(N_AL_Struct81s *arg0);
+s32 func_80244110(u16 *arg0, u16 *arg1);
+void func_80244190(N_AL_Struct81s *arg0);
+void *func_80244608(ALBank *bank, s16 arg1, struct46s *arg2);
+void func_80244978(s32 arg0, s16 type, s32 arg2);
// extern ALEventUnknown;
/* .bss */
+#define CODE_5650_ABS(s) (((s) >= 0)? (s): -(s))
+
N_ALSndPlayer D_8027EEC0;
-u16 *D_8027EF14;
+s16 *D_8027EF14;
extern struct {
s32 volume[4];
}D_8027EF18;
@@ -68,7 +73,7 @@ void func_8024324C(N_ALSndPlayer *arg0)
do
{
- if ((new_var->nextEvent.type & 0xFFFFFFFF) == 0x20)
+ if ((s16)(new_var->nextEvent.type) == 0x20)
{
sp3C.type = 0x20;
alEvtqPostEvent(&new_var->evtq, (ALEvent *) (&sp3C), new_var->frameTime);
@@ -84,7 +89,263 @@ void func_8024324C(N_ALSndPlayer *arg0)
new_var->curTime += new_var->nextDelta;
}
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_5650/func_802432F8.s")
+void func_802432F8(N_ALSndPlayer *sndp, N_ALEvent *event) {
+ N_AL_Struct81s *temp_s0;
+ ALVoiceConfig spDC;
+ N_ALSndPlayer *temp_fp;
+ N_ALEvent *var_s5;
+ ALSound *temp_s1;
+
+ N_ALEvent spC0;
+ N_ALEvent spB0;
+ s32 spAC;
+ N_AL_Struct81s *temp_s6;
+ s32 spA4;
+ s32 temp_t6;
+ s32 var_v0;
+ bool var_s2;
+ s32 sp94;
+ s32 sp90;
+ N_ALVoice *voice;
+ ALKeyMap *keymap;
+
+ u16 sp86;
+ u16 sp84;
+ N_AL_Struct81s *sp80;
+ N_ALEvent sp70;
+ s32 var_v1_4;
+ s32 sp68;
+ u8 clamped_pan;
+
+ temp_fp = n_syn->n_sndp;
+ var_s5 = event;
+ sp94 = 1;
+ sp90 = 0;
+ temp_s0 = NULL;
+ temp_s6 = NULL;
+ do{
+ if (temp_s6 != NULL) {
+ spB0.msg.generic.data[0].i = temp_s0;
+ spB0.type = var_s5->type;
+ spB0.msg.generic.data[1].i = var_s5->msg.vol.delta;
+ var_s5 = (N_ALEvent *) &spB0;
+ }
+ temp_s0 = (N_AL_Struct81s*)var_s5->msg.generic.data[0].i;
+ temp_s1 = temp_s0->unk8;
+ if (temp_s1 == NULL) {
+ func_80244110(&sp86, &sp84);
+ return;
+ }
+ keymap = temp_s1->keyMap;
+ temp_s6 = temp_s0->node.next;
+ switch (var_s5->type) { /* irregular */
+ case 0x1:
+ if((temp_s0->unk40 != 5) && (temp_s0->unk40 != 4))
+ return;
+
+ spDC.fxBus = 0;
+ spDC.priority = (u8)temp_s0->unk36;
+ spDC.unityPitch = 0;
+ var_s2 = (D_802758D4 >= temp_fp->maxSounds); //SHOULD BE ^1
+ if (!(var_s2) || (temp_s0->unk3F & 0x10)) {
+ sp90 = n_alSynAllocVoice(&temp_s0->voice, &spDC);
+ }
+ if (sp90 == 0) {
+ if ((temp_s0->unk3F & 0x12) || (temp_s0->unk38 > 0)) {
+ temp_s0->unk40 = 4U;
+ temp_s0->unk38 = (s32) (temp_s0->unk38 - 1);
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) var_s5, 0x8235);
+ return;
+ }
+
+ if(var_s2){
+ sp80 = D_802758C0.unk4;
+ do{
+ if (!(sp80->unk3F & 0x12) && (sp80->unk3F & 0x4) && (sp80->unk40 != 3)) {
+ sp70.type = 0x80;
+ sp70.msg.generic.data[0].i = sp80;
+ sp80->unk40 = 3U;
+ var_s2 = 0;
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) &sp70, 0x3E8);
+ n_alSynSetVol(&sp80->voice, 0, 0x3E8);
+ }
+ sp80 = sp80->node.prev;
+ }while(var_s2 && sp80 != NULL);
+ if (!var_s2) {
+ temp_s0->unk38 = 2;
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) var_s5, 0x3E9);
+ }
+ else{
+ func_80243F84(temp_s0);
+ }
+ }
+ else{
+ func_80243F84(temp_s0);
+ }
+ return;
+ }
+ temp_s0->unk3F |= 4;
+ n_alSynStartVoice(&temp_s0->voice, temp_s1->wavetable);
+ temp_s0->unk40 = 1;
+ D_802758D4 += 1;
+ spAC = (s32) (((f32) temp_s1->envelope->attackTime / temp_s0->unk2C) / temp_s0->unk28);
+ spA4 = MAX(0, ((D_8027EF14[keymap->keyMin & 0x3F] * ((temp_s1->envelope->attackVolume * temp_s0->unk34 * temp_s1->sampleVolume) / 16129)) / 32767) - 1);
+ n_alSynSetVol(&temp_s0->voice, 0, 0);
+ n_alSynSetVol(&temp_s0->voice, (s16) spA4, spAC);
+ var_v1_4 = (temp_s0->unk3D + temp_s1->samplePan) - 0x40;
+ clamped_pan = MIN(MAX(var_v1_4, 0), 0x7F);
+ n_alSynSetPan(&temp_s0->voice, clamped_pan);
+ n_alSynSetPitch(&temp_s0->voice, temp_s0->unk2C * temp_s0->unk28);
+ if ((keymap->keyMax & 0xF) >= 0xE) {
+ var_v0= (keymap->keyMax & 0xF) * 8;
+ } else {
+ var_v0 = temp_s0->unk3E;
+ if (D_802758D0) {
+ var_v0 += (keymap->keyMax & 0xF) * 8;
+ }
+ }
+ var_v0 = MIN(0x7F, MAX(0, var_v0));
+ n_alSynSetFXMix(&temp_s0->voice, var_v0);
+ spC0.type = 0x40;
+ spC0.msg.generic.data[0].i = temp_s0;
+ spAC = (s32) (((f32) temp_s1->envelope->attackTime / temp_s0->unk2C) / temp_s0->unk28);
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) &spC0, spAC);
+
+ break;
+
+ case 0x2:
+ case 0x400:
+ case 0x1000:
+ if ((var_s5->type != 0x1000) || (temp_s0->unk3F & 2)) {
+ switch (temp_s0->unk40) { /* switch 1; irregular */
+ case 1: /* switch 1 */
+ func_80244050(&temp_fp->evtq, temp_s0, 0x40);
+ spAC = (s32) (((f32) temp_s1->envelope->releaseTime / temp_s0->unk28) / temp_s0->unk2C);
+ temp_s0->envPhase = 2;
+ temp_s0->unk48 = 0;
+ n_alSynSetVol(&temp_s0->voice, 0, spAC);
+ if (spAC != 0) {
+ spC0.type = 0x80;
+ spC0.msg.generic.data[0].i = temp_s0;
+ if (spAC <= 0x7D00) {
+ spAC = 0x7D00;
+ }
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) &spC0, spAC);
+ temp_s0->unk40 = 2U;
+ } else {
+ func_80243F84(temp_s0);
+ }
+ break;
+
+ case 4: /* switch 1 */
+ case 5: /* switch 1 */
+ func_80243F84(temp_s0);
+ break;
+ }
+ if (var_s5->type == 2) {
+ var_s5->type = 0x1000;
+ }
+
+ }
+
+ break;
+
+ case 0x4:
+ temp_s0->unk3D = var_s5->msg.generic.data[1].i;
+ if (temp_s0->unk40 == 1) {
+ clamped_pan = MIN(MAX((temp_s0->unk3D + temp_s1->samplePan) - 0x40, 0), 0x7F);
+ n_alSynSetPan(&temp_s0->voice, clamped_pan);
+ }
+
+ break;
+
+ case 0x10:
+ temp_s0->unk2C = var_s5->msg.generic.data[1].f;
+ if (temp_s0->unk40 == 1) {
+ n_alSynSetPitch(&temp_s0->voice, temp_s0->unk2C * temp_s0->unk28);
+ if (temp_s0->unk3F & 0x20) {
+ func_80243FE4(temp_s0);
+ }
+ }
+
+ break;
+
+ case 0x100:
+ temp_s0->unk3E = (u8) var_s5->msg.vol.delta;
+ if (temp_s0->unk40 == 1) {
+ if ((keymap->keyMax & 0xF) >= 0xE) {
+ var_v0 = (keymap->keyMax & 0xF) * 8;
+ } else {
+ var_v0 = temp_s0->unk3E;
+ if (D_802758D0 != 0) {
+ var_v0 += (keymap->keyMax & 0xF) * 8;
+ }
+ }
+
+ var_v0 = MIN(0x7F, MAX(0, var_v0));
+ n_alSynSetFXMix(&temp_s0->voice, var_v0);
+ }
+
+ break;
+
+ case 0x8:
+ temp_t6 = MAX(0, (((f32) D_8027EF14[keymap->keyMin & 0x3F] * ((temp_s0->unk44 * (f32) temp_s0->unk34 * (f32)temp_s1->sampleVolume) / 16129)) / 32767) - 1);
+ temp_s0->unk34 = (s16) var_s5->msg.vol.delta;
+ if (temp_s0->unk40 == 1) {
+ spA4 = MAX(0, (((f32) D_8027EF14[keymap->keyMin & 0x3F] * ((temp_s0->unk44 * (f32) temp_s0->unk34 * (f32)temp_s1->sampleVolume) / 16129)) / 32767) - 1);
+ var_v0 = spA4 - temp_t6;
+ n_alSynSetVol(&temp_s0->voice, (s16)spA4, MAX(0x3E8, CODE_5650_ABS(var_v0) >> 2));
+ }
+
+ break;
+
+ case 0x800:
+ if (temp_s0->unk40 == 1) {
+ spAC = ((temp_s1->envelope->releaseTime / temp_s0->unk28) / temp_s0->unk2C);
+ spA4 = MAX(0, ((f32) (s16) D_8027EF14[keymap->keyMin & 0x3F] * ((temp_s0->unk44 * (f32) temp_s0->unk34 * (f32)temp_s1->sampleVolume) / 16129)) / 32767 - 1);
+ n_alSynSetVol(&temp_s0->voice, (s16)spA4, spAC);
+ }
+
+ break;
+ case 0x40:
+ if (!(temp_s0->unk3F & 2)) {
+ spA4 = MAX(0, ((s32) ((s16) D_8027EF14[keymap->keyMin & 0x3F] * ( (temp_s1->envelope->decayVolume * temp_s0->unk34 * temp_s1->sampleVolume) / 16129)) / 32767) - 1);
+ spAC = (s32) (((f32) temp_s1->envelope->decayTime / temp_s0->unk28) / temp_s0->unk2C);
+ n_alSynSetVol(&temp_s0->voice, spA4, spAC);
+ spC0.type = 2;
+ spC0.msg.generic.data[0].i = temp_s0;
+ alEvtqPostEvent(&temp_fp->evtq, (ALEvent *) &spC0, spAC);
+ if (temp_s0->unk3F & 0x20) {
+ func_80243FE4(temp_s0);
+ }
+ }
+
+ break;
+ case 0x80:
+ func_80243F84(temp_s0);
+
+ break;
+
+ case 0x200:
+ if (temp_s0->unk3F & 0x10) {
+ sp68 = func_80244608(var_s5->msg.midi.duration, (s16)var_s5->msg.generic.data[1].i, temp_s0->unk30);
+ func_80244978(sp68, 8, temp_s0->unk34);
+ func_80244978(sp68, 4, temp_s0->unk3D);
+ func_80244978(sp68, 0x100, temp_s0->unk3E);
+ func_80244978(sp68, 0x10, reinterpret_cast(s32, temp_s0->unk2C));
+ }
+
+ break;
+ default:
+ break;
+ }
+ var_v0 = var_s5->type & 0x2D1;
+ temp_s0 = temp_s6;
+ if ((temp_s0 != NULL) && !var_v0) {
+ sp94 = temp_s0->unk3F & 1;
+ }
+ }while((sp94 == 0) && (temp_s0 != NULL) && !var_v0);
+}
void func_80243F84(N_AL_Struct81s *arg0) {
if (arg0->unk3F & 4) {
@@ -421,7 +682,7 @@ void func_80244978(s32 arg0, s16 type, s32 arg2){
}
s32 func_802449C4(u8 arg0){
- return D_8027EF14[arg0];
+ return (u16)D_8027EF14[arg0];
}
void func_802449E4(u8 arg0, u16 arg1) {
diff --git a/src/core2/code_6DA30.c b/src/core2/code_6DA30.c
index ff4e72e0..1573879f 100644
--- a/src/core2/code_6DA30.c
+++ b/src/core2/code_6DA30.c
@@ -217,8 +217,6 @@ s32 D_80380B18;
s32 D_80380B1C;
s8 D_80380B20[0x400];
s8 D_80380F20[0x80];
-f32 D_80380FA0;
-f32 D_80380FA8[0x20];
void func_802F7A2C(s32 arg0);
@@ -516,6 +514,7 @@ void *func_802F55A8(u8 arg0){
}
#ifndef NONMATCHING
+f32 D_80380FA0;
void _printbuffer_draw_letter(s32 letter, f32* xPtr, f32* yPtr, f32 arg3, Gfx **gtx, Mtx **mtx, Vtx **vtx);
#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6DA30/_printbuffer_draw_letter.s")
#else
@@ -821,6 +820,8 @@ f32 func_802F6C90(u8 letter, f32* xPtr, f32 *yPtr, f32 arg3){
}
void printbuffer_draw(Gfx **gfx, Mtx **mtx, Vtx **vtx) {
+ static f32 D_80380FA8[0x20];
+
s32 j;
f32 _x;
f32 _y;