📄 sequencemanager.cpp
字号:
(MidiInstrumentBase, MappedEvent::SystemAudioPorts, ports); StudioControl::sendMappedEvent(mEports); MappedEvent mEff (MidiInstrumentBase, MappedEvent::SystemAudioFileFormat, audioFileFormat); StudioControl::sendMappedEvent(mEff); // Set the studio from the current document // m_doc->initialiseStudio();}voidSequenceManager::panic(){ SEQMAN_DEBUG << "panic button\n"; stopping(); MappedEvent mE(MidiInstrumentBase, MappedEvent::Panic, 0, 0); emit setProgress(40); StudioControl::sendMappedEvent(mE); emit setProgress(100); // Studio &studio = m_doc->getStudio(); // // InstrumentList list = studio.getPresentationInstruments(); // InstrumentList::iterator it; // // int maxDevices = 0, device = 0; // for (it = list.begin(); it != list.end(); it++) // if ((*it)->getType() == Instrument::Midi) // maxDevices++; // // emit setProgress(40); // // for (it = list.begin(); it != list.end(); it++) // { // if ((*it)->getType() == Instrument::Midi) // { // for (unsigned int i = 0; i < 128; i++) // { // MappedEvent // mE((*it)->getId(), // MappedEvent::MidiNote, // i, // 0); // // StudioControl::sendMappedEvent(mE); // } // // device++; // } // // emit setProgress(int(90.0 * (double(device) / double(maxDevices)))); // } // // resetControllers();}voidSequenceManager::showVisuals(const MappedComposition &mC){ MappedComposition::const_iterator it = mC.begin(); if (it != mC.end()) m_transport->setMidiOutLabel(*it);}MappedCompositionSequenceManager::applyFiltering(const MappedComposition &mC, MappedEvent::MappedEventType filter){ MappedComposition retMc; MappedComposition::const_iterator it = mC.begin(); for (; it != mC.end(); it++) { if (!((*it)->getType() & filter)) retMc.insert(new MappedEvent(*it)); } return retMc;}void SequenceManager::resetCompositionMmapper(){ SEQMAN_DEBUG << "SequenceManager::resetCompositionMmapper()\n"; delete m_compositionMmapper; m_compositionMmapper = new CompositionMmapper(m_doc); resetMetronomeMmapper(); resetTempoSegmentMmapper(); resetTimeSigSegmentMmapper(); resetControlBlockMmapper();}void SequenceManager::resetMetronomeMmapper(){ SEQMAN_DEBUG << "SequenceManager::resetMetronomeMmapper()\n"; delete m_metronomeMmapper; m_metronomeMmapper = SegmentMmapperFactory::makeMetronome(m_doc);}void SequenceManager::resetTempoSegmentMmapper(){ SEQMAN_DEBUG << "SequenceManager::resetTempoSegmentMmapper()\n"; delete m_tempoSegmentMmapper; m_tempoSegmentMmapper = SegmentMmapperFactory::makeTempo(m_doc);}void SequenceManager::resetTimeSigSegmentMmapper(){ SEQMAN_DEBUG << "SequenceManager::resetTimeSigSegmentMmapper()\n"; delete m_timeSigSegmentMmapper; m_timeSigSegmentMmapper = SegmentMmapperFactory::makeTimeSig(m_doc);}void SequenceManager::resetControlBlockMmapper(){ SEQMAN_DEBUG << "SequenceManager::resetControlBlockMmapper()\n"; m_controlBlockMmapper->setDocument(m_doc);}bool SequenceManager::event(QEvent *e){ if (e->type() == QEvent::User) { SEQMAN_DEBUG << "SequenceManager::event() with user event\n"; if (m_updateRequested) { SEQMAN_DEBUG << "SequenceManager::event(): update requested\n"; checkRefreshStatus(); m_updateRequested = false; } return true; } else { return QObject::event(e); }}void SequenceManager::update(){ SEQMAN_DEBUG << "SequenceManager::update()\n"; // schedule a refresh-status check for the next event loop QEvent *e = new QEvent(QEvent::User); m_updateRequested = true; QApplication::postEvent(this, e);}void SequenceManager::checkRefreshStatus(){ SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus()\n"; // Look at trigger segments first: if one of those has changed, we'll // need to be aware of it when scanning segments subsequently TriggerSegmentRec::SegmentRuntimeIdSet ridset; Composition &comp = m_doc->getComposition(); SegmentRefreshMap newTriggerMap; for (Composition::triggersegmentcontaineriterator i = comp.getTriggerSegments().begin(); i != comp.getTriggerSegments().end(); ++i) { Segment *s = (*i)->getSegment(); if (m_triggerSegments.find(s) == m_triggerSegments.end()) { newTriggerMap[s] = s->getNewRefreshStatusId(); } else { newTriggerMap[s] = m_triggerSegments[s]; } if (s->getRefreshStatus(newTriggerMap[s]).needsRefresh()) { TriggerSegmentRec::SegmentRuntimeIdSet &thisSet = (*i)->getReferences(); ridset.insert(thisSet.begin(), thisSet.end()); s->getRefreshStatus(newTriggerMap[s]).setNeedsRefresh(false); } } m_triggerSegments = newTriggerMap; SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus: segments modified by changes to trigger segments are:" << endl; int x = 0; for (TriggerSegmentRec::SegmentRuntimeIdSet::iterator i = ridset.begin(); i != ridset.end(); ++i) { SEQMAN_DEBUG << x << ": " << *i << endl; ++x; } std::vector<Segment*>::iterator i; // Check removed segments first for (i = m_removedSegments.begin(); i != m_removedSegments.end(); ++i) { processRemovedSegment(*i); } m_removedSegments.clear(); SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus: we have " << m_segments.size() << " segments" << endl; // then the ones which are still there for (SegmentRefreshMap::iterator i = m_segments.begin(); i != m_segments.end(); ++i) { if (i->first->getRefreshStatus(i->second).needsRefresh() || ridset.find(i->first->getRuntimeId()) != ridset.end()) { segmentModified(i->first); i->first->getRefreshStatus(i->second).setNeedsRefresh(false); } } // then added ones for (i = m_addedSegments.begin(); i != m_addedSegments.end(); ++i) { processAddedSegment(*i); } m_addedSegments.clear();}void SequenceManager::segmentModified(Segment* s){ SEQMAN_DEBUG << "SequenceManager::segmentModified(" << s << ")\n"; bool sizeChanged = m_compositionMmapper->segmentModified(s); SEQMAN_DEBUG << "SequenceManager::segmentModified() : size changed = " << sizeChanged << endl; if ((m_transportStatus == PLAYING) && sizeChanged) { QByteArray data; QDataStream streamOut(data, IO_WriteOnly); streamOut << (QString)m_compositionMmapper->getSegmentFileName(s); streamOut << (size_t)m_compositionMmapper->getSegmentFileSize(s); SEQMAN_DEBUG << "SequenceManager::segmentModified() : DCOP-call sequencer remapSegment" << m_compositionMmapper->getSegmentFileName(s) << endl; rgapp->sequencerSend("remapSegment(QString, size_t)", data); }}void SequenceManager::segmentAdded(const Composition*, Segment* s){ SEQMAN_DEBUG << "SequenceManager::segmentAdded(" << s << ")\n"; m_addedSegments.push_back(s);}void SequenceManager::segmentRemoved(const Composition*, Segment* s){ SEQMAN_DEBUG << "SequenceManager::segmentRemoved(" << s << ")\n"; m_removedSegments.push_back(s); std::vector<Segment*>::iterator i = find(m_addedSegments.begin(), m_addedSegments.end(), s); if (i != m_addedSegments.end()) m_addedSegments.erase(i);}void SequenceManager::segmentRepeatChanged(const Composition*, Segment* s, bool repeat){ SEQMAN_DEBUG << "SequenceManager::segmentRepeatChanged(" << s << ", " << repeat << ")\n"; segmentModified(s);}void SequenceManager::segmentRepeatEndChanged(const Composition*, Segment* s, timeT newEndTime){ SEQMAN_DEBUG << "SequenceManager::segmentRepeatEndChanged(" << s << ", " << newEndTime << ")\n"; segmentModified(s);}void SequenceManager::segmentEventsTimingChanged(const Composition*, Segment * s, timeT t, RealTime){ SEQMAN_DEBUG << "SequenceManager::segmentEventsTimingChanged(" << s << ", " << t << ")\n"; segmentModified(s); if (s && s->getType() == Segment::Audio && m_transportStatus == PLAYING) { QByteArray data; rgapp->sequencerSend("remapTracks()", data); }}void SequenceManager::segmentTransposeChanged(const Composition*, Segment *s, int transpose){ SEQMAN_DEBUG << "SequenceManager::segmentTransposeChanged(" << s << ", " << transpose << ")\n"; segmentModified(s);}void SequenceManager::segmentTrackChanged(const Composition*, Segment *s, TrackId id){ SEQMAN_DEBUG << "SequenceManager::segmentTrackChanged(" << s << ", " << id << ")\n"; segmentModified(s); if (s && s->getType() == Segment::Audio && m_transportStatus == PLAYING) { QByteArray data; rgapp->sequencerSend("remapTracks()", data); }}void SequenceManager::segmentEndMarkerChanged(const Composition*, Segment *s, bool){ SEQMAN_DEBUG << "SequenceManager::segmentEndMarkerChanged(" << s << ")\n"; segmentModified(s);}void SequenceManager::processAddedSegment(Segment* s){ SEQMAN_DEBUG << "SequenceManager::processAddedSegment(" << s << ")\n"; m_compositionMmapper->segmentAdded(s); if (m_transportStatus == PLAYING) { QByteArray data; QDataStream streamOut(data, IO_WriteOnly); streamOut << m_compositionMmapper->getSegmentFileName(s); if (!rgapp->sequencerSend("addSegment(QString)", data)) { m_transportStatus = STOPPED; } } // Add to segments map int id = s->getNewRefreshStatusId(); m_segments.insert(SegmentRefreshMap::value_type(s, id));}void SequenceManager::processRemovedSegment(Segment* s){ SEQMAN_DEBUG << "SequenceManager::processRemovedSegment(" << s << ")\n"; QString filename = m_compositionMmapper->getSegmentFileName(s); m_compositionMmapper->segmentDeleted(s); if (m_transportStatus == PLAYING) { QByteArray data; QDataStream streamOut(data, IO_WriteOnly); streamOut << filename; if (!rgapp->sequencerSend("deleteSegment(QString)", data)) { // failed m_transportStatus = STOPPED; } } // Remove from segments map m_segments.erase(s);}void SequenceManager::endMarkerTimeChanged(const Composition *, bool /*shorten*/){ SEQMAN_DEBUG << "SequenceManager::endMarkerTimeChanged()\n"; m_compositionMmapperResetTimer->start(500, true); // schedule a composition mmapper reset in 0.5s}void SequenceManager::timeSignatureChanged(const Composition *){ resetMetronomeMmapper();}void SequenceManager::trackChanged(const Composition *, Track* t){ SEQMAN_DEBUG << "SequenceManager::trackChanged(" << t << ", " << (t ? t->getPosition() : -1) << ")\n"; m_controlBlockMmapper->updateTrackData(t); if (m_transportStatus == PLAYING) { QByteArray data; rgapp->sequencerSend("remapTracks()", data); }}void SequenceManager::trackDeleted(const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -