diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-01 12:00:10 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:50 +0200 |
commit | 5adc7017a33cf6d55cf76d95a72fc6f5d879bcc3 (patch) | |
tree | b3c969165d3e6ba39428a39490c7bc797c243b66 /arm7/lib/src/SND_exChannel.c | |
parent | 9a42ad73f93adceb0c39067906e0639c8f56aa31 (diff) |
arm7: merge SND_lfo into SND_exChannel
Diffstat (limited to 'arm7/lib/src/SND_exChannel.c')
-rw-r--r-- | arm7/lib/src/SND_exChannel.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 54c5a3c4..6081150f 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -429,3 +429,42 @@ void SND_InvalidateWave(const void *start, const void *end) { } } } + +void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { + lfoParam->target = SND_LFO_PITCH; + lfoParam->depth = 0; + lfoParam->range = 1; + lfoParam->speed = 16; + lfoParam->delay = 0; +} + +void SND_StartLfo(struct SNDLfo *lfo) { + lfo->counter = 0; + lfo->delayCounter = 0; +} + +void SND_UpdateLfo(struct SNDLfo *lfo) { + if (lfo->delayCounter < lfo->param.delay) { + lfo->delayCounter++; + } else { + u32 tmp = lfo->counter; + tmp += lfo->param.speed << 6; + tmp >>= 8; + while (tmp >= 0x80) { + tmp -= 0x80; + } + lfo->counter += lfo->param.speed << 6; + lfo->counter &= 0xFF; + lfo->counter |= tmp << 8; + } +} + +int SND_GetLfoValue(struct SNDLfo *lfo) { + if (lfo->param.depth == 0) { + return 0; + } else if (lfo->delayCounter < lfo->param.delay) { + return 0; + } else { + return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; + } +} |