Files
banjo-kazooie/src/core1/done/audio/n_drvrNew.c
2022-07-15 17:09:41 -05:00

189 lines
5.2 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "n_synth.h"
/*
* WARNING: THE FOLLOWING CONSTANT MUST BE KEPT IN SYNC
* WITH SCALING IN MICROCODE!!!
*/
#define SCALE 16384
/*
* the following arrays contain default parameters for
* a few hopefully useful effects.
*/
#define ms *(((s32)((f32)44.1))&~0x7)
s32 SMALLROOM_PARAMS_N[26] = {
/* sections length */
3, 100 ms,
/* chorus chorus filter
input output fbcoef ffcoef gain rate depth coef */
0, 54 ms, 9830, -9830, 0, 0, 0, 0,
19 ms, 38 ms, 3276, -3276, 0x3fff, 0, 0, 0,
0, 60 ms, 5000, 0, 0, 0, 0, 0x5000
};
s32 BIGROOM_PARAMS_N[34] = {
/* sections length */
4, 100 ms,
/* chorus chorus filter
input output fbcoef ffcoef gain rate depth coef */
0, 66 ms, 9830, -9830, 0, 0, 0, 0,
22 ms, 54 ms, 3276, -3276, 0x3fff, 0, 0, 0,
66 ms, 91 ms, 3276, -3276, 0x3fff, 0, 0, 0,
0, 94 ms, 8000, 0, 0, 0, 0, 0x5000
};
s32 ECHO_PARAMS_N[10] = {
/* sections length */
1, 200 ms,
/* chorus chorus filter
input output fbcoef ffcoef gain rate depth coef */
0, 179 ms, 12000, 0, 0x7fff, 0, 0, 0
};
s32 CHORUS_PARAMS_N[10] = {
/* sections length */
1, 20 ms,
/* chorus chorus filter
input output fbcoef ffcoef gain rate depth coef */
0, 5 ms, 0x4000, 0, 0x7fff, 7600, 700, 0
};
s32 FLANGE_PARAMS_N[10] = {
/* sections length */
1, 20 ms,
/* chorus chorus filter
input output fbcoef ffcoef gain rate depth coef */
0, 5 ms, 0, 0x5fff, 0x7fff, 380, 500, 0
};
s32 NULL_PARAMS_N[10] = {
0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
void n_alFxNew(ALFx **fx_ar, ALSynConfig *c, ALHeap *hp)
{
u16 i, j, k;
s32 *param = 0;
ALDelay *d;
ALFx *r;
*fx_ar = r = (ALFx *)alHeapAlloc(hp, 1, sizeof(ALFx));
switch (c->fxType) {
case AL_FX_SMALLROOM: param = SMALLROOM_PARAMS_N; break;
case AL_FX_BIGROOM: param = BIGROOM_PARAMS_N; break;
case AL_FX_ECHO: param = ECHO_PARAMS_N; break;
case AL_FX_CHORUS: param = CHORUS_PARAMS_N; break;
case AL_FX_FLANGE: param = FLANGE_PARAMS_N; break;
case AL_FX_CUSTOM: param = c->params; break;
default: param = NULL_PARAMS_N; break;
}
j = 0;
r->section_count = param[j++];
r->length = param[j++];
r->delay = alHeapAlloc(hp, r->section_count, sizeof(ALDelay));
r->base = alHeapAlloc(hp, r->length, sizeof(s16));
r->input = r->base;
for ( k=0; k < r->length; k++)
r->base[k] = 0;
for ( i=0; i<r->section_count; i++ ){
d = &r->delay[i];
d->input = param[j++];
d->output = param[j++];
d->fbcoef = param[j++];
d->ffcoef = param[j++];
d->gain = param[j++];
if (param[j]) {
#define RANGE 2.0
/* d->rsinc = ((f32) param[j++])/0xffffff; */
d->rsinc = ((((f32)param[j++])/1000) * RANGE)/c->outputRate;
/*
* the following constant is derived from:
*
* ratio = 2^(cents/1200)
*
* and therefore for hundredths of a cent
* x
* ln(ratio) = ---------------
* (120,000)/ln(2)
* where
* 120,000/ln(2) = 173123.40...
*/
#define CONVERT 173123.404906676
#define LENGTH (d->output - d->input)
d->rsgain = (((f32) param[j++])/CONVERT) * LENGTH;
d->rsval = 1.0;
d->rsdelta = 0.0;
d->rs = alHeapAlloc(hp, 1, sizeof(ALResampler));
d->rs->state = alHeapAlloc(hp, 1, sizeof(RESAMPLE_STATE));
d->rs->delta = 0.0;
d->rs->first = 1;
} else {
d->rs = 0;
j++;
j++;
}
if (param[j]) {
d->lp = alHeapAlloc(hp, 1, sizeof(ALLowPass));
d->lp->fstate = alHeapAlloc(hp, 1, sizeof(POLEF_STATE));
d->lp->fc = param[j++];
_init_lpfilter(d->lp);
} else {
d->lp = 0;
j++;
}
}
}
void alN_PVoiceNew(N_PVoice *mv, ALDMANew dmaNew, ALHeap *hp)
{
mv->dc_state = alHeapAlloc(hp, 1, sizeof(ADPCM_STATE));
mv->dc_lstate = alHeapAlloc(hp, 1, sizeof(ADPCM_STATE));
mv->dc_dma = dmaNew(&mv->dc_dmaState);
mv->dc_lastsam = 0;
mv->dc_first = 1;
mv->dc_memin = 0;
mv->rs_state = alHeapAlloc(hp, 1, sizeof(RESAMPLE_STATE));
mv->rs_delta = 0.0;
mv->rs_first = 1;
mv->rs_ratio = 1.0;
mv->rs_upitch = 0;
mv->em_state = alHeapAlloc(hp, 1, sizeof(ENVMIX_STATE));
mv->em_first = 1;
mv->em_motion = AL_STOPPED;
mv->em_volume = 1;
mv->em_ltgt = 1;
mv->em_rtgt = 1;
mv->em_cvolL = 1;
mv->em_cvolR = 1;
mv->em_dryamt = 0;
mv->em_wetamt = 0;
mv->em_lratm = 1;
mv->em_lratl = 0;
mv->em_lratm = 1;
mv->em_lratl = 0;
mv->em_delta = 0;
mv->em_segEnd = 0;
mv->em_pan = 0;
mv->em_ctrlList = 0;
mv->em_ctrlTail = 0;
}