diff options
-rw-r--r-- | arm7/arm7.lsf | 1 | ||||
-rw-r--r-- | arm7/lib/include/SND_channel.h | 51 | ||||
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 42 | ||||
-rw-r--r-- | arm7/lib/src/SND.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/SND_channel.c | 116 | ||||
-rw-r--r-- | arm7/lib/src/SND_command.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/SND_exChannel.c | 114 |
7 files changed, 155 insertions, 171 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index e313647d..c8c7e318 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -44,7 +44,6 @@ Autoload WRAM Object SND_util.o Object SND_main.o Object SND_capture.o - Object SND_channel.o Object SND_exChannel.o Object SND_seq.o Object SND_bank.o diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h deleted file mode 100644 index 9e015beb..00000000 --- a/arm7/lib/include/SND_channel.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef GUARD_SND_CHANNEL_H -#define GUARD_SND_CHANNEL_H - -#include "nitro/types.h" - -#include "SND_exChannel.h" - -void SNDi_SetSurroundDecay(int decay); - -void SND_SetupChannelPcm( - int chnIdx, - const void *data, - int format, - int loop, - int loopStart, - int loopLen, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelPsg( - int chnIdx, - int waveDuty, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelNoise( - int chnIdx, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_StopChannel(int chnIdx, int hold); - -void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); -void SND_SetChannelPan(int chnIdx, int pan); -void SND_SetChannelTimer(int chnIdx, int timer); - -u32 SND_GetChannelControl(int idx); - -// TODO move this function to SND_exChannel.c -u16 CalcDecayCoeff(int value); - -#endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 03fd4b41..a2d19971 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -42,5 +42,47 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam); void SND_StartLfo(struct SNDLfo *lfo); void SND_UpdateLfo(struct SNDLfo *lfo); int SND_GetLfoValue(struct SNDLfo *lfo); +void SNDi_SetSurroundDecay(int decay); + +void SND_SetupChannelPcm( + int chnIdx, + const void *data, + int format, + int loop, + int loopStart, + int loopLen, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelPsg( + int chnIdx, + int waveDuty, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelNoise( + int chnIdx, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_StopChannel(int chnIdx, int hold); + +void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); +void SND_SetChannelPan(int chnIdx, int pan); +void SND_SetChannelTimer(int chnIdx, int timer); + +u32 SND_GetChannelControl(int idx); + +// TODO move this function to SND_exChannel.c +u16 CalcDecayCoeff(int value); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/src/SND.c b/arm7/lib/src/SND.c index 6c17fa69..c4b9d900 100644 --- a/arm7/lib/src/SND.c +++ b/arm7/lib/src/SND.c @@ -7,7 +7,6 @@ #include "PM.h" #include "SND_exChannel.h" #include "SND_work.h" -#include "SND_channel.h" static int sMasterPan = -1; diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c deleted file mode 100644 index 66acf606..00000000 --- a/arm7/lib/src/SND_channel.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "SND_channel.h" - -#include "SND_lfo.h" - -// TODO remove this extern once we actually know where this table is -extern u8 sSampleDataShiftTable[4]; - -u16 CalcDecayCoeff(int vol) { - if (vol == 127) - return 0xFFFF; - else if (vol == 126) - return 0x3C00; - else if (vol < 50) - return (u16)(vol * 2 + 1); - else - return (u16)(0x1E00 / (126 - vol)); -} - -void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { - chn->channelLLNext = NULL; - chn->callback = callback; - chn->callbackUserData = callbackUserData; - chn->length = 0; - chn->priority = (u8)priority; - chn->volume = 127; - chn->flags.start = FALSE; - chn->flags.autoSweep = TRUE; - chn->midiKey = 60; - chn->rootMidiKey = 60; - chn->velocity = 127; - chn->initPan = 0; - chn->userDecay = 0; - chn->userDecay2 = 0; - chn->userPitch = 0; - chn->userPan = 0; - chn->panRange = 127; - chn->sweepPitch = 0; - chn->sweepLength = 0; - chn->sweepCounter = 0; - - SND_SetExChannelAttack(chn, 127); - SND_SetExChannelDecay(chn, 127); - SND_SetExChannelSustain(chn, 127); - SND_SetExChannelRelease(chn, 127); - SND_InitLfoParam(&chn->lfo.param); -} - -void ExChannelStart(struct SNDExChannel *chn, int length) { - chn->envAttenuation = -92544; - chn->envStatus = 0; - chn->length = length; - SND_StartLfo(&chn->lfo); - chn->flags.start = TRUE; - chn->flags.active = TRUE; -} - -int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { - int vol_a = chn_a->volume & 0xFF; - int vol_b = chn_b->volume & 0xFF; - - vol_a <<= 4; - vol_b <<= 4; - - vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; - vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; - - if (vol_a != vol_b) { - if (vol_a < vol_b) - return 1; - else - return -1; - } - return 0; -} - -int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { - s64 result; - - if (chn->sweepPitch == 0) { - result = 0; - } else if (chn->sweepCounter >= chn->sweepLength) { - result = 0; - } else { - result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; - - if (step && chn->flags.autoSweep) - chn->sweepCounter++; - } - - return (int)result; -} - -int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { - s64 result = SND_GetLfoValue(&chn->lfo); - - if (result != 0) { - switch (chn->lfo.param.target) { - case SND_LFO_VOLUME: - result *= 60; - break; - case SND_LFO_PITCH: - result <<= 6; - break; - case SND_LFO_PAN: - result <<= 6; - break; - } - result >>= 14; - } - - if (step) { - SND_UpdateLfo(&chn->lfo); - } - - return (int)result; -} diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c index 1ffcb0d5..ada6161c 100644 --- a/arm7/lib/src/SND_command.c +++ b/arm7/lib/src/SND_command.c @@ -10,7 +10,6 @@ #include "SND.h" #include "SND_alarm.h" #include "SND_capture.h" -#include "SND_channel.h" #include "SND_exChannel.h" #include "SND_main.h" #include "SND_seq.h" diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 6081150f..7e41aea3 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -1,6 +1,5 @@ #include "SND_exChannel.h" -#include "SND_channel.h" #include "SND_main.h" #include "SND_work.h" #include "SND_util.h" @@ -14,6 +13,9 @@ extern u8 sAttackCoeffTable[19]; static u32 sLockedChannelMask; static u32 sWeakLockedChannelMask; +// TODO remove this extern once we actually know where this table is +extern u8 sSampleDataShiftTable[4]; + void SND_ExChannelInit(void) { struct SNDExChannel *chn; s32 i; @@ -468,3 +470,113 @@ int SND_GetLfoValue(struct SNDLfo *lfo) { return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; } } + +u16 CalcDecayCoeff(int vol) { + if (vol == 127) + return 0xFFFF; + else if (vol == 126) + return 0x3C00; + else if (vol < 50) + return (u16)(vol * 2 + 1); + else + return (u16)(0x1E00 / (126 - vol)); +} + +void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { + chn->channelLLNext = NULL; + chn->callback = callback; + chn->callbackUserData = callbackUserData; + chn->length = 0; + chn->priority = (u8)priority; + chn->volume = 127; + chn->flags.start = FALSE; + chn->flags.autoSweep = TRUE; + chn->midiKey = 60; + chn->rootMidiKey = 60; + chn->velocity = 127; + chn->initPan = 0; + chn->userDecay = 0; + chn->userDecay2 = 0; + chn->userPitch = 0; + chn->userPan = 0; + chn->panRange = 127; + chn->sweepPitch = 0; + chn->sweepLength = 0; + chn->sweepCounter = 0; + + SND_SetExChannelAttack(chn, 127); + SND_SetExChannelDecay(chn, 127); + SND_SetExChannelSustain(chn, 127); + SND_SetExChannelRelease(chn, 127); + SND_InitLfoParam(&chn->lfo.param); +} + +void ExChannelStart(struct SNDExChannel *chn, int length) { + chn->envAttenuation = -92544; + chn->envStatus = 0; + chn->length = length; + SND_StartLfo(&chn->lfo); + chn->flags.start = TRUE; + chn->flags.active = TRUE; +} + +int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { + int vol_a = chn_a->volume & 0xFF; + int vol_b = chn_b->volume & 0xFF; + + vol_a <<= 4; + vol_b <<= 4; + + vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; + vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; + + if (vol_a != vol_b) { + if (vol_a < vol_b) + return 1; + else + return -1; + } + return 0; +} + +int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result; + + if (chn->sweepPitch == 0) { + result = 0; + } else if (chn->sweepCounter >= chn->sweepLength) { + result = 0; + } else { + result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; + + if (step && chn->flags.autoSweep) + chn->sweepCounter++; + } + + return (int)result; +} + +int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result = SND_GetLfoValue(&chn->lfo); + + if (result != 0) { + switch (chn->lfo.param.target) { + case SND_LFO_VOLUME: + result *= 60; + break; + case SND_LFO_PITCH: + result <<= 6; + break; + case SND_LFO_PAN: + result <<= 6; + break; + } + result >>= 14; + } + + if (step) { + SND_UpdateLfo(&chn->lfo); + } + + return (int)result; +} |