aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/mods/maxtrax.cpp122
-rw-r--r--sound/mods/maxtrax.h6
2 files changed, 66 insertions, 62 deletions
diff --git a/sound/mods/maxtrax.cpp b/sound/mods/maxtrax.cpp
index f945a5544b..f9cf247eee 100644
--- a/sound/mods/maxtrax.cpp
+++ b/sound/mods/maxtrax.cpp
@@ -181,6 +181,7 @@ bool MaxTrax::doSong(int songIndex, int advance) {
_playerCtx.musicPlaying = true;
Paula::startPaula();
+ return true;
}
void MaxTrax::killVoice(byte num) {
@@ -199,6 +200,8 @@ void MaxTrax::killVoice(byte num) {
}
int8 MaxTrax::noteOn(ChannelContext &channel, const byte note, uint16 volume, uint16 pri) {
+ bool processNote = true;
+
if (channel.microtonal >= 0)
_microtonal[note % 127] = channel.microtonal;
if (!volume)
@@ -223,7 +226,7 @@ int8 MaxTrax::noteOn(ChannelContext &channel, const byte note, uint16 volume, ui
voice.flags |= VoiceContext::kFlagPortamento;
voice.endNote = channel.lastNote = note;
voice.noteVolume = (_playerCtx.handleVolume) ? volume + 1 : 128;
- goto endFunction;
+ processNote = false;
}
} else {
// TODO:
@@ -231,74 +234,75 @@ int8 MaxTrax::noteOn(ChannelContext &channel, const byte note, uint16 volume, ui
// return if no channel found
voiceNum = (channel.flags & ChannelContext::kFlagRightChannel) != 0 ? 0 : 1;
}
- assert(voiceNum >= 0 && voiceNum < ARRAYSIZE(_voiceCtx));
+ if (processNote) {
+ assert(voiceNum >= 0 && voiceNum < ARRAYSIZE(_voiceCtx));
- VoiceContext &voice = _voiceCtx[voiceNum];
- voice.flags = 0;
- if (voice.channel) {
- killVoice(voiceNum);
- voice.flags |= VoiceContext::kFlagStolen;
- }
- voice.channel = &channel;
- voice.patch = &patch;
- voice.baseNote = note;
-
- // calc note period
- voice.priority = (byte)pri;
- voice.status = VoiceContext::kStatusStart;
-
- voice.noteVolume = (_playerCtx.handleVolume) ? volume + 1 : 128;
-
- // ifeq HAS_FULLCHANVOL macro
- if (channel.volume < 128)
- voice.noteVolume = (voice.noteVolume * channel.volume) >> 7;
-
- voice.baseVolume = 0;
- voice.lastTicks = 0;
-
- uint16 period = voice.lastPeriod;
- if (!period)
- period = 1000;
-
- int useOctave = 0;
- // get samplestart for the given octave
- const int8 *samplePtr = patch.samplePtr + (patch.sampleTotalLen << useOctave) - patch.sampleTotalLen;
- if (patch.sampleAttackLen) {
- Paula::setChannelSampleStart(voiceNum, samplePtr);
- Paula::setChannelSampleLen(voiceNum, patch.sampleAttackLen << useOctave);
- Paula::setChannelPeriod(voiceNum, period);
- Paula::setChannelVolume(voiceNum, 0);
-
- Paula::enableChannel(voiceNum);
- // wait for dma-clear
- }
+ VoiceContext &voice = _voiceCtx[voiceNum];
+ voice.flags = 0;
+ if (voice.channel) {
+ killVoice(voiceNum);
+ voice.flags |= VoiceContext::kFlagStolen;
+ }
+ voice.channel = &channel;
+ voice.patch = &patch;
+ voice.baseNote = note;
+
+ // calc note period
+ voice.priority = (byte)pri;
+ voice.status = VoiceContext::kStatusStart;
+
+ voice.noteVolume = (_playerCtx.handleVolume) ? volume + 1 : 128;
+
+ // ifeq HAS_FULLCHANVOL macro
+ if (channel.volume < 128)
+ voice.noteVolume = (voice.noteVolume * channel.volume) >> 7;
+
+ voice.baseVolume = 0;
+ voice.lastTicks = 0;
- if (patch.sampleTotalLen > patch.sampleAttackLen) {
- Paula::setChannelSampleStart(voiceNum, samplePtr + patch.sampleAttackLen);
- Paula::setChannelSampleLen(voiceNum, (patch.sampleTotalLen - patch.sampleAttackLen) << useOctave);
- if (!patch.sampleAttackLen) {
- // need to enable channel
+ uint16 period = voice.lastPeriod;
+ if (!period)
+ period = 1000;
+
+ int useOctave = 0;
+ // get samplestart for the given octave
+ const int8 *samplePtr = patch.samplePtr + (patch.sampleTotalLen << useOctave) - patch.sampleTotalLen;
+ if (patch.sampleAttackLen) {
+ Paula::setChannelSampleStart(voiceNum, samplePtr);
+ Paula::setChannelSampleLen(voiceNum, patch.sampleAttackLen << useOctave);
Paula::setChannelPeriod(voiceNum, period);
Paula::setChannelVolume(voiceNum, 0);
Paula::enableChannel(voiceNum);
+ // wait for dma-clear
}
- // another pointless wait for DMA-Clear???
- }
- channel.voicesActive++;
- if (&channel < &_channelCtx[kNumChannels]) {
- const byte flagsSet = ChannelContext::kFlagMono | ChannelContext::kFlagPortamento;
- if ((channel.flags & flagsSet) == flagsSet && channel.lastNote < 0x80 && channel.lastNote != voice.baseNote) {
- voice.portaTicks = 0;
- voice.endNote = voice.baseNote;
- voice.baseNote = channel.lastNote;
- voice.flags |= VoiceContext::kFlagPortamento;
+ if (patch.sampleTotalLen > patch.sampleAttackLen) {
+ Paula::setChannelSampleStart(voiceNum, samplePtr + patch.sampleAttackLen);
+ Paula::setChannelSampleLen(voiceNum, (patch.sampleTotalLen - patch.sampleAttackLen) << useOctave);
+ if (!patch.sampleAttackLen) {
+ // need to enable channel
+ Paula::setChannelPeriod(voiceNum, period);
+ Paula::setChannelVolume(voiceNum, 0);
+
+ Paula::enableChannel(voiceNum);
+ }
+ // another pointless wait for DMA-Clear???
+ }
+
+ channel.voicesActive++;
+ if (&channel < &_channelCtx[kNumChannels]) {
+ const byte flagsSet = ChannelContext::kFlagMono | ChannelContext::kFlagPortamento;
+ if ((channel.flags & flagsSet) == flagsSet && channel.lastNote < 0x80 && channel.lastNote != voice.baseNote) {
+ voice.portaTicks = 0;
+ voice.endNote = voice.baseNote;
+ voice.baseNote = channel.lastNote;
+ voice.flags |= VoiceContext::kFlagPortamento;
+ }
+ if ((channel.flags & ChannelContext::kFlagPortamento) != 0)
+ channel.lastNote = note;
}
- if ((channel.flags & ChannelContext::kFlagPortamento) != 0)
- channel.lastNote = note;
}
-endFunction:
_playerCtx.addedNote = true;
_playerCtx.lastVoice = voiceNum;
return voiceNum;
diff --git a/sound/mods/maxtrax.h b/sound/mods/maxtrax.h
index bb1244d53a..4055c750aa 100644
--- a/sound/mods/maxtrax.h
+++ b/sound/mods/maxtrax.h
@@ -217,8 +217,8 @@ public:
static void outPutEvent(const Event &ev, int num = -1) {
struct {
byte cmd;
- char *name;
- char *param;
+ const char *name;
+ const char *param;
} COMMANDS[] = {
{0x80, "TEMPO ", "TEMPO, N/A "},
{0xa0, "SPECIAL ", "CHAN, SPEC # | VAL"},
@@ -253,4 +253,4 @@ public:
};
} // End of namespace Audio
-#endif \ No newline at end of file
+#endif