diff options
author | Werner Schweer <ws.seh.de> | 2006-11-08 18:23:35 +0000 |
---|---|---|
committer | Werner Schweer <ws.seh.de> | 2006-11-08 18:23:35 +0000 |
commit | 9f7cb48d79c1fd9292c16c5fd3784a14aaa1000b (patch) | |
tree | f55820e4423d05cf40ecb5814ef6ac73b05a7380 /muse/muse/midiout.cpp | |
parent | 1bd28c3efd22eb16aaaf979e2fdb0bafd364a7dc (diff) |
big update
Diffstat (limited to 'muse/muse/midiout.cpp')
-rw-r--r-- | muse/muse/midiout.cpp | 62 |
1 files changed, 21 insertions, 41 deletions
diff --git a/muse/muse/midiout.cpp b/muse/muse/midiout.cpp index c07b2822..79928cb7 100644 --- a/muse/muse/midiout.cpp +++ b/muse/muse/midiout.cpp @@ -23,7 +23,6 @@ #include "track.h" #include "al/tempo.h" #include "event.h" -#include "midichannel.h" #include "sync.h" #include "audio.h" #include "gconfig.h" @@ -199,6 +198,7 @@ void MidiOut::seek(unsigned tickPos, unsigned framePos) // set all controller //--------------------------------------------------- +#if 0 for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { MidiChannel* mc = channel(ch); if (mc->mute() || mc->noInRoute() || !mc->autoRead()) @@ -212,6 +212,7 @@ void MidiOut::seek(unsigned tickPos, unsigned framePos) } } } +#endif } //--------------------------------------------------------- @@ -239,6 +240,7 @@ void MidiOut::stop() // reset sustain //--------------------------------------------------- +#if 0 for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { MidiChannel* mc = channel(ch); if (mc->noInRoute()) @@ -249,6 +251,7 @@ void MidiOut::stop() track->routeEvent(ev); } } +#endif if (track->sendSync()) { if (genMMC) { unsigned char mmcPos[] = { @@ -315,14 +318,15 @@ void MidiOut::reset() // process // Collect all midi events for the current process cycle and put // into _schedEvents queue. For note on events create the proper -// note off events. The note off events maybe played after the +// note off events. The note off events maybe played later after the // current process cycle. // From _schedEvents queue copy all events for the current cycle // to all output routes. Events routed to ALSA go into the // _playEvents queue which is processed by the MidiSeq thread. //------------------------------------------------------------------- -void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick, unsigned /*fromFrame*/, unsigned /*toFrame*/) +void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick, + unsigned, unsigned) { while (!eventFifo.isEmpty()) el.insert(eventFifo.get()); @@ -343,46 +347,22 @@ void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick, } } } - for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { - MidiChannel* mc = channel(ch); - - if (mc->mute() || mc->noInRoute()) + foreach (const Route& r, *track->inRoutes()) { + MidiTrackBase* t = (MidiTrackBase*)r.src.track; + int dstChannel = r.dst.channel; + if (t->isMute()) continue; - // collect channel controller - if (fromTick != toTick) { - CtrlList* cl = mc->controller(); - for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) { - Ctrl* c = ic->second; - iCtrlVal is = c->lowerBound(fromTick); - iCtrlVal ie = c->lowerBound(toTick); - for (; is != ie; ++is) { - unsigned frame = AL::tempomap.tick2frame(is.key()); - Event ev(Controller); - ev.setA(c->id()); - ev.setB(is.value().i); - el.insert(MidiEvent(frame, ch, ev)); - } - } - } - - // Collect midievents from all input tracks for outport - RouteList* rl = mc->inRoutes(); - for (iRoute i = rl->begin(); i != rl->end(); ++i) { - MidiTrackBase* track = (MidiTrackBase*)i->track; - if (track->isMute()) - continue; - MidiEventList ell; - track->getEvents(fromTick, toTick, 0, &ell); - int velo = 0; - for (iMidiEvent i = ell.begin(); i != ell.end(); ++i) { - MidiEvent ev(*i); - ev.setChannel(ch); - el.insert(ev); - if (ev.type() == ME_NOTEON) - velo += ev.dataB(); - } - mc->addMidiMeter(velo); + MidiEventList ell; + t->getEvents(fromTick, toTick, r.src.channel, &ell); + int velo = 0; + for (iMidiEvent i = ell.begin(); i != ell.end(); ++i) { + MidiEvent ev(*i); + ev.setChannel(dstChannel); + el.insert(ev); + if (ev.type() == ME_NOTEON) + velo += ev.dataB(); } + t->addMidiMeter(velo); } } |