diff options
author | Vitaly Novichkov <admin@wohlnet.ru> | 2018-06-15 01:37:43 +0300 |
---|---|---|
committer | Vitaly Novichkov <admin@wohlnet.ru> | 2018-06-15 01:37:43 +0300 |
commit | 70c83caace9911dc5d8b80c1653c96b073f88e4a (patch) | |
tree | 0906a3ac8558966153789da8e9ab382d3162f49f | |
parent | a3e8ca2f942b466b658800a26a5674334b8c15ab (diff) | |
download | libADLMIDI-70c83caace9911dc5d8b80c1653c96b073f88e4a.tar.gz libADLMIDI-70c83caace9911dc5d8b80c1653c96b073f88e4a.tar.bz2 libADLMIDI-70c83caace9911dc5d8b80c1653c96b073f88e4a.zip |
Give more live to very long sustaining notes
-rw-r--r-- | src/adldata.hh | 2 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 10 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 3 |
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; }; |