aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_midiplay.cpp
diff options
context:
space:
mode:
authorVitaly Novichkov <admin@wohlnet.ru>2018-06-24 22:39:05 +0300
committerVitaly Novichkov <admin@wohlnet.ru>2018-06-24 22:39:05 +0300
commit4069c1fe38fe4e57b4b05abe6c692bf5976c668a (patch)
tree3e831a9e35c463ae0457fba734b396e9ddda9f55 /src/adlmidi_midiplay.cpp
parentc6b09c426f660996835d7e649e4e367a78ea9d9c (diff)
downloadlibADLMIDI-4069c1fe38fe4e57b4b05abe6c692bf5976c668a.tar.gz
libADLMIDI-4069c1fe38fe4e57b4b05abe6c692bf5976c668a.tar.bz2
libADLMIDI-4069c1fe38fe4e57b4b05abe6c692bf5976c668a.zip
Continue clean-up and fix the multi-device support
Diffstat (limited to 'src/adlmidi_midiplay.cpp')
-rw-r--r--src/adlmidi_midiplay.cpp81
1 files changed, 46 insertions, 35 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index 630c93f..1969190 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -252,7 +252,8 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
}
}
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
noteOff(channel, note);
// On Note on, Keyoff the note first, just in case keyoff
// was omitted; this fixes Dance of sugar-plum fairy
@@ -441,7 +442,7 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
}
}
- int64_t s = calculateAdlChannelGoodness(a, voices[ccount]);
+ int64_t s = calculateChipChannelGoodness(a, voices[ccount]);
if(s > bs)
{
bs = (int32_t)s; // Best candidate wins
@@ -458,7 +459,7 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
continue; // Could not play this note. Ignore it.
}
- prepareAdlChannelForNewNote(static_cast<size_t>(c), voices[ccount]);
+ prepareChipChannelForNewNote(static_cast<size_t>(c), voices[ccount]);
adlchannel[ccount] = c;
}
@@ -517,13 +518,15 @@ bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
void MIDIplay::realTime_NoteOff(uint8_t channel, uint8_t note)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
noteOff(channel, note);
}
void MIDIplay::realTime_NoteAfterTouch(uint8_t channel, uint8_t note, uint8_t atVal)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
MIDIchannel &chan = m_midiChannels[channel];
MIDIchannel::activenoteiterator i = m_midiChannels[channel].activenotes_find(note);
if(i)
@@ -544,13 +547,15 @@ void MIDIplay::realTime_NoteAfterTouch(uint8_t channel, uint8_t note, uint8_t at
void MIDIplay::realTime_ChannelAfterTouch(uint8_t channel, uint8_t atVal)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].aftertouch = atVal;
}
void MIDIplay::realTime_Controller(uint8_t channel, uint8_t type, uint8_t value)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
switch(type)
{
case 1: // Adjust vibrato
@@ -699,39 +704,45 @@ void MIDIplay::realTime_Controller(uint8_t channel, uint8_t type, uint8_t value)
void MIDIplay::realTime_PatchChange(uint8_t channel, uint8_t patch)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].patch = patch;
}
void MIDIplay::realTime_PitchBend(uint8_t channel, uint16_t pitch)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].bend = int(pitch) - 8192;
noteUpdateAll(channel, Upd_Pitch);
}
void MIDIplay::realTime_PitchBend(uint8_t channel, uint8_t msb, uint8_t lsb)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].bend = int(lsb) + int(msb) * 128 - 8192;
noteUpdateAll(channel, Upd_Pitch);
}
void MIDIplay::realTime_BankChangeLSB(uint8_t channel, uint8_t lsb)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].bank_lsb = lsb;
}
void MIDIplay::realTime_BankChangeMSB(uint8_t channel, uint8_t msb)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].bank_msb = msb;
}
void MIDIplay::realTime_BankChange(uint8_t channel, uint16_t bank)
{
- channel = channel % 16;
+ if(static_cast<size_t>(channel) > m_midiChannels.size())
+ channel = channel % 16;
m_midiChannels[channel].bank_lsb = uint8_t(bank & 0xFF);
m_midiChannels[channel].bank_msb = uint8_t((bank >> 8) & 0xFF);
}
@@ -1001,7 +1012,7 @@ void MIDIplay::AudioTick(uint32_t chipId, uint32_t rate)
}
#endif
-void MIDIplay::noteUpdate(uint16_t midCh,
+void MIDIplay::noteUpdate(size_t midCh,
MIDIplay::MIDIchannel::activenoteiterator i,
unsigned props_mask,
int32_t select_adlchn)
@@ -1013,7 +1024,7 @@ void MIDIplay::noteUpdate(uint16_t midCh,
const int midiins = static_cast<int>(info.midiins);
const adlinsdata2 &ains = *info.ains;
AdlChannel::Location my_loc;
- my_loc.MidCh = midCh;
+ my_loc.MidCh = static_cast<uint16_t>(midCh);
my_loc.note = info.note;
for(unsigned ccount = 0, ctotal = info.chip_channels_count; ccount < ctotal; ccount++)
@@ -1236,7 +1247,7 @@ void MIDIplay::setErrorString(const std::string &err)
errorStringOut = err;
}
-int64_t MIDIplay::calculateAdlChannelGoodness(size_t c, const MIDIchannel::NoteInfo::Phys &ins) const
+int64_t MIDIplay::calculateChipChannelGoodness(size_t c, const MIDIchannel::NoteInfo::Phys &ins) const
{
int64_t s = (m_synth.m_musicMode != OPL3::MODE_CMF) ? -m_chipChannels[c].koff_time_until_neglible : 0;
@@ -1306,7 +1317,7 @@ int64_t MIDIplay::calculateAdlChannelGoodness(size_t c, const MIDIchannel::NoteI
}
-void MIDIplay::prepareAdlChannelForNewNote(size_t c, const MIDIchannel::NoteInfo::Phys &ins)
+void MIDIplay::prepareChipChannelForNewNote(size_t c, const MIDIchannel::NoteInfo::Phys &ins)
{
if(m_chipChannels[c].users_empty()) return; // Nothing to do
@@ -1424,7 +1435,7 @@ void MIDIplay::panic()
}
}
-void MIDIplay::killSustainingNotes(int32_t MidCh, int32_t this_adlchn, uint8_t sustain_type)
+void MIDIplay::killSustainingNotes(int32_t midCh, int32_t this_adlchn, uint8_t sustain_type)
{
uint32_t first = 0, last = m_synth.m_numChannels;
@@ -1444,7 +1455,7 @@ void MIDIplay::killSustainingNotes(int32_t MidCh, int32_t this_adlchn, uint8_t s
AdlChannel::LocationData *j = jnext;
jnext = jnext->next;
- if((MidCh < 0 || j->loc.MidCh == MidCh)
+ if((midCh < 0 || j->loc.MidCh == midCh)
&& ((j->sustained & sustain_type) != 0))
{
int midiins = '?';
@@ -1462,7 +1473,7 @@ void MIDIplay::killSustainingNotes(int32_t MidCh, int32_t this_adlchn, uint8_t s
}
}
-void MIDIplay::markSostenutoNotes(int32_t MidCh)
+void MIDIplay::markSostenutoNotes(int32_t midCh)
{
uint32_t first = 0, last = m_synth.m_numChannels;
for(uint32_t c = first; c < last; ++c)
@@ -1474,46 +1485,46 @@ void MIDIplay::markSostenutoNotes(int32_t MidCh)
{
AdlChannel::LocationData *j = jnext;
jnext = jnext->next;
- if((j->loc.MidCh == MidCh) && (j->sustained == AdlChannel::LocationData::Sustain_None))
+ if((j->loc.MidCh == midCh) && (j->sustained == AdlChannel::LocationData::Sustain_None))
j->sustained |= AdlChannel::LocationData::Sustain_Sostenuto;
}
}
}
-void MIDIplay::setRPN(unsigned MidCh, unsigned value, bool MSB)
+void MIDIplay::setRPN(size_t midCh, unsigned value, bool MSB)
{
- bool nrpn = m_midiChannels[MidCh].nrpn;
- unsigned addr = m_midiChannels[MidCh].lastmrpn * 0x100 + m_midiChannels[MidCh].lastlrpn;
+ bool nrpn = m_midiChannels[midCh].nrpn;
+ unsigned addr = m_midiChannels[midCh].lastmrpn * 0x100 + m_midiChannels[midCh].lastlrpn;
switch(addr + nrpn * 0x10000 + MSB * 0x20000)
{
case 0x0000 + 0*0x10000 + 1*0x20000: // Pitch-bender sensitivity
- m_midiChannels[MidCh].bendsense_msb = value;
- m_midiChannels[MidCh].updateBendSensitivity();
+ m_midiChannels[midCh].bendsense_msb = value;
+ m_midiChannels[midCh].updateBendSensitivity();
break;
case 0x0000 + 0*0x10000 + 0*0x20000: // Pitch-bender sensitivity LSB
- m_midiChannels[MidCh].bendsense_lsb = value;
- m_midiChannels[MidCh].updateBendSensitivity();
+ m_midiChannels[midCh].bendsense_lsb = value;
+ m_midiChannels[midCh].updateBendSensitivity();
break;
case 0x0108 + 1*0x10000 + 1*0x20000:
if((m_synthMode & Mode_XG) != 0) // Vibrato speed
{
- if(value == 64) m_midiChannels[MidCh].vibspeed = 1.0;
- else if(value < 100) m_midiChannels[MidCh].vibspeed = 1.0 / (1.6e-2 * (value ? value : 1));
- else m_midiChannels[MidCh].vibspeed = 1.0 / (0.051153846 * value - 3.4965385);
- m_midiChannels[MidCh].vibspeed *= 2 * 3.141592653 * 5.0;
+ if(value == 64) m_midiChannels[midCh].vibspeed = 1.0;
+ else if(value < 100) m_midiChannels[midCh].vibspeed = 1.0 / (1.6e-2 * (value ? value : 1));
+ else m_midiChannels[midCh].vibspeed = 1.0 / (0.051153846 * value - 3.4965385);
+ m_midiChannels[midCh].vibspeed *= 2 * 3.141592653 * 5.0;
}
break;
case 0x0109 + 1*0x10000 + 1*0x20000:
if((m_synthMode & Mode_XG) != 0) // Vibrato depth
{
- m_midiChannels[MidCh].vibdepth = ((value - 64) * 0.15) * 0.01;
+ m_midiChannels[midCh].vibdepth = ((value - 64) * 0.15) * 0.01;
}
break;
case 0x010A + 1*0x10000 + 1*0x20000:
if((m_synthMode & Mode_XG) != 0) // Vibrato delay in millisecons
{
- m_midiChannels[MidCh].vibdelay = value ? int64_t(0.2092 * std::exp(0.0795 * (double)value)) : 0;
+ m_midiChannels[midCh].vibdelay = value ? int64_t(0.2092 * std::exp(0.0795 * (double)value)) : 0;
}
break;
default:/* UI.PrintLn("%s %04X <- %d (%cSB) (ch %u)",
@@ -1532,7 +1543,7 @@ void MIDIplay::updatePortamento(size_t midCh)
}
-void MIDIplay::noteOff(uint16_t midCh, uint8_t note)
+void MIDIplay::noteOff(size_t midCh, uint8_t note)
{
MIDIchannel::activenoteiterator
i = m_midiChannels[midCh].activenotes_find(note);