From 9284586c256dfc058040df57664eddd91b73db85 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Thu, 19 May 2011 16:25:29 +0000 Subject: fixed bug in midi.cpp and cleaned up a bit --- muse2/muse/midi.cpp | 85 +++++------------------------------------------------ 1 file changed, 7 insertions(+), 78 deletions(-) diff --git a/muse2/muse/midi.cpp b/muse2/muse/midi.cpp index 52119692..39ae7874 100644 --- a/muse2/muse/midi.cpp +++ b/muse2/muse/midi.cpp @@ -14,7 +14,6 @@ #include "song.h" #include "midi.h" #include "drummap.h" -//#include "midiedit/drummap.h" // p4.0.2 #include "event.h" #include "globals.h" #include "midictrl.h" @@ -220,12 +219,8 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, if(!(ev.isNoteOff() && loopn == 0)) { if(cmode == Song::CYCLE_REPLACE && loopn < loopc) - { - // Added by Tim. p3.3.8 - //printf("buildMidiEventList: CYCLE_REPLACE t:%d type:%d A:%d B:%d ln:%d lc:%d\n", tick, ev.type(), ev.dataA(), ev.dataB(), loopn, loopc); - continue; - } + // If we want NORMAL, same as REPLACE except keep all events from the previous loop // from rec stop position to right marker (and beyond). if(cmode == Song::CYCLE_NORMAL) @@ -233,12 +228,7 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, // Not sure of accuracy here. Adjust? Adjusted when used elsewhere? unsigned endRec = audio->getEndRecordPos().tick(); if((tick < endRec && loopn < loopc) || (tick >= endRec && loopn < (loopc - 1))) - { - // Added by Tim. p3.3.8 - //printf("buildMidiEventList: CYCLE_NORMAL t:%d type:%d A:%d B:%d ln:%d lc:%d\n", tick, ev.type(), ev.dataA(), ev.dataB(), loopn, loopc); - continue; - } } } } @@ -451,8 +441,6 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, } break; case 0x59: // Key Signature - // track->scale.set(data[0]); - // track->scale.setMajorMinor(data[1]); break; default: printf("unknown Meta 0x%x %d\n", ev.dataA(), ev.dataA()); @@ -462,63 +450,21 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, } // switch(ev.type() if (!e.empty()) { e.setTick(tick); - // Added by Tim. p3.3.8 - //printf("buildMidiEventList: mel adding t:%d type:%d A:%d B:%d C:%d\n", tick, e.type(), e.dataA(), e.dataB(), e.dataC()); - mel.add(e); } } // i != el->end() + //--------------------------------------------------- - // resolve NoteOff events + // read NoteOn events and remove corresponding NoteOffs //--------------------------------------------------- -// for (iEvent i = mel.begin(); i != mel.end(); ++i) { -// Event event = i->second; -// if (event.isNote()) -// event.setLenTick(0); -// } - // Added by Tim. p3.3.8 // Loop removed by flo for (iEvent i = mel.begin(); i != mel.end(); ++i) { Event ev = i->second; if (ev.isNote()) { - if (ev.isNoteOff()) { - iEvent k; - bool found = false; - for (k = i; k != mel.end(); ++k) { - Event event = k->second; - if (event.tick() > ev.tick()) - break; - if (event.isNoteOff(ev)) { - ev.setLenTick(1); - ev.setVelo(event.velo()); - ev.setVeloOff(0); - // Added by Tim. p3.3.8 - //printf("buildMidiEventList: found note off: event t:%d len:%d type:%d A:%d B:%d C:%d ev t:%d len:%d type:%d A:%d B:%d C:%d\n", event.tick(), event.lenTick(), event.type(), event.dataA(), event.dataB(), event.dataC(), ev.tick(), ev.lenTick(), ev.type(), ev.dataA(), ev.dataB(), ev.dataC()); - - found = true; - break; - } - } - if (!found) { - printf("NOTE OFF without Note ON tick %d type %d %d %d\n", - ev.tick(), ev.type(), ev.pitch(), ev.velo()); - continue; - } - else { - if (k==i) - printf("ERROR: THIS SHOULD NEVER HAPPEN: k==i in midi.cpp:buildMidiEventList()\n"); - else - mel.erase(k); - - // we may safely continue, because k!=i; only erasing - // i itself would invalidate it and require additional stuff - continue; - } - } - else { // !ev.isNoteOff() + if (!ev.isNoteOff()) { // Added by Tim. p3.3.8 // If the event length is not zero, it means the event and its @@ -542,9 +488,6 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, } ev.setLenTick(t); ev.setVeloOff(event.veloOff()); - // Added by Tim. p3.3.8 - //printf("buildMidiEventList: set len and velOff: event t:%d len:%d type:%d A:%d B:%d C:%d ev t:%d len:%d type:%d A:%d B:%d C:%d\n", event.tick(), event.lenTick(), event.type(), event.dataA(), event.dataB(), event.dataC(), ev.tick(), ev.lenTick(), ev.type(), ev.dataA(), ev.dataB(), ev.dataC()); - break; } } @@ -558,7 +501,9 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, ev.setLenTick(endTick-ev.tick()); } else { - if (k==i) + if (k==i) + //this will never happen, because i->second has to be a NOTE ON, + //while k has to be a NOTE OFF. but in case something changes: printf("ERROR: THIS SHOULD NEVER HAPPEN: k==i in midi.cpp:buildMidiEventList()\n"); else mel.erase(k); @@ -569,24 +514,12 @@ void buildMidiEventList(EventList* del, const MPEventList* el, MidiTrack* track, } } -// DEBUG: any note offs left? - - // Removed by Tim. p3.3.8 - //for (iEvent i = mel.begin(); i != mel.end(); ++i) { - // Event ev = i->second; - // if (ev.isNoteOff()) { - // printf("+extra note-off! %d pitch %d velo %d\n", - // i->first, ev.pitch(), ev.velo()); -// ev.dump(); - // } - // } for (iEvent i = mel.begin(); i != mel.end(); ++i) { Event ev = i->second; if (ev.isNoteOff()) { printf("+extra note-off! %d pitch %d velo %d\n", i->first, ev.pitch(), ev.velo()); -// ev.dump(); continue; } int tick = CALC_TICK(ev.tick()); //(ev.tick() * config.division + div/2) / div; @@ -865,8 +798,6 @@ void Audio::collectEvents(MidiTrack* track, unsigned int cts, unsigned int nts) // Added by T356. case Controller: { - //int len = ev.lenTick(); - //int pitch = ev.pitch(); if (track->type() == Track::DRUM) { int ctl = ev.dataA(); @@ -889,8 +820,6 @@ void Audio::collectEvents(MidiTrack* track, unsigned int cts, unsigned int nts) mdAlt->playEvents()->add(MidiPlayEvent(tick, port, channel, ME_CONTROLLER, ctl | pitch, ev.dataB())); else - - //playEvents->add(MidiPlayEvent(frame, port, channel, ev)); mdAlt->playEvents()->add(MidiPlayEvent(frame, port, channel, ME_CONTROLLER, ctl | pitch, ev.dataB())); -- cgit v1.2.3