summaryrefslogtreecommitdiff
path: root/arm7/lib/src/SND_bank.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/lib/src/SND_bank.c')
-rw-r--r--arm7/lib/src/SND_bank.c195
1 files changed, 117 insertions, 78 deletions
diff --git a/arm7/lib/src/SND_bank.c b/arm7/lib/src/SND_bank.c
index 5c9fb3dd..3437e021 100644
--- a/arm7/lib/src/SND_bank.c
+++ b/arm7/lib/src/SND_bank.c
@@ -1,13 +1,16 @@
#include "SND_bank.h"
-#include "SND_main.h"
#include "SND_exChannel.h"
+#include "SND_main.h"
#include "mmap.h"
-static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave);
+static const struct SNDWaveData *GetWaveData(
+ const struct SNDBankData *bankData, s32 waveArc, s32 wave);
-BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData) {
+BOOL SND_ReadInstData(
+ const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData)
+{
s32 i;
struct SNDDrumSet *drumSet;
struct SNDKeySplit *keySplit;
@@ -16,10 +19,11 @@ BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiK
if (program < 0)
return FALSE;
-
+
SNDi_LockMutex();
- if (program >= bankData->instCount) {
+ if (program >= bankData->instCount)
+ {
SNDi_UnlockMutex();
return FALSE;
}
@@ -27,60 +31,69 @@ BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiK
off = bankData->instOffsets[program];
instData->type = SND_INST_OFFSET_TYPE(off);
- switch (instData->type) {
- case SND_INST_PCM:
- case SND_INST_PSG:
- case SND_INST_NOISE:
- case SND_INST_DIRECTPCM:
- case SND_INST_DUMMY:
- instData->param = *SND_INST_OFFSET_NORMAL(bankData, off);
- break;
- case SND_INST_DRUM_TABLE:
- drumSet = SND_INST_OFFSET_DRUMS(bankData, off);
-
- // seperate variables needed for matching
- maxKey = drumSet->maxKey;
- minKey = drumSet->minKey;
-
- if (midiKey < minKey || midiKey > maxKey) {
- SNDi_UnlockMutex();
- return FALSE;
- }
-
- *instData = drumSet->instruments[midiKey - drumSet->minKey];
- break;
- case SND_INST_KEY_SPLIT:
- i = 0;
- keySplit = SND_INST_OFFSET_KEYSPL(bankData, off);
-
- while (midiKey > keySplit->key[i]) {
- i++;
- if (i >= SND_INST_MAX_KEYSPLIT) {
+ switch (instData->type)
+ {
+ case SND_INST_PCM:
+ case SND_INST_PSG:
+ case SND_INST_NOISE:
+ case SND_INST_DIRECTPCM:
+ case SND_INST_DUMMY:
+ instData->param = *SND_INST_OFFSET_NORMAL(bankData, off);
+ break;
+ case SND_INST_DRUM_TABLE:
+ drumSet = SND_INST_OFFSET_DRUMS(bankData, off);
+
+ // seperate variables needed for matching
+ maxKey = drumSet->maxKey;
+ minKey = drumSet->minKey;
+
+ if (midiKey < minKey || midiKey > maxKey)
+ {
SNDi_UnlockMutex();
return FALSE;
}
- }
- *instData = keySplit->instruments[i];
- break;
- case SND_INST_ILLEGAL:
- default:
- SNDi_UnlockMutex();
- return FALSE;
+
+ *instData = drumSet->instruments[midiKey - drumSet->minKey];
+ break;
+ case SND_INST_KEY_SPLIT:
+ i = 0;
+ keySplit = SND_INST_OFFSET_KEYSPL(bankData, off);
+
+ while (midiKey > keySplit->key[i])
+ {
+ i++;
+ if (i >= SND_INST_MAX_KEYSPLIT)
+ {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+ }
+ *instData = keySplit->instruments[i];
+ break;
+ case SND_INST_ILLEGAL:
+ default:
+ SNDi_UnlockMutex();
+ return FALSE;
}
-
+
SNDi_UnlockMutex();
return TRUE;
}
-const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave) {
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave)
+{
SNDi_LockMutex();
const struct SNDWaveData *retval = (const struct SNDWaveData *)waveArc->waveOffsets[wave];
- if (retval != NULL) {
- if ((u32)retval < HW_MAIN_MEM) {
+ if (retval != NULL)
+ {
+ if ((u32)retval < HW_MAIN_MEM)
+ {
retval = (const struct SNDWaveData *)((u32)waveArc + (u32)retval);
}
- } else {
+ }
+ else
+ {
retval = NULL;
}
@@ -89,47 +102,66 @@ const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveAr
return retval;
}
-BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length, const struct SNDBankData *bankData, const struct SNDInstData *instData) {
+BOOL SND_NoteOn(struct SNDExChannel *chn,
+ s32 midiKey,
+ s32 velocity,
+ s32 length,
+ const struct SNDBankData *bankData,
+ const struct SNDInstData *instData)
+{
const struct SNDWaveData *waveData;
u8 release;
BOOL success;
-
+
release = instData->param.envRelease;
- if (release == 0xFF) {
+ if (release == 0xFF)
+ {
length = -1;
release = 0;
}
- switch (instData->type) {
- case SND_INST_PCM:
- case SND_INST_DIRECTPCM:
- if (instData->type == SND_INST_PCM) {
- waveData = GetWaveData(bankData, instData->param.wave[1], instData->param.wave[0]);
- } else {
- waveData = (const struct SNDWaveData *)((instData->param.wave[1] << 16) | instData->param.wave[0]);
- }
+ switch (instData->type)
+ {
+ case SND_INST_PCM:
+ case SND_INST_DIRECTPCM:
+ if (instData->type == SND_INST_PCM)
+ {
+ waveData = GetWaveData(bankData, instData->param.wave[1], instData->param.wave[0]);
+ }
+ else
+ {
+ waveData = (const struct SNDWaveData *)((instData->param.wave[1] << 16) |
+ instData->param.wave[0]);
+ }
- if (waveData == NULL) {
+ if (waveData == NULL)
+ {
+ success = FALSE;
+ }
+ else
+ {
+ success =
+ SND_StartExChannelPcm(chn, &waveData->param, waveData->sampleData, length);
+ }
+ break;
+ case SND_INST_PSG:
+ success = SND_StartExChannelPsg(chn, instData->param.wave[0], length);
+ break;
+ case SND_INST_NOISE:
+ success = SND_StartExChannelNoise(chn, length);
+ break;
+ default:
success = FALSE;
- } else {
- success = SND_StartExChannelPcm(chn, &waveData->param, waveData->sampleData, length);
- }
- break;
- case SND_INST_PSG:
- success = SND_StartExChannelPsg(chn, instData->param.wave[0], length);
- break;
- case SND_INST_NOISE:
- success = SND_StartExChannelNoise(chn, length);
- break;
- default:
- success = FALSE;
- break;
+ break;
}
-
- if (success == FALSE) {
+
+ if (success == FALSE)
+ {
return FALSE;
- } else {
+ }
+ else
+ {
chn->midiKey = (u8)midiKey;
chn->rootMidiKey = instData->param.rootKey;
chn->velocity = (u8)velocity;
@@ -142,14 +174,21 @@ BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length,
}
}
-static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave) {
+static const struct SNDWaveData *GetWaveData(
+ const struct SNDBankData *bankData, s32 waveArc, s32 wave)
+{
const struct SNDWaveArc *arcPtr = bankData->waveArcLinks[waveArc].waveArc;
- if (arcPtr == NULL) {
+ if (arcPtr == NULL)
+ {
return NULL;
- } else if (wave < arcPtr->waveCount) {
+ }
+ else if (wave < arcPtr->waveCount)
+ {
return SND_GetWaveDataAddress(arcPtr, wave);
- } else {
+ }
+ else
+ {
return NULL;
}
}