/* AICA LFO handling Part of the AICA emulator package. (not compiled directly, #included from aica.c) By ElSemi, kingshriek, Deunan Knute, and R. Belmont */ #define LFO_SHIFT 8 struct LFO_t { unsigned short phase; UINT32 phase_step; int *table; int *scale; }; #define LFIX(v) ((unsigned int) ((float) (1<phase+=LFO->phase_step; #if LFO_SHIFT!=8 LFO->phase&=(1<<(LFO_SHIFT+8))-1; #endif p=LFO->table[LFO->phase>>LFO_SHIFT]; p=LFO->scale[p+128]; return p<<(SHIFT-LFO_SHIFT); } INLINE signed int AICAALFO_Step(LFO_t *LFO) { int p; LFO->phase+=LFO->phase_step; #if LFO_SHIFT!=8 LFO->phase&=(1<<(LFO_SHIFT+8))-1; #endif p=LFO->table[LFO->phase>>LFO_SHIFT]; p=LFO->scale[p]; return p<<(SHIFT-LFO_SHIFT); } static void AICALFO_ComputeStep(LFO_t *LFO,UINT32 LFOF,UINT32 LFOWS,UINT32 LFOS,int ALFO) { float step=(float) LFOFreq[LFOF]*256.0/(float)44100.0; LFO->phase_step=(unsigned int) ((float) (1<table=ALFO_SAW; break; case 1: LFO->table=ALFO_SQR; break; case 2: LFO->table=ALFO_TRI; break; case 3: LFO->table=ALFO_NOI; break; default: printf("Unknown ALFO %d\n", LFOWS); } LFO->scale=ASCALES[LFOS]; } else { switch(LFOWS) { case 0: LFO->table=PLFO_SAW; break; case 1: LFO->table=PLFO_SQR; break; case 2: LFO->table=PLFO_TRI; break; case 3: LFO->table=PLFO_NOI; break; default: printf("Unknown PLFO %d\n", LFOWS); } LFO->scale=PSCALES[LFOS]; } }