aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-11-05 18:20:25 +0300
committerWohlstand <admin@wohlnet.ru>2017-11-05 18:20:25 +0300
commit44b9892c91476fe4e64b67f3868322b097003335 (patch)
treee26b1a283c801b2acd7b2f3a3f3df660a58deff0
parent9651207118e3faad510bfe337674f485704ff532 (diff)
downloadlibADLMIDI-44b9892c91476fe4e64b67f3868322b097003335.tar.gz
libADLMIDI-44b9892c91476fe4e64b67f3868322b097003335.tar.bz2
libADLMIDI-44b9892c91476fe4e64b67f3868322b097003335.zip
Don't apply a too-short percussion note fix on IMF/CMF and RSXX musics.
-rw-r--r--src/adlmidi_load.cpp8
-rw-r--r--src/adlmidi_midiplay.cpp14
-rw-r--r--src/adlmidi_opl3.cpp5
-rw-r--r--src/adlmidi_private.hpp11
4 files changed, 26 insertions, 12 deletions
diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp
index d7a0b82..387ca12 100644
--- a/src/adlmidi_load.cpp
+++ b/src/adlmidi_load.cpp
@@ -375,7 +375,8 @@ bool MIDIplay::LoadMIDI(MIDIplay::fileReader &fr)
opl.ScaleModulators = m_setup.ScaleModulators;
opl.LogarithmicVolumes = m_setup.LogarithmicVolumes;
- opl.CartoonersVolumes = false;
+ //opl.CartoonersVolumes = false;
+ opl.m_musicMode = OPL3::MODE_MIDI;
opl.ChangeVolumeRangesModel(static_cast<ADLMIDI_VolumeModels>(m_setup.VolumeModel));
if(m_setup.VolumeModel == ADLMIDI_VolumeModel_AUTO)//Use bank default volume model
opl.m_volumeScale = (OPL3::VolumesScale)adlbanksetup[m_setup.AdlBank].volumeModel;
@@ -551,6 +552,7 @@ riffskip:
//std::printf("CMF deltas %u ticks %u, basictempo = %u\n", deltas, ticks, basictempo);
opl.LogarithmicVolumes = true;
opl.AdlPercussionMode = true;
+ opl.m_musicMode = OPL3::MODE_CMF;
opl.m_volumeScale = OPL3::VOLUME_CMF;
}
else
@@ -567,7 +569,8 @@ riffskip:
TrackCount = 1;
DeltaTicks = 60;
opl.LogarithmicVolumes = true;
- opl.CartoonersVolumes = true;
+ //opl.CartoonersVolumes = true;
+ opl.m_musicMode = OPL3::MODE_RSXX;
opl.m_volumeScale = OPL3::VOLUME_CMF;
}
}
@@ -685,6 +688,7 @@ riffskip:
//CurrentPosition.began = true;
//std::fprintf(stderr, "Done reading IMF file\n");
opl.NumFourOps = 0; //Don't use 4-operator channels for IMF playing!
+ opl.m_musicMode = OPL3::MODE_IMF;
}
else
{
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp
index 2a67590..27ec8d4 100644
--- a/src/adlmidi_midiplay.cpp
+++ b/src/adlmidi_midiplay.cpp
@@ -277,9 +277,10 @@ bool MIDIplay::buildTrackData()
//Time delay that follows the first event in the track
{
MidiTrackRow evtPos;
- if(!opl.CartoonersVolumes)
+ if(opl.m_musicMode == OPL3::MODE_RSXX)
+ ok = true;
+ else
evtPos.delay = ReadVarLenEx(&trackPtr, end, ok);
- else ok = true;
if(!ok)
{
int len = std::snprintf(error, 150, "buildTrackData: Can't read variable-length value at begin of track %d.\n", (int)tk);
@@ -526,10 +527,11 @@ bool MIDIplay::buildTrackData()
//move too short percussion note-offs far far away as possible
/********************************************************************************/
#if 1 //Use this to record WAVEs for comparison before/after implementing of this
+ if(opl.m_musicMode == OPL3::MODE_MIDI)//Percussion fix is needed for MIDI only, not for IMF/RSXX or CMF
{
- //! Minimal real time in seconds
+//! Minimal real time in seconds
#define DRUM_NOTE_MIN_TIME 0.03
- //! Minimal ticks count
+//! Minimal ticks count
#define DRUM_NOTE_MIN_TICKS 15
struct NoteState
{
@@ -822,7 +824,7 @@ void MIDIplay::realTime_ResetState()
for(size_t ch = 0; ch < Ch.size(); ch++)
{
MIDIchannel &chan = Ch[ch];
- chan.volume = opl.CartoonersVolumes ? 127 : 100;
+ chan.volume = (opl.m_musicMode == OPL3::MODE_RSXX) ? 127 : 100;
chan.expression = 127;
chan.panning = 0x30;
chan.vibrato = 0;
@@ -842,7 +844,7 @@ void MIDIplay::realTime_ResetState()
bool MIDIplay::realTime_NoteOn(uint8_t channel, uint8_t note, uint8_t velocity)
{
- if((opl.CartoonersVolumes) && (velocity != 0))
+ if((opl.m_musicMode == OPL3::MODE_RSXX) && (velocity != 0))
{
// Check if this is just a note after-touch
MIDIchannel::activenoteiterator i = Ch[channel].activenotes.find(note);
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index ef3d3c3..ed005b1 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -144,7 +144,8 @@ OPL3::OPL3() :
HighVibratoMode(false),
AdlPercussionMode(false),
LogarithmicVolumes(false),
- CartoonersVolumes(false),
+ //CartoonersVolumes(false),
+ m_musicMode(MODE_MIDI),
m_volumeScale(VOLUME_Generic)
{}
@@ -264,7 +265,7 @@ void OPL3::Touch_Real(unsigned c, unsigned volume)
{ true, true } /* 4 op AM-AM ops 3&4 */
};
- if(CartoonersVolumes)
+ if(m_musicMode == MODE_RSXX)
{
Poke(card, 0x40 + o1, x);
if(o2 != 0xFFF)
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index 3749129..a0f2a51 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -156,8 +156,15 @@ public:
bool ScaleModulators;
//! Required to play CMF files. Can be turned on by using of "CMF" volume model
bool LogarithmicVolumes;
- //! Required to play EA-MUS files
- bool CartoonersVolumes;
+ // ! Required to play EA-MUS files [REPLACED WITH "m_musicMode", DEPRECATED!!!]
+ //bool CartoonersVolumes;
+ enum MusicMode
+ {
+ MODE_MIDI,
+ MODE_IMF,
+ MODE_CMF,
+ MODE_RSXX
+ } m_musicMode;
//! Just a padding. Reserved.
char ___padding2[3];
//! Volume models enum