diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adlmidi_midiplay.cpp | 54 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 2 |
2 files changed, 52 insertions, 4 deletions
diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 2c10331..76641a6 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -158,6 +158,40 @@ void MIDIplay::MidiTrackRow::reset() events.clear(); } +void TEMP_DEBUG_printSet(std::set<size_t> &container, const char *messsage = "") +{ + std::printf("===============%s===============\n", messsage); + std::printf("Set Count: %u\n", container.size()); + std::fflush(stdout); + if(container.empty()) + return; + for(std::set<size_t>::iterator j = container.begin(); j != container.end(); j++) + { + size_t field = *j; + std::printf("SET ITEM: [%d]\n", (unsigned int)(field)); + std::fflush(stdout); + } + std::printf("---------------%s-END-----------\n", messsage); + std::fflush(stdout); +} + +void TEMP_DEBUG_printVector(std::vector<MIDIplay::MidiEvent> &container, const char *messsage = "") +{ + std::printf("===============%s===============\n", messsage); + std::printf("Vector Count: %u\n", container.size()); + std::fflush(stdout); + if(container.empty()) + return; + for(std::vector<MIDIplay::MidiEvent>::iterator j = container.begin(); j != container.end(); j++) + { + MIDIplay::MidiEvent &e = *j; + std::printf("VECTOR ITEM: Ch %d, Valid %d, Type %d\n", j->channel, (int)j->isValid, j->type); + std::fflush(stdout); + } + std::printf("---------------%s-END-----------\n", messsage); + std::fflush(stdout); +} + void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) { typedef std::vector<MidiEvent> EvtArr; @@ -188,12 +222,15 @@ void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) anyOther.push_back(events[i]); } + TEMP_DEBUG_printVector(noteOffs, "Filled"); + /* * If Note-Off and it's Note-On is on the same row - move this damned note off down! */ if(noteStates) { std::set<size_t> markAsOn; + TEMP_DEBUG_printSet(markAsOn, "Initialized"); for(size_t i = 0; i < anyOther.size(); i++) { const MidiEvent e = anyOther[i]; @@ -202,7 +239,7 @@ void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) const size_t note_i = (e.channel * 255) + (e.data[0] & 0x7F); //Check, was previously note is on or off bool wasOn = noteStates[note_i]; - markAsOn.insert(note_i); + markAsOn.insert(note_i); TEMP_DEBUG_printSet(markAsOn, "Inserted"); // Detect zero-length notes are following previously pressed note int noteOffsOnSameNote = 0; for(EvtArr::iterator j = noteOffs.begin(); j != noteOffs.end();) @@ -218,7 +255,7 @@ void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) { anyOther.push_back(*j); j = noteOffs.erase(j); - markAsOn.erase(note_i); + markAsOn.erase(note_i); TEMP_DEBUG_printSet(markAsOn, "Erased"); continue; } else { //When same row has many note-offs on same row @@ -228,9 +265,16 @@ void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) } } j++; + TEMP_DEBUG_printVector(noteOffs, "Iterated"); } + TEMP_DEBUG_printVector(noteOffs, "Quit from noteOffs loop"); + TEMP_DEBUG_printSet(markAsOn, "Quit from noteOffs loop"); } + TEMP_DEBUG_printVector(noteOffs, "Quit from if NOTEON"); + TEMP_DEBUG_printSet(markAsOn, "Quit from if NOTEON"); } + TEMP_DEBUG_printVector(noteOffs, "Quit from anyOther loop"); + TEMP_DEBUG_printSet(markAsOn, "Quit from anyOther loop"); //Mark other notes as released for(EvtArr::iterator j = noteOffs.begin(); j != noteOffs.end(); j++) @@ -238,10 +282,14 @@ void MIDIplay::MidiTrackRow::sortEvents(bool *noteStates) size_t note_i = (j->channel * 255) + (j->data[0] & 0x7F); noteStates[note_i] = false; } + TEMP_DEBUG_printVector(noteOffs, "Post-process noteOffs"); + TEMP_DEBUG_printSet(markAsOn, "Post-process noteOffs"); for(std::set<size_t>::iterator j = markAsOn.begin(); j != markAsOn.end(); j++) noteStates[*j] = true; + TEMP_DEBUG_printVector(noteOffs, "Post-process markAsOn"); + TEMP_DEBUG_printSet(markAsOn, "Post-process markAsOn"); } /***********************************************************************************/ @@ -2057,7 +2105,7 @@ void MIDIplay::HandleEvent(size_t tk, const MIDIplay::MidiEvent &evt, int &statu } } -long MIDIplay::CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t) +long MIDIplay::CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t) const { long s = -ch[c].koff_time_until_neglible; diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 6ab9437..f906ad2 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -936,7 +936,7 @@ private: // Determine how good a candidate this adlchannel // would be for playing a note from this instrument. - long CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t /*MidCh*/); + long CalculateAdlChannelGoodness(unsigned c, const MIDIchannel::NoteInfo::Phys &ins, uint16_t /*MidCh*/) const; // A new note will be played on this channel using this instrument. // Kill existing notes on this channel (or don't, if we do arpeggio) |