aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/adldata.hh2
-rw-r--r--src/adlmidi_midiplay.cpp10
-rw-r--r--src/adlmidi_private.hpp3
3 files changed, 10 insertions, 5 deletions
diff --git a/src/adldata.hh b/src/adldata.hh
index 2ac469f..104db82 100644
--- a/src/adldata.hh
+++ b/src/adldata.hh
@@ -61,6 +61,8 @@ int maxAdlBanks();
extern const unsigned short banks[][256];
extern const char* const banknames[];
+enum { adlNoteOnMaxTime = 40000 };
+
/**
* @brief Instrument data with operators included
*/
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index d7155f4..0623ce7 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -100,17 +100,16 @@ inline bool isXgPercChannel(uint8_t msb, uint8_t lsb)
void MIDIplay::AdlChannel::AddAge(int64_t ms)
{
+ const int64_t neg = static_cast<int64_t>(-0x1FFFFFFFl);
if(users_empty())
- koff_time_until_neglible =
- std::max(int64_t(koff_time_until_neglible - ms), static_cast<int64_t>(-0x1FFFFFFFl));
+ koff_time_until_neglible = std::max(int64_t(koff_time_until_neglible - ms), neg);
else
{
koff_time_until_neglible = 0;
-
for(LocationData *i = users_first; i; i = i->next)
{
- i->kon_time_until_neglible =
- std::max(i->kon_time_until_neglible - ms, static_cast<int64_t>(-0x1FFFFFFFl));
+ if(!i->fixed_sustain)
+ i->kon_time_until_neglible = std::max(i->kon_time_until_neglible - ms, neg);
i->vibdelay += ms;
}
}
@@ -1466,6 +1465,7 @@ void MIDIplay::NoteUpdate(uint16_t MidCh,
{
d->sustained = false;
d->vibdelay = 0;
+ d->fixed_sustain = (ains.ms_sound_kon == static_cast<uint16_t>(adlNoteOnMaxTime));
d->kon_time_until_neglible = ains.ms_sound_kon;
d->ins = ins;
}
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index ed654ac..2499bad 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -752,6 +752,9 @@ public:
bool sustained;
char ____padding[7];
MIDIchannel::NoteInfo::Phys ins; // a copy of that in phys[]
+ //! Has fixed sustain, don't iterate "on" timeout
+ bool fixed_sustain;
+ //! Timeout until note will be allowed to be killed by channel manager while it is on
int64_t kon_time_until_neglible;
int64_t vibdelay;
};