diff options
author | Vitaly Novichkov <admin@wohlnet.ru> | 2018-06-25 20:37:03 +0300 |
---|---|---|
committer | Vitaly Novichkov <admin@wohlnet.ru> | 2018-06-25 20:37:03 +0300 |
commit | c5509c43b4010ecc3d4f8b464996b26756b645e6 (patch) | |
tree | f53e3f62b424b4f3052eece54d304039d8e1aada /src/midi_sequencer_impl.hpp | |
parent | e3a353a6b84b47ad4204b110249bc74b16554985 (diff) | |
parent | e1bb226e1b8235a2aa80141fc07a305b8a5f1818 (diff) | |
download | libADLMIDI-c5509c43b4010ecc3d4f8b464996b26756b645e6.tar.gz libADLMIDI-c5509c43b4010ecc3d4f8b464996b26756b645e6.tar.bz2 libADLMIDI-c5509c43b4010ecc3d4f8b464996b26756b645e6.zip |
Merge branch 'master' into stable
Diffstat (limited to 'src/midi_sequencer_impl.hpp')
-rw-r--r-- | src/midi_sequencer_impl.hpp | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index 501de8f..ce70c3e 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -26,6 +26,7 @@ #include <stdio.h> #include <memory> #include <cstring> +#include <cerrno> #include <iterator> // std::back_inserter #include <algorithm> // std::copy #include <set> @@ -172,7 +173,8 @@ void BW_MidiSequencer::MidiTrackRow::sortEvents(bool *noteStates) controllers.reserve(events.size()); controllers.push_back(events[i]); } - else if((events[i].type == MidiEvent::T_SPECIAL) && (events[i].subtype == MidiEvent::ST_MARKER)) + else if((events[i].type == MidiEvent::T_SPECIAL) + && ((events[i].subtype == MidiEvent::ST_MARKER) || (events[i].subtype == MidiEvent::ST_DEVICESWITCH))) { if(metas.capacity() == 0) metas.reserve(events.size()); @@ -686,7 +688,7 @@ bool BW_MidiSequencer::buildTrackData(const std::vector<std::vector<uint8_t> > & bool isOn; char ___pad[7]; } drNotes[255]; - uint16_t banks[16]; + size_t banks[16]; for(size_t tk = 0; tk < trackCount; ++tk) { @@ -712,10 +714,10 @@ bool BW_MidiSequencer::buildTrackData(const std::vector<std::vector<uint8_t> > & switch(ctrlno) { case 0: // Set bank msb (GM bank) - banks[et->channel] = uint16_t(uint16_t(value) << 8) | uint16_t(banks[et->channel] & 0x00FF); + banks[et->channel] = (value << 8) | (banks[et->channel] & 0x00FF); break; case 32: // Set bank lsb (XG bank) - banks[et->channel] = (banks[et->channel] & 0xFF00) | (uint16_t(value) & 0x00FF); + banks[et->channel] = (banks[et->channel] & 0xFF00) | (value & 0x00FF); break; } continue; @@ -1006,7 +1008,7 @@ BW_MidiSequencer::MidiEvent BW_MidiSequencer::parseEvent(const uint8_t **pptr, c for(size_t i = 0; i < data.size(); i++) { if(data[i] <= 'Z' && data[i] >= 'A') - data[i] = data[i] - ('Z' - 'z'); + data[i] = static_cast<char>(data[i] - ('Z' - 'z')); } if(data == "loopstart") @@ -1218,9 +1220,9 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve /*UI.PrintLn("@%X Track %u: %02X %02X", CurrentPosition.track[track].ptr-1, (unsigned)track, byte, TrackData[track][CurrentPosition.track[track].ptr]);*/ - uint8_t midCh = evt.channel;//byte & 0x0F, EvType = byte >> 4; + size_t midCh = evt.channel;//byte & 0x0F, EvType = byte >> 4; if(m_interface->rt_currentDevice) - midCh += (uint8_t)m_interface->rt_currentDevice(m_interface->rtUserData, track); + midCh += m_interface->rt_currentDevice(m_interface->rtUserData, track); status = evt.type; switch(evt.type) @@ -1228,7 +1230,7 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve case MidiEvent::T_NOTEOFF: // Note off { uint8_t note = evt.data[0]; - m_interface->rt_noteOff(m_interface->rtUserData, midCh, note); + m_interface->rt_noteOff(m_interface->rtUserData, static_cast<uint8_t>(midCh), note); break; } @@ -1236,7 +1238,7 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve { uint8_t note = evt.data[0]; uint8_t vol = evt.data[1]; - m_interface->rt_noteOn(m_interface->rtUserData, midCh, note, vol); + m_interface->rt_noteOn(m_interface->rtUserData, static_cast<uint8_t>(midCh), note, vol); break; } @@ -1244,7 +1246,7 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve { uint8_t note = evt.data[0]; uint8_t vol = evt.data[1]; - m_interface->rt_noteAfterTouch(m_interface->rtUserData, midCh, note, vol); + m_interface->rt_noteAfterTouch(m_interface->rtUserData, static_cast<uint8_t>(midCh), note, vol); break; } @@ -1252,20 +1254,20 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve { uint8_t ctrlno = evt.data[0]; uint8_t value = evt.data[1]; - m_interface->rt_controllerChange(m_interface->rtUserData, midCh, ctrlno, value); + m_interface->rt_controllerChange(m_interface->rtUserData, static_cast<uint8_t>(midCh), ctrlno, value); break; } case MidiEvent::T_PATCHCHANGE: // Patch change { - m_interface->rt_patchChange(m_interface->rtUserData, midCh, evt.data[0]); + m_interface->rt_patchChange(m_interface->rtUserData, static_cast<uint8_t>(midCh), evt.data[0]); break; } case MidiEvent::T_CHANAFTTOUCH: // Channel after-touch { uint8_t chanat = evt.data[0]; - m_interface->rt_channelAfterTouch(m_interface->rtUserData, midCh, chanat); + m_interface->rt_channelAfterTouch(m_interface->rtUserData, static_cast<uint8_t>(midCh), chanat); break; } @@ -1273,7 +1275,7 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve { uint8_t a = evt.data[0]; uint8_t b = evt.data[1]; - m_interface->rt_pitchBend(m_interface->rtUserData, midCh, b, a); + m_interface->rt_pitchBend(m_interface->rtUserData, static_cast<uint8_t>(midCh), b, a); break; } }//switch @@ -1405,7 +1407,6 @@ void BW_MidiSequencer::rewind() m_atEnd = false; m_loopStart = true; m_loopEnd = false; - //invalidLoop = false;//No more needed here as this flag is set on load time } void BW_MidiSequencer::setTempo(double tempo) @@ -1477,7 +1478,6 @@ bool BW_MidiSequencer::loadMIDI(FileAndMemReader &fr) m_format = Format_MIDI; bool is_GMF = false; // GMD/MUS files (ScummVM) - //bool is_MUS = false; // MUS/DMX files (Doom) bool is_IMF = false; // IMF bool is_CMF = false; // Creative Music format (CMF/CTMF) bool is_RSXX = false; // RSXX, such as Cartooners @@ -1769,15 +1769,13 @@ riffskip: rawTrackData[tk].insert(rawTrackData[tk].end(), special_event_buf, special_event_buf + 5); //if(delay>>21) TrackData[tk].push_back( 0x80 | ((delay>>21) & 0x7F ) ); if(delay >> 14) - rawTrackData[tk].push_back(0x80 | ((delay >> 14) & 0x7F)); + rawTrackData[tk].push_back(static_cast<uint8_t>(0x80 | ((delay >> 14) & 0x7F))); if(delay >> 7) - rawTrackData[tk].push_back(0x80 | ((delay >> 7) & 0x7F)); - rawTrackData[tk].push_back(((delay >> 0) & 0x7F)); + rawTrackData[tk].push_back(static_cast<uint8_t>(0x80 | ((delay >> 7) & 0x7F))); + rawTrackData[tk].push_back(static_cast<uint8_t>(((delay >> 0) & 0x7F))); } rawTrackData[tk].insert(rawTrackData[tk].end(), EndTag + 0, EndTag + 4); - //CurrentPosition.track[tk].delay = 0; - //CurrentPosition.began = true; } else { @@ -1816,19 +1814,6 @@ riffskip: rawTrackData[tk].insert(rawTrackData[tk].end(), EndTag + 0, EndTag + 4); if(is_RSXX)//Finalize raw track data with a zero rawTrackData[tk].push_back(0); - - //bool ok = false; - //// Read next event time - //uint64_t tkDelay = ReadVarLenEx(tk, ok); - //if(ok) - // CurrentPosition.track[tk].delay = tkDelay; - //else - //{ - // std::stringstream msg; - // msg << fr._fileName << ": invalid variable length in the track " << tk << "! (error code " << tkDelay << ")"; - // ADLMIDI_ErrorString = msg.str(); - // return false; - //} } } @@ -1841,7 +1826,7 @@ riffskip: return false; } - //Build new MIDI events table + // Build new MIDI events table if(!buildTrackData(rawTrackData)) { m_errorString = fr.fileName() + ": MIDI data parsing error has occouped!\n" + m_parsingErrorsString; |