📄 rosegardenguiview.cpp
字号:
states[instrumentId] = (isNew ? newState : oldState); } if (recStates[instrumentId] == unknownState) { bool isNew = mapper->getInstrumentRecordLevel(instrumentId, recLevels[instrumentId]); recStates[instrumentId] = (isNew ? newState : oldState); } if (states[instrumentId] == oldState && recStates[instrumentId] == oldState) continue; Instrument *instrument = getDocument()->getStudio().getInstrumentById(instrumentId); if (!instrument) continue; // This records the level of this instrument, not neccessarily // caused by notes on this particular track. LevelInfo &info = levels[instrumentId]; LevelInfo &recInfo = recLevels[instrumentId]; if (instrument->getType() == Instrument::Audio || instrument->getType() == Instrument::SoftSynth) { float dBleft = AudioLevel::DB_FLOOR; float dBright = AudioLevel::DB_FLOOR; float recDBleft = AudioLevel::DB_FLOOR; float recDBright = AudioLevel::DB_FLOOR; bool toSet = false; if (states[instrumentId] == newState && (getDocument()->getSequenceManager()->getTransportStatus() != STOPPED)) { if (info.level != 0 || info.levelRight != 0) { dBleft = AudioLevel::fader_to_dB (info.level, 127, AudioLevel::LongFader); dBright = AudioLevel::fader_to_dB (info.levelRight, 127, AudioLevel::LongFader); } toSet = true; m_trackEditor->getTrackButtons()->slotSetTrackMeter ((info.level + info.levelRight) / 254.0, track->getPosition()); } if (recStates[instrumentId] == newState && instrument->getType() == Instrument::Audio && (getDocument()->getSequenceManager()->getTransportStatus() != PLAYING)) { if (recInfo.level != 0 || recInfo.levelRight != 0) { recDBleft = AudioLevel::fader_to_dB (recInfo.level, 127, AudioLevel::LongFader); recDBright = AudioLevel::fader_to_dB (recInfo.levelRight, 127, AudioLevel::LongFader); } toSet = true; } if (toSet && m_instrumentParameterBox->getSelectedInstrument() && instrument->getId() == m_instrumentParameterBox->getSelectedInstrument()->getId()) { m_instrumentParameterBox->setAudioMeter(dBleft, dBright, recDBleft, recDBright); } } else { // Not audio or softsynth if (info.level == 0) continue; if (getDocument()->getSequenceManager()->getTransportStatus() != STOPPED) { // The information in 'info' is specific for this instrument, not // for this track. //m_trackEditor->getTrackButtons()->slotSetTrackMeter // (info.level / 127.0, track->getPosition()); m_trackEditor->getTrackButtons()->slotSetMetersByInstrument (info.level / 127.0, instrumentId); } } } for (StateMap::iterator i = states.begin(); i != states.end(); ++i) { if (i->second == newState) { emit instrumentLevelsChanged(i->first, levels[i->first]); } }}voidRosegardenGUIView::updateMonitorMeters(SequencerMapper *mapper){ Instrument *instrument = m_instrumentParameterBox->getSelectedInstrument(); if (!instrument || (instrument->getType() != Instrument::Audio)) return ; LevelInfo level; if (!mapper->getInstrumentRecordLevel(instrument->getId(), level)) return ; float dBleft = AudioLevel::fader_to_dB (level.level, 127, AudioLevel::LongFader); float dBright = AudioLevel::fader_to_dB (level.levelRight, 127, AudioLevel::LongFader); m_instrumentParameterBox->setAudioMeter (AudioLevel::DB_FLOOR, AudioLevel::DB_FLOOR, dBleft, dBright);}voidRosegardenGUIView::slotSelectedSegments(const SegmentSelection &segments){ // update the segment parameter box m_segmentParameterBox->useSegments(segments); if (!segments.empty()) { emit stateChange("have_selection", true); if (!segments.hasNonAudioSegment()) emit stateChange("audio_segment_selected", true); } else { emit stateChange("have_selection", false); } emit segmentsSelected(segments);}void RosegardenGUIView::slotShowRulers(bool v){ if (v) { m_trackEditor->getTopStandardRuler()->getLoopRuler()->show(); m_trackEditor->getBottomStandardRuler()->getLoopRuler()->show(); } else { m_trackEditor->getTopStandardRuler()->getLoopRuler()->hide(); m_trackEditor->getBottomStandardRuler()->getLoopRuler()->hide(); }}void RosegardenGUIView::slotShowTempoRuler(bool v){ if (v) { m_trackEditor->getTempoRuler()->show(); } else { m_trackEditor->getTempoRuler()->hide(); }}void RosegardenGUIView::slotShowChordNameRuler(bool v){ if (v) { m_trackEditor->getChordNameRuler()->setStudio(&getDocument()->getStudio()); m_trackEditor->getChordNameRuler()->show(); } else { m_trackEditor->getChordNameRuler()->hide(); }}void RosegardenGUIView::slotShowPreviews(bool v){ m_trackEditor->getSegmentCanvas()->setShowPreviews(v); m_trackEditor->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();}void RosegardenGUIView::slotShowSegmentLabels(bool v){ m_trackEditor->getSegmentCanvas()->setShowSegmentLabels(v); m_trackEditor->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();}void RosegardenGUIView::slotAddTracks(unsigned int nbTracks, InstrumentId id, int pos){ RG_DEBUG << "RosegardenGUIView::slotAddTracks(" << nbTracks << ", " << pos << ")" << endl; m_trackEditor->slotAddTracks(nbTracks, id, pos);}void RosegardenGUIView::slotDeleteTracks( std::vector<TrackId> tracks){ RG_DEBUG << "RosegardenGUIView::slotDeleteTracks - " << "deleting " << tracks.size() << " tracks" << endl; m_trackEditor->slotDeleteTracks(tracks);}MultiViewCommandHistory*RosegardenGUIView::getCommandHistory(){ return getDocument()->getCommandHistory();}voidRosegardenGUIView::slotAddCommandToHistory(KCommand *command){ getCommandHistory()->addCommand(command);}voidRosegardenGUIView::slotChangeInstrumentLabel(InstrumentId id, QString label){ m_trackEditor->getTrackButtons()->changeInstrumentLabel(id, label);}voidRosegardenGUIView::slotChangeTrackLabel(TrackId id, QString label){ m_trackEditor->getTrackButtons()->changeTrackLabel(id, label);}voidRosegardenGUIView::slotAddAudioSegment(AudioFileId audioId, TrackId trackId, timeT position, const RealTime &startTime, const RealTime &endTime){ AudioSegmentInsertCommand *command = new AudioSegmentInsertCommand(getDocument(), trackId, position, audioId, startTime, endTime); slotAddCommandToHistory(command); Segment *newSegment = command->getNewSegment(); if (newSegment) { SegmentSelection selection; selection.insert(newSegment); slotPropagateSegmentSelection(selection); emit segmentsSelected(selection); }}voidRosegardenGUIView::slotAddAudioSegmentCurrentPosition(AudioFileId audioFileId, const RealTime &startTime, const RealTime &endTime){ Composition &comp = getDocument()->getComposition(); AudioSegmentInsertCommand *command = new AudioSegmentInsertCommand(getDocument(), comp.getSelectedTrack(), comp.getPosition(), audioFileId, startTime, endTime); slotAddCommandToHistory(command); Segment *newSegment = command->getNewSegment(); if (newSegment) { SegmentSelection selection; selection.insert(newSegment); slotPropagateSegmentSelection(selection); emit segmentsSelected(selection); }}voidRosegardenGUIView::slotAddAudioSegmentDefaultPosition(AudioFileId audioFileId, const RealTime &startTime, const RealTime &endTime){ // Add at current track if it's an audio track, otherwise at first // empty audio track if there is one, otherwise at first audio track. // This behaviour should be of no interest to proficient users (who // should have selected the right track already, or be using drag- // and-drop) but it should save beginners from inserting an audio // segment and being quite unable to work out why it won't play Composition &comp = getDocument()->getComposition(); Studio &studio = getDocument()->getStudio(); TrackId currentTrackId = comp.getSelectedTrack(); Track *track = comp.getTrackById(currentTrackId); if (track) { InstrumentId ii = track->getInstrument(); Instrument *instrument = studio.getInstrumentById(ii); if (instrument && instrument->getType() == Instrument::Audio) { slotAddAudioSegment(audioFileId, currentTrackId, comp.getPosition(), startTime, endTime); return ; } } // current track is not an audio track, find a more suitable one TrackId bestSoFar = currentTrackId; for (Composition::trackcontainer::const_iterator ti = comp.getTracks().begin(); ti != comp.getTracks().end(); ++ti) { InstrumentId ii = ti->second->getInstrument(); Instrument *instrument = studio.getInstrumentById(ii); if (instrument && instrument->getType() == Instrument::Audio) { if (bestSoFar == currentTrackId) bestSoFar = ti->first; bool haveSegment = false; for (Composition::segmentcontainer::const_iterator si = comp.getSegments().begin(); si != comp.getSegments().end(); ++si) { if ((*si)->getTrack() == ti->first) { // there's a segment on this track haveSegment = true; break; } } if (!haveSegment) { // perfect slotAddAudioSegment(audioFileId, ti->first, comp.getPosition(), startTime, endTime); return ; } } } slotAddAudioSegment(audioFileId, bestSoFar, comp.getPosition(), startTime, endTime); return ;}voidRosegardenGUIView::slotDroppedNewAudio(QString audioDesc){ QTextIStream s(&audioDesc); QString url; int trackId; timeT time; url = s.readLine(); s >> trackId; s >> time; std::cerr << "RosegardenGUIView::slotDroppedNewAudio: url " << url << ", trackId " << trackId << ", time " << time << std::endl; RosegardenGUIApp *app = RosegardenGUIApp::self(); AudioFileManager &aFM = getDocument()->getAudioFileManager(); AudioFileId audioFileId = 0; int sampleRate = 0; if (getDocument()->getSequenceManager()) { sampleRate = getDocument()->getSequenceManager()->getSampleRate(); } KURL kurl(url); if (!kurl.isLocalFile()) { if (!RosegardenGUIApp::self()->testAudioPath("importing a remote audio file")) return; } else if (aFM.fileNeedsConversion(qstrtostr(kurl.path()), sampleRate)) { if (!RosegardenGUIApp::self()->testAudioPath("importing an audio file that needs to be converted or resampled")) return; } ProgressDialog progressDlg(i18n("Adding audio file..."), 100, this); CurrentProgressDialog::set(&progressDlg); progressDlg.progressBar()->hide(); progressDlg.show(); // Connect the progress dialog // connect(&aFM, SIGNAL(setProgress(int)), progressDlg.progressBar(), SLOT(setValue(int))); connect(&aFM, SIGNAL(setOperationName(QString)), &progressDlg, SLOT(slotSetOperationName(QString))); connect(&progressDlg, SIGNAL(cancelClicked()),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -