709 lines
23 KiB
C
709 lines
23 KiB
C
#include <ultra64.h>
|
|
#include "core1/core1.h"
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
#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_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;
|
|
s16 *D_8027EF14;
|
|
struct {
|
|
s32 volume[4];
|
|
}D_8027EF18;
|
|
|
|
/* .data */
|
|
struct{
|
|
N_AL_Struct81s *unk0;
|
|
N_AL_Struct81s *unk4;
|
|
N_AL_Struct81s *unk8;
|
|
}D_802758C0 = {NULL, NULL, NULL};
|
|
N_ALSndPlayer *D_802758CC = &D_8027EEC0;
|
|
s32 D_802758D0 = 1;
|
|
s16 D_802758D4 = 0;
|
|
|
|
/* .code */
|
|
void func_80243070(Struct87s *arg0) {
|
|
N_AL_Struct81s *temp_a0;
|
|
N_AL_Struct81s *var_v0;
|
|
ALEvent sp40;
|
|
u32 var_s0;
|
|
|
|
D_802758CC->maxSounds = (s32) arg0->unk8;
|
|
D_802758CC->target = NULL;
|
|
D_802758CC->frameTime = 33000;
|
|
D_802758CC->sndState = alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk0 * sizeof(N_AL_Struct81s));
|
|
alEvtqNew(&D_802758CC->evtq, alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk4 * 0x1C), arg0->unk4);
|
|
D_802758C0.unk8 = D_802758CC->sndState;
|
|
for(var_s0 = 1; var_s0 < arg0->unk0; var_s0++){
|
|
var_v0 = (N_AL_Struct81s *)D_802758CC->sndState;
|
|
temp_a0 = var_s0 + var_v0;
|
|
alLink((ALLink *)temp_a0, (ALLink*)(temp_a0 - 1));
|
|
}
|
|
D_8027EF14 = alHeapDBAlloc(NULL, 0, arg0->unkC, 2, (s32) arg0->unk10);
|
|
for(var_s0 = 0; var_s0 < arg0->unk10; var_s0++){
|
|
D_8027EF14[var_s0] = 0x7FFF;
|
|
}
|
|
D_802758CC->node.next = NULL;
|
|
D_802758CC->node.handler = (ALVoiceHandler)func_8024324C;
|
|
D_802758CC->node.clientData = D_802758CC;
|
|
n_alSynAddSndPlayer(D_802758CC);
|
|
sp40.type = 0x20;
|
|
alEvtqPostEvent(&D_802758CC->evtq, &sp40, D_802758CC->frameTime);
|
|
D_802758CC->nextDelta = alEvtqNextEvent(&D_802758CC->evtq, &D_802758CC->nextEvent);
|
|
}
|
|
|
|
void func_8024324C(N_ALSndPlayer *arg0)
|
|
{
|
|
N_ALSndPlayer *new_var = (N_ALSndPlayer *)arg0;
|
|
N_ALEvent2 sp3C;
|
|
|
|
do
|
|
{
|
|
if ((s16)(new_var->nextEvent.type) == 0x20)
|
|
{
|
|
sp3C.type = 0x20;
|
|
alEvtqPostEvent(&new_var->evtq, (ALEvent *) (&sp3C), new_var->frameTime);
|
|
func_80244190(new_var);
|
|
}
|
|
else
|
|
{
|
|
func_802432F8(new_var, &arg0->nextEvent);
|
|
}
|
|
new_var->nextDelta = alEvtqNextEvent(&new_var->evtq, &arg0->nextEvent);
|
|
}
|
|
while (arg0->nextDelta == 0);
|
|
new_var->curTime += new_var->nextDelta;
|
|
}
|
|
|
|
void func_802432F8(N_ALSndPlayer *sndp, N_ALEvent *event) {
|
|
N_AL_Struct81s *temp_s0;
|
|
ALVoiceConfig spDC;
|
|
N_ALSndPlayer *temp_fp;
|
|
N_ALEvent2 *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, AL_SEQP_PROG_EVT, temp_s0->unk34);
|
|
func_80244978(sp68, AL_SEQ_END_EVT, temp_s0->unk3D);
|
|
func_80244978(sp68, 0x100, temp_s0->unk3E);
|
|
func_80244978(sp68, AL_SEQP_STOP_EVT, reinterpret_cast(s32, temp_s0->unk2C));
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
var_v0 = (u16)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) {
|
|
n_alSynStopVoice(&arg0->voice);
|
|
n_alSynFreeVoice(&arg0->voice);
|
|
}
|
|
func_802444C0(arg0);
|
|
func_80244050(&D_802758CC->evtq, arg0, 0xFFFF);
|
|
}
|
|
|
|
void func_80243FE4(N_AL_Struct81s *arg0) {
|
|
ALEvent evt;
|
|
f32 sp1C;
|
|
|
|
sp1C = alCents2Ratio(arg0->unk8->keyMap->detune)* arg0->unk2C;
|
|
evt.type = 0x10;
|
|
evt.msg.unk3A70.unk0 = arg0;
|
|
evt.msg.unk3A70.unk4 = reinterpret_cast(s32, sp1C);
|
|
alEvtqPostEvent(&D_802758CC->evtq, &evt, 33333);
|
|
}
|
|
|
|
void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2) {
|
|
s32 pad[5];
|
|
u32 mask;
|
|
ALEventListItem *next_event_list;
|
|
ALEventListItem *event_list;
|
|
|
|
mask = osSetIntMask(OS_IM_NONE);
|
|
for(event_list = (ALEventListItem *)arg0->allocList.next; event_list != NULL; event_list = next_event_list) {
|
|
next_event_list = (ALEventListItem *)event_list->node.next;
|
|
if ((arg1 == event_list->evt.msg.unk3A70.unk0) && (reinterpret_cast(u16, event_list->evt.type) & arg2)) {
|
|
if (next_event_list != NULL) {
|
|
next_event_list->delta += event_list->delta;
|
|
}
|
|
alUnlink((ALLink *)event_list);
|
|
alLink((ALLink *)event_list, (ALLink *)arg0);
|
|
}
|
|
}
|
|
osSetIntMask(mask);
|
|
}
|
|
|
|
s32 func_80244110(u16 *arg0, u16 *arg1) {
|
|
N_AL_Struct81s *var_v0;
|
|
N_AL_Struct81s *var_v1_2;
|
|
N_AL_Struct81s *var_a2;
|
|
u16 var_a0;
|
|
u16 var_a3;
|
|
u16 var_v1;
|
|
|
|
var_v0 = D_802758C0.unk0;
|
|
var_v1_2 = D_802758C0.unk8;
|
|
var_a2 = D_802758C0.unk4;
|
|
|
|
for(var_a3 = 0; var_v0 != NULL; var_a3++){
|
|
var_v0 = (N_AL_Struct81s *) var_v0->node.next;
|
|
}
|
|
|
|
|
|
for(var_a0 = 0; var_v1_2 != NULL; var_a0++) {
|
|
var_v1_2 = (N_AL_Struct81s *) var_v1_2->node.next;
|
|
}
|
|
|
|
for(var_v1 = 0; var_a2 != NULL; var_v1++) {
|
|
var_a2 = (N_AL_Struct81s *) var_a2->node.prev;
|
|
}
|
|
|
|
*arg0 = var_a0;
|
|
*arg1 = var_a3;
|
|
return var_v1;
|
|
}
|
|
|
|
void func_80244190(N_AL_Struct81s *arg0)
|
|
{
|
|
ALMicroTime *temp_a1;
|
|
s32 prev_volume;
|
|
s32 temp_t1;
|
|
s32 temp_t5;
|
|
s32 var_t0;
|
|
ALMicroTime var_t1;
|
|
u8 temp_t6;
|
|
u8 var_a2;
|
|
ALEnvelope *envelope;
|
|
N_AL_Struct81s *var_v0;
|
|
N_AL_Struct81s *var_v1;
|
|
for (var_v0 = D_802758C0.unk0; var_v0 != 0; var_v0 = (N_AL_Struct81s *) var_v0->node.next)
|
|
{
|
|
var_v1 = var_v0;
|
|
envelope = var_v1->unk8->envelope;
|
|
temp_a1 = &envelope->attackTime;
|
|
D_8027EF18.volume[1] = (s32) envelope->attackVolume;
|
|
D_8027EF18.volume[2] = (s32) envelope->decayVolume ;
|
|
while (((var_v1->envPhase < 3) && (var_v1->unk48 >= temp_a1[var_v1->envPhase])) && (temp_a1[var_v1->envPhase] != (-1)))
|
|
{
|
|
var_v1->unk48 -= temp_a1[var_v1->envPhase];
|
|
var_v1->envPhase++;
|
|
}
|
|
|
|
if (var_v1->envPhase < 3){
|
|
if (temp_a1[var_v1->envPhase] != (-1)) {
|
|
var_v1->unk44 = D_8027EF18.volume[var_v1->envPhase]
|
|
+ (D_8027EF18.volume[var_v1->envPhase + 1] - D_8027EF18.volume[var_v1->envPhase])
|
|
* var_v0->unk48
|
|
/ temp_a1[var_v1->envPhase];
|
|
} else {
|
|
var_v0->unk44 = D_8027EF18.volume[var_v1->envPhase];
|
|
}
|
|
}
|
|
|
|
var_v1->unk48 += arg0->unk48;
|
|
}
|
|
}
|
|
|
|
N_AL_Struct81s *func_8024431C(ALBank *bank, ALSound *sound) {
|
|
s32 sp24;
|
|
ALKeyMap *sp30;
|
|
N_AL_Struct81s *temp_s0;
|
|
OSIntMask mask;
|
|
|
|
temp_s0 = D_802758C0.unk8;
|
|
sp30 = sound->keyMap;
|
|
if (temp_s0 != NULL) {
|
|
mask = osSetIntMask(OS_IM_NONE);
|
|
D_802758C0.unk8 = (N_AL_Struct81s *) temp_s0->node.next;
|
|
alUnlink((ALLink *)temp_s0);
|
|
if (D_802758C0.unk0 != NULL) {
|
|
temp_s0->node.next = D_802758C0.unk0;
|
|
temp_s0->node.prev = NULL;
|
|
D_802758C0.unk0->node.prev = temp_s0;
|
|
D_802758C0.unk0 = temp_s0;
|
|
} else {
|
|
temp_s0->node.prev = NULL;
|
|
temp_s0->node.next = NULL;
|
|
D_802758C0.unk0 = temp_s0;
|
|
D_802758C0.unk4 = temp_s0;
|
|
}
|
|
osSetIntMask(mask);
|
|
sp24 = ((sound->envelope->decayTime + 1) == 0);
|
|
// sp24 = sp20 + 0x40;
|
|
temp_s0->unk36 = sp24 + 0x40;
|
|
temp_s0->unk40 = 5;
|
|
temp_s0->unk38 = 2;
|
|
temp_s0->unk8 = sound;
|
|
temp_s0->unk2C = 1.0f;
|
|
temp_s0->unk3F = sp30->keyMax & 0xF0;
|
|
temp_s0->unk30 = 0;
|
|
temp_s0->envPhase = AL_PHASE_ATTACK;
|
|
temp_s0->unk44 = 0.0f;
|
|
temp_s0->unk48 = 0;
|
|
if (temp_s0->unk3F & 0x20) {
|
|
temp_s0->unk28 = alCents2Ratio((sp30->keyBase * 0x64) - 0x1770);
|
|
} else {
|
|
temp_s0->unk28 = alCents2Ratio(((sp30->keyBase * 0x64) + sp30->detune) - 0x1770);
|
|
}
|
|
if (sp24 != 0) {
|
|
temp_s0->unk3F |= 2;
|
|
}
|
|
temp_s0->unk3E = 0;
|
|
temp_s0->unk3D = 0x40;
|
|
temp_s0->unk34 = 0x7FFF;
|
|
}
|
|
return temp_s0;
|
|
}
|
|
|
|
void func_802444C0(N_AL_Struct81s *arg0){
|
|
N_AL_Struct81s *var_v0;
|
|
|
|
sizeof(ALVoice);
|
|
|
|
var_v0 = D_802758C0.unk0;
|
|
if(arg0 == D_802758C0.unk0){
|
|
D_802758C0.unk0 = (N_AL_Struct81s *)arg0->node.next;
|
|
}
|
|
|
|
if(arg0 == D_802758C0.unk4){
|
|
D_802758C0.unk4 = (N_AL_Struct81s *)arg0->node.prev;
|
|
}
|
|
|
|
alUnlink((ALLink *)arg0);
|
|
|
|
if(D_802758C0.unk8 != NULL){
|
|
arg0->node.next = (ALLink *)D_802758C0.unk8;
|
|
arg0->node.prev = NULL;
|
|
D_802758C0.unk8->node.prev = (ALLink *)arg0;
|
|
D_802758C0.unk8 = arg0;
|
|
}
|
|
else{
|
|
arg0->node.prev = NULL;
|
|
arg0->node.next = NULL;
|
|
D_802758C0.unk8 = arg0;
|
|
}
|
|
|
|
if(arg0->unk3F & 0x4){
|
|
D_802758D4--;
|
|
}
|
|
|
|
arg0->unk40 = 0;
|
|
if(arg0->unk30 != NULL){
|
|
if(*arg0->unk30 == arg0){
|
|
*arg0->unk30 = NULL;
|
|
}
|
|
arg0->unk30 = NULL;
|
|
}
|
|
}
|
|
|
|
void func_80244594(N_AL_Struct81s *arg0, u8 arg1){
|
|
if(arg0 != NULL)
|
|
arg0->unk36 = arg1;
|
|
}
|
|
|
|
s32 func_802445AC(N_AL_Struct81s *arg0){
|
|
if(arg0 != NULL)
|
|
return arg0->unk40;
|
|
return 0;
|
|
}
|
|
|
|
bool func_802445C4(ALBank *bank, s16 arg1){
|
|
ALSound *snd = bank->instArray[0]->soundArray[arg1-1];
|
|
if (snd->envelope->decayTime == -1)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void *func_80244608(ALBank *bank, s16 arg1, struct46s *arg2) {
|
|
ALKeyMap *temp_v0_2;
|
|
ALSound *temp_s2;
|
|
N_AL_Struct81s *temp_v0;
|
|
s32 var_s3;
|
|
s16 sp6E;
|
|
s32 sp68;
|
|
s32 var_s4;
|
|
N_AL_Struct81s *var_fp;
|
|
ALEvent sp50;
|
|
ALEvent sp40;
|
|
|
|
var_fp = NULL;
|
|
sp6E = 0;
|
|
var_s3 = 0;
|
|
if (arg1 == 0) {
|
|
return NULL;
|
|
}
|
|
|
|
do{
|
|
temp_s2 = bank->instArray[0]->soundArray[arg1-1];
|
|
temp_v0 = func_8024431C(bank, temp_s2);
|
|
if (temp_v0 != NULL) {
|
|
temp_v0->unk4C = (s32) (arg1 - 1);
|
|
D_802758CC->target = temp_v0;
|
|
sp50.type = AL_SEQ_MIDI_EVT;
|
|
((s32 *)&sp50.msg)[0] = temp_v0;
|
|
var_s4 = temp_s2->keyMap->velocityMax * 0x8235;
|
|
if (temp_v0->unk3F & 0x10) {
|
|
temp_v0->unk3F &= ~(0x10);
|
|
alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s3 + 1);
|
|
sp68 = var_s4 + 1;
|
|
sp6E = arg1;
|
|
} else {
|
|
alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s4 + 1);
|
|
}
|
|
var_fp = temp_v0;
|
|
}
|
|
temp_v0_2 = temp_s2->keyMap;
|
|
var_s3 += var_s4;
|
|
arg1 = temp_v0_2->velocityMin + ((temp_v0_2->keyMin & 0xC0) * 4);
|
|
} while (arg1 != 0 && temp_v0 != NULL);
|
|
|
|
if (var_fp != NULL) {
|
|
var_fp->unk3F |= 1;
|
|
var_fp->unk30 = arg2;
|
|
if (sp6E != 0) {
|
|
var_fp->unk3F |= 0x10;
|
|
sp40.type = 0x200;
|
|
((s32 *)&sp40.msg)[0] = var_fp;
|
|
((s32 *)&sp40.msg)[1] = sp6E;
|
|
((s32 *)&sp40.msg)[2] = bank;
|
|
alEvtqPostEvent(&D_802758CC->evtq, &sp40, sp68);
|
|
}
|
|
}
|
|
if (arg2 != NULL) {
|
|
arg2->unk0 = (s32) var_fp;
|
|
}
|
|
return var_fp;
|
|
}
|
|
|
|
void func_80244814(N_AL_Struct81s *arg0){
|
|
ALEvent evt;
|
|
|
|
evt.type = 0x400;
|
|
((s32 *)&evt.msg)[0] = arg0;
|
|
if(arg0 != NULL){
|
|
arg0->unk3F &= ~(0x10);
|
|
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
|
|
}
|
|
}
|
|
|
|
void func_80244860(u8 arg0) {
|
|
OSIntMask mask;
|
|
ALEvent evt;
|
|
N_AL_Struct81s *var_s0;
|
|
|
|
mask = osSetIntMask(1U);
|
|
for(var_s0 = D_802758C0.unk0; var_s0 != NULL; var_s0 = (N_AL_Struct81s *)var_s0->node.next){
|
|
evt.type = 0x400;
|
|
((s32 *)&evt.msg)[0] = (s32)var_s0;
|
|
if ((var_s0->unk3F & arg0) == arg0) {
|
|
var_s0->unk3F &= ~(0x10);
|
|
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
|
|
}
|
|
}
|
|
osSetIntMask(mask);
|
|
}
|
|
|
|
void func_80244918(void){
|
|
func_80244860(1);
|
|
}
|
|
|
|
void func_80244938(void){
|
|
func_80244860(0x11);
|
|
}
|
|
|
|
void func_80244958(void){
|
|
func_80244860(3);
|
|
}
|
|
|
|
void func_80244978(s32 arg0, s16 type, s32 arg2){
|
|
ALEvent sp18;
|
|
if(arg0){
|
|
sp18.type = type;
|
|
((s32 *)&sp18.msg)[0] = arg0;
|
|
((s32 *)&sp18.msg)[1] = arg2;
|
|
|
|
alEvtqPostEvent(&D_802758CC->evtq, &sp18, 0);
|
|
}
|
|
}
|
|
|
|
s32 func_802449C4(u8 arg0){
|
|
return (u16)D_8027EF14[arg0];
|
|
}
|
|
|
|
void func_802449E4(u8 arg0, u16 arg1) {
|
|
N_AL_Struct81s *var_s0;
|
|
s32 pad30;
|
|
ALEvent evt;
|
|
|
|
var_s0 = D_802758C0.unk0;
|
|
D_8027EF14[arg0] = arg1;
|
|
while(var_s0 != NULL){
|
|
if ((var_s0->unk8->keyMap->keyMin & 0x3F) == arg0) {
|
|
evt.type = 0x800;
|
|
((s32 *)&evt.msg)[0] = var_s0;
|
|
alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
|
|
}
|
|
var_s0 = (N_AL_Struct81s *)var_s0->node.next;
|
|
}
|
|
}
|
|
|
|
void func_80244A98(s32 arg0){
|
|
D_802758D0 = arg0;
|
|
}
|