diff options
Diffstat (limited to 'muse2/muse/midiseq.cpp')
-rw-r--r-- | muse2/muse/midiseq.cpp | 307 |
1 files changed, 3 insertions, 304 deletions
diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp index 8d0427d8..f6463d59 100644 --- a/muse2/muse/midiseq.cpp +++ b/muse2/muse/midiseq.cpp @@ -81,11 +81,6 @@ void MidiSeq::processMsg(const ThreadMsg* m) { MusECore::AudioMsg* msg = (MusECore::AudioMsg*)m; switch(msg->id) { - // This does not appear to be used anymore. Was sent in Audio::process1, DELETETHIS 5 ?? - // now Audio::processMidi is called directly. p4.0.15 Tim. - //case MusECore::MS_PROCESS: - // audio->processMidi(); - // break; case MusECore::SEQM_SEEK: processSeek(); @@ -104,52 +99,6 @@ void MidiSeq::processMsg(const ThreadMsg* m) break; - // Moved into Song::processMsg p4.0.34 ... - case MusECore::SEQM_ADD_TRACK: - MusEGlobal::song->insertTrack2(msg->track, msg->ival); - updatePollFd(); - break; - case MusECore::SEQM_REMOVE_TRACK: - MusEGlobal::song->cmdRemoveTrack(msg->track); - updatePollFd(); - break; - //case MusECore::SEQM_CHANGE_TRACK: DELETETHIS 4 - // MusEGlobal::song->changeTrack((Track*)(msg->p1), (Track*)(msg->p2)); - // updatePollFd(); - // break; - case MusECore::SEQM_ADD_PART: - MusEGlobal::song->cmdAddPart((Part*)msg->p1); - break; - case MusECore::SEQM_REMOVE_PART: - MusEGlobal::song->cmdRemovePart((Part*)msg->p1); - break; - case MusECore::SEQM_CHANGE_PART: - MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b); - break; - - - case MusECore::SEQM_SET_TRACK_OUT_CHAN: - { - MidiTrack* track = (MidiTrack*)(msg->p1); - track->setOutChanAndUpdate(msg->a); - } - break; - case MusECore::SEQM_SET_TRACK_OUT_PORT: - { - MidiTrack* track = (MidiTrack*)(msg->p1); - track->setOutPortAndUpdate(msg->a); - } - break; - case MusECore::SEQM_REMAP_PORT_DRUM_CTL_EVS: - MusEGlobal::song->remapPortDrumCtrlEvents(msg->ival, msg->a, msg->b, msg->c); - break; - case MusECore::SEQM_CHANGE_ALL_PORT_DRUM_CTL_EVS: - MusEGlobal::song->changeAllPortDrumCtrlEvents((bool)msg->a, (bool)msg->b); - break; - case MusECore::SEQM_SET_MIDI_DEVICE: - ((MidiPort*)(msg->p1))->setMidiDevice((MidiDevice*)(msg->p2)); - updatePollFd(); - break; case MusECore::SEQM_IDLE: idle = msg->a; break; @@ -169,35 +118,12 @@ void MidiSeq::processStop() // TODO Try to move this into Audio::stopRolling(). playStateExt = false; // not playing - // - // clear Alsa midi device notes and stop stuck notes - // + // clear Alsa midi device notes and stop stuck notes for(iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) - { - //MidiDevice* md = *id; DELETETHIS 3 - // Only ALSA devices are handled by this thread. - //if((*id)->deviceType() == MidiDevice::ALSA_MIDI) (*id)->handleStop(); - /* DELETETHIS 14 - if (md->midiPort() == -1) - continue; - MPEventList* pel = md->playEvents(); - MPEventList* sel = md->stuckNotes(); - pel->clear(); - for(iMPEvent i = sel->begin(); i != sel->end(); ++i) - { - MidiPlayEvent ev = *i; - ev.setTime(0); - pel->add(ev); - } - sel->clear(); - //md->setNextPlayEvent(pel->begin()); // Removed p4.0.15 - */ - } } #endif -#if 1 //DELETETHIS #if and #endif //--------------------------------------------------------- // processSeek //--------------------------------------------------------- @@ -209,62 +135,8 @@ void MidiSeq::processSeek() //--------------------------------------------------- for (iMidiDevice i = MusEGlobal::midiDevices.begin(); i != MusEGlobal::midiDevices.end(); ++i) - { - //MidiDevice* md = *i; DELETETHIS 3 - // Only ALSA devices are handled by this thread. - //if((*i)->deviceType() == MidiDevice::ALSA_MIDI) (*i)->handleSeek(); - /* DELETETHIS 47 - int port = md->midiPort(); - if (port == -1) - continue; - MidiPort* mp = &MusEGlobal::midiPorts[port]; - MidiCtrlValListList* cll = mp->controller(); - - MPEventList* el = md->playEvents(); - - if (MusEGlobal::audio->isPlaying()) - { - // stop all notes - el->clear(); - MPEventList* sel = dev->stuckNotes(); - for (iMPEvent i = sel->begin(); i != sel->end(); ++i) - { - MidiPlayEvent ev = *i; - ev.setTime(0); - el->add(ev); - } - sel->clear(); - } - //else - // Removed p4.0.15 Device now leaves beginning pointing at next event, - // immediately after playing some notes. - // NOTE: This removal needs testing. I'm not sure about this. - //el->erase(el->begin(), dev->nextPlayEvent()); - - for (iMidiCtrlValList ivl = cll->begin(); ivl != cll->end(); ++ivl) - { - MidiCtrlValList* vl = ivl->second; - //int val = vl->value(pos); - //if (val != CTRL_VAL_UNKNOWN) { - // int channel = ivl->first >> 24; - // el->add(MidiPlayEvent(0, port, channel, ME_CONTROLLER, vl->num(), val)); - // } - iMidiCtrlVal imcv = vl->iValue(pos); - if(imcv != vl->end()) - { - Part* p = imcv->second.part; - unsigned t = (unsigned)imcv->first; - // Do not add values that are outside of the part. - if(p && t >= p->tick() && t < (p->tick() + p->lenTick()) ) - el->add(MidiPlayEvent(0, port, ivl->first >> 24, ME_CONTROLLER, vl->num(), imcv->second.val)); - } - } - //dev->setNextPlayEvent(el->begin()); // Removed p4.0.15 - */ - } } -#endif //--------------------------------------------------------- // MidiSeq @@ -353,22 +225,6 @@ signed int MidiSeq::selectTimer() void MidiSeq::threadStart(void*) { - // Removed by Tim. p3.3.17 DELETETHIS 13 - /* - struct sched_param rt_param; - memset(&rt_param, 0, sizeof(rt_param)); - int prio_min = sched_get_priority_min(SCHED_FIFO); - int prio_max = sched_get_priority_max(SCHED_FIFO); - - if (prio < prio_min) prio = prio_min; - else if (prio > prio_max) prio = prio_max; - - rt_param.sched_priority = prio; - int rv = pthread_setschedparam(pthread_self(), SCHED_FIFO, &rt_param); - if (rv != 0) - perror("set realtime scheduler"); - */ - int policy; if ((policy = sched_getscheduler (0)) < 0) { printf("Cannot get current client scheduler: %s\n", strerror(errno)); @@ -398,19 +254,6 @@ static void midiRead(void*, void* d) dev->processInput(); } -// DELETETHIS 12 -//--------------------------------------------------------- -// synthIRead -//--------------------------------------------------------- - -#if 0 -static void synthIRead(void*, void* d) - { - SynthI* syn = (SynthI*) d; - syn->processInput(); - } -#endif - //--------------------------------------------------------- // midiWrite //--------------------------------------------------------- @@ -590,42 +433,6 @@ void MidiSeq::setSyncRecFilterPreset(MidiSyncInfo::SyncRecFilterPresetType type) } -//--------------------------------------------------------- -// processMidiClock -//--------------------------------------------------------- - -void MidiSeq::processMidiClock() - { - // DELETETHIS 30, maybe remove entire function? -// if (genMCSync) { -// MusEGlobal::midiPorts[txSyncPort].sendClock(); -// } - -/* if (state == START_PLAY) { - // start play on sync - state = PLAY; - _midiTick = playTickPos; - midiClock = playTickPos; - - int bar, beat, tick; - sigmap.tickValues(_midiTick, &bar, &beat, &tick); - midiClick = sigmap.bar2tick(bar, beat+1, 0); - - double cpos = MusEGlobal::tempomap.tick2time(playTickPos); - samplePosStart = samplePos - lrint(cpos * MusEGlobal::sampleRate); - rtcTickStart = rtcTick - lrint(cpos * realRtcTicks); - - endSlice = playTickPos; - recTick = playTickPos; - lastTickPos = playTickPos; - - tempoSN = MusEGlobal::tempomap.tempoSN(); - - startRecordPos.setPosTick(playTickPos); - } -*/ -// midiClock += MusEGlobal::config.division/24; - } //--------------------------------------------------------- // midiTick @@ -698,126 +505,18 @@ void MidiSeq::processTimerTick() mp->sendClock(); } - // DELETETHIS 35 ?? - /* - for(iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd) - { - MidiDevice* dev = *imd; - - if(!dev->syncInfo().MCOut()) - continue; - - // Shall we check open flags? - //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1)) - //if(!(dev->openFlags() & 1)) - // continue; - - int port = dev->midiPort(); - // Without this -1 check, interesting sync things can be done by the user without ever - // assigning any devices to ports ! - //if(port < 0 || port > MIDI_PORTS) - if(port < -1 || port > MIDI_PORTS) - continue; - - if(port == -1) - // Send straight to the device... Copied from MidiPort. - { - MidiPlayEvent event(0, 0, 0, ME_CLOCK, 0, 0); - dev->putEvent(event); - } - else - // Go through the port... - MusEGlobal::midiPorts[port].sendClock(); - } - */ - if(MusEGlobal::debugMsg && used && perr > 1) printf("Dropped %d midi out clock(s). curTick:%d midiClock:%d div:%d\n", perr, curTick, midiClock, div); - //} DELETETHIS and maybe the below ??? - - // Increment as if we had caught the timer exactly on the mark, even if the timer - // has passed beyond the mark, or even beyond 2 * div. - // If we missed some chances to send clock, resume the count where it would have been, - // had we not missed chances. - // We can't do anything about missed chances except send right away, and make up - // for gained time by losing time in the next count... - // In other words, use equalization periods to counter gained/lost time, so that - // ultimately, over time, the receiver remains in phase, despite any short dropouts / phase glitches. - // (midiClock only increments by div units). - // - // Tested: With midi thread set to high priority, very few clock dropouts ocurred (P4 1.6Ghz). - // But target device tick drifts out of phase with muse tick slowly over time, say 20 bars or so. - // May need more tweaking, possibly use round with/instead of lrint (above), and/or - // do not use equalization periods - set midiClock to fractions of div. - // Tested: With RTC resolution at 1024, stability was actually better than with 8192! - // It stayed in sync more than 64 bars... - // - // + // Using equalization periods... midiClock += (perr * div); - //midiClock += perr; DELETETHIS - // - // No equalization periods... TODO: or DELETETHIS? - //midiClock += (perr * div); } } // play all events upto curFrame - for (iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) { - //MidiDevice* md = *id; DELETETHIS 10 - // Is it a Jack midi device? They are iterated in Audio::processMidi. p3.3.36 - //MidiJackDevice* mjd = dynamic_cast<MidiJackDevice*>(md); - //if(mjd) - //if(md->deviceType() == MidiDevice::JACK_MIDI) - // continue; - //if(md->isSynti()) // syntis are handled by audio thread - // continue; - // Only ALSA midi devices are handled by this thread. + for (iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) if((*id)->deviceType() == MidiDevice::ALSA_MIDI) (*id)->processMidi(); - - // Moved into MidiAlsaDevice. p4.0.34 DELETETHIS 40 - /* - int port = md->midiPort(); - MidiPort* mp = port != -1 ? &MusEGlobal::midiPorts[port] : 0; - MPEventList* el = md->playEvents(); - if (el->empty()) - continue; - - ///iMPEvent i = md->nextPlayEvent(); - iMPEvent i = el->begin(); // p4.0.15 Tim. - - for (; i != el->end(); ++i) { - // p3.3.25 - // If syncing to external midi sync, we cannot use the tempo map. - // Therefore we cannot get sub-tick resolution. Just use ticks instead of frames. - //if (i->time() > curFrame) { - if (i->time() > (extsync ? tickpos : curFrame)) { - //printf(" curT %d frame %d\n", i->time(), curFrame); - break; // skip this event - } - - if (mp) { - if (mp->sendEvent(*i)) - break; - } - else { - if (md->putEvent(*i)) - break; - } - } - ///md->setNextPlayEvent(i); - // p4.0.15 We are done with these events. Let us erase them here instead of Audio::processMidi. - // That way we can simply set the next play event to the beginning. - // This also allows other events to be inserted without the problems caused by the next play event - // being at the 'end' iterator and not being *easily* set to some new place beginning of the newer insertions. - // The way that MPEventList sorts made it difficult to predict where the iterator of the first newly inserted items was. - // The erasure in Audio::processMidi was missing some events because of that. - el->erase(el->begin(), i); - //md->setNextPlayEvent(el->begin()); // Removed p4.0.15 - */ - - } } //--------------------------------------------------------- |