diff --git a/libmscore/album.cpp b/libmscore/album.cpp index d5abd493aa585..49cce29306e72 100644 --- a/libmscore/album.cpp +++ b/libmscore/album.cpp @@ -84,15 +84,9 @@ void AlbumItem::readAlbumItem(XmlReader &reader) _fileInfo.setFile(reader.readElementText()); } else if (tag == "relativePath") { if (!_fileInfo.exists()) { - auto itemPathList = reader.readElementText().split("/"); - auto albumPathList = album->_fileInfo.absolutePath().split("/"); - int j = itemPathList.removeAll(".."); - for (int i = 0; i < j; i++) { - albumPathList.removeLast(); - } - QString relativePath(albumPathList.join("/") + "/" + itemPathList.join("/")); - std::cout << "relative path: " << relativePath.toStdString() << std::endl; - _fileInfo.setFile(relativePath); + QDir dir(album->_fileInfo.dir()); + QString relativePath = reader.readElementText(); + _fileInfo.setFile(dir, relativePath); } else { reader.readElementText(); } @@ -114,22 +108,8 @@ void AlbumItem::writeAlbumItem(XmlWriter &writer) writer.stag("Score"); writer.tag("alias", ""); writer.tag("path", _fileInfo.absoluteFilePath()); - auto itemPathList = _fileInfo.absoluteFilePath().split("/"); - auto albumPathList = album->_fileInfo.absoluteFilePath().split("/"); - QString relativePath; - for (int i = 0; i < albumPathList.size(); i++) { - if (itemPathList.at(i) != albumPathList.at(i)) { - for (int j = 0; j < i; j++) { - itemPathList.removeFirst(); - } - relativePath = itemPathList.join("/"); // TODO: \ for windows - for (int j = 1; j < albumPathList.size() - i; j++) { - relativePath.prepend("../"); - } - relativePath.prepend("./"); - break; - } - } + QDir dir(album->_fileInfo.dir()); + QString relativePath = dir.relativeFilePath(_fileInfo.absoluteFilePath()); writer.tag("relativePath", relativePath); writer.tag("enabled", enabled); writer.etag(); diff --git a/mscore/albummanager.cpp b/mscore/albummanager.cpp index 7903f0c060c0d..6f94fdde8b79f 100644 --- a/mscore/albummanager.cpp +++ b/mscore/albummanager.cpp @@ -138,10 +138,12 @@ void AlbumManager::changeMode(bool throwaway) { if (scoreModeButton->isChecked()) { albumModeButton->setChecked(false); + mscore->closeScore(tempScore); // also frees + tempScore = nullptr; } else if (albumModeButton->isChecked()) { scoreModeButton->setChecked(false); if (!tempScore) { - tempScore = _items.at(0)->albumItem->score->clone(); + tempScore = _items.at(0)->albumItem->score->clone(); // TODO: clone breaks editing sync for the 1st movement mscore->setCurrentScoreView(mscore->appendScore(tempScore)); mscore->getTab1()->setTabText(mscore->getTab1()->count() - 1, "Temporary Album Score"); for (auto item : _items) { @@ -154,7 +156,8 @@ void AlbumManager::changeMode(bool throwaway) tempScore->setLayoutAll(); tempScore->update(); -// addScore(tempScore); +// _album->addScore(tempScore); +// addAlbumItem(_album->_albumItems.back()); } } else { Q_ASSERT(false); @@ -172,12 +175,15 @@ void AlbumManager::playAlbum() if (i < _items.size()) { if (_items.at(i)->albumItem->enabled) { - if (_items.at(i)->albumItem->score) { - mscore->openScore(_items.at(i)->albumItem->_fileInfo.absoluteFilePath()); // what if the files have not been saved? - } else { - _items.at(i)->albumItem->score = mscore->openScore(_items.at(i)->albumItem->_fileInfo.absoluteFilePath()); + if (scoreModeButton->isChecked()) { + if (_items.at(i)->albumItem->score) { + mscore->openScore(_items.at(i)->albumItem->_fileInfo.absoluteFilePath()); // what if the files have not been saved? + } else { + _items.at(i)->albumItem->score = mscore->openScore(_items.at(i)->albumItem->_fileInfo.absoluteFilePath()); + } + mscore->currentScoreView()->gotoMeasure(_items.at(i)->albumItem->score->firstMeasure()); // rewind before playing } - mscore->currentScoreView()->gotoMeasure(_items.at(i)->albumItem->score->firstMeasure()); // rewind before playing + if (i == 0) { seq->start(); } else { @@ -187,6 +193,9 @@ void AlbumManager::playAlbum() connect(seq, &Seq::stopped, this, static_cast(&AlbumManager::playAlbum)); } } else { + if (albumModeButton->isChecked()) { + seq->setNextScore(); + } playAlbum(); } } else { diff --git a/mscore/albummanagerdialog.cpp b/mscore/albummanagerdialog.cpp index 6ed118cf3eb4b..a420aa2f288cc 100644 --- a/mscore/albummanagerdialog.cpp +++ b/mscore/albummanagerdialog.cpp @@ -23,6 +23,11 @@ #include "ui_albummanagerdialog.h" namespace Ms { + +//--------------------------------------------------------- +// AlbumManagerDialog +//--------------------------------------------------------- + AlbumManagerDialog::AlbumManagerDialog(QWidget* parent) : QDialog(parent) { @@ -36,24 +41,40 @@ AlbumManagerDialog::~AlbumManagerDialog() delete ui; } +//--------------------------------------------------------- +// start +//--------------------------------------------------------- + void AlbumManagerDialog::start() { update(); show(); } +//--------------------------------------------------------- +// apply +//--------------------------------------------------------- + void AlbumManagerDialog::apply() { AlbumManager* albumManager = static_cast(parent()); albumManager->album()->playbackDelay = playbackDelayBox->value(); } +//--------------------------------------------------------- +// update +//--------------------------------------------------------- + void AlbumManagerDialog::update() { AlbumManager* albumManager = static_cast(parent()); playbackDelayBox->setValue(albumManager->album()->playbackDelay); } +//--------------------------------------------------------- +// buttonBoxClicked +//--------------------------------------------------------- + void AlbumManagerDialog::buttonBoxClicked(QAbstractButton* button) { switch (buttonBox->standardButton(button)) { diff --git a/mscore/events.cpp b/mscore/events.cpp index 626e17b690039..82b660d56263f 100644 --- a/mscore/events.cpp +++ b/mscore/events.cpp @@ -1130,6 +1130,7 @@ static const char* stateName(ViewState s) void ScoreView::seqStopped() { + std::cout << "seqStopped" << std::endl; changeState(ViewState::NORMAL); } @@ -1187,6 +1188,7 @@ void ScoreView::changeState(ViewState s) endFotoDrag(); break; case ViewState::PLAY: + std::cout << "stop play" << std::endl; seq->stop(); break; case ViewState::EDIT: diff --git a/mscore/seq.cpp b/mscore/seq.cpp index fb1b9b3d5d800..f505b0706305e 100644 --- a/mscore/seq.cpp +++ b/mscore/seq.cpp @@ -150,6 +150,8 @@ Seq::Seq() running = false; playlistChanged = false; cs = 0; + dominantScore = nullptr; + nextMovementIndex = -1; cv = 0; tackRemain = 0; tickRemain = 0; @@ -208,6 +210,7 @@ Seq::~Seq() void Seq::setScoreView(ScoreView* v) { + std::cout << "setScoreView" << std::endl; if (oggInit) { ov_clear(&vf); oggInit = false; @@ -221,6 +224,39 @@ void Seq::setScoreView(ScoreView* v) disconnect(cs, SIGNAL(playlistChanged()), this, SLOT(setPlaylistChanged())); } cs = cv ? cv->score()->masterScore() : 0; + dominantScore = cs; + nextMovementIndex = dominantScore ? 1 : 0; + midi = MidiRenderer(cs); + midi.setMinChunkSize(10); + + if (!heartBeatTimer->isActive()) { + heartBeatTimer->start(20); // msec + } + playlistChanged = true; + _synti->reset(); + if (cs) { + initInstruments(); + connect(cs, SIGNAL(playlistChanged()), this, SLOT(setPlaylistChanged())); + } +} + +//--------------------------------------------------------- +// setNextScore +/// used to setup next movement for playback +/// FIXME: probably crahses if the score is closed +//--------------------------------------------------------- + +void Seq::setNextScore() +{ + std::cout << "next score" << std::endl; + if (nextMovementIndex < dominantScore->movements()->size()) { + cs = dominantScore->movements()->at(nextMovementIndex); + nextMovementIndex++; + } else { + cs = dominantScore; + nextMovementIndex = 1; + } + midi = MidiRenderer(cs); midi.setMinChunkSize(10); @@ -383,6 +419,7 @@ void Seq::start() void Seq::stop() { + std::cout << "stop" << std::endl; const bool seqStopped = (state == Transport::STOP); const bool driverStopped = !_driver || _driver->getState() == Transport::STOP; if (seqStopped && driverStopped) { @@ -419,6 +456,7 @@ void Seq::stop() void Seq::stopWait() { + std::cout << "stop wait" << std::endl; stop(); QWaitCondition sleep; int idx = 0; @@ -783,6 +821,8 @@ void Seq::process(unsigned framesPerPeriod, float* buffer) } // Got a message from JACK Transport panel: Stop else if (state == Transport::PLAY && driverState == Transport::STOP) { + std::cout << "HERE IT IS" << std::endl; + setNextScore(); state = Transport::STOP; // Muting all notes stopNotes(-1, true); diff --git a/mscore/seq.h b/mscore/seq.h index 43cfebce9abd8..2b8115cfae173 100644 --- a/mscore/seq.h +++ b/mscore/seq.h @@ -112,6 +112,8 @@ class Seq : public QObject, public Sequencer mutable QMutex mutex; + MasterScore* dominantScore; + int nextMovementIndex; MasterScore* cs; ScoreView* cv; bool running; // true if sequencer is available @@ -269,6 +271,7 @@ public slots: void setController(int, int, int); virtual void sendEvent(const NPlayEvent&); void setScoreView(ScoreView*); + void setNextScore(); MasterScore* score() const { return cs; } ScoreView* viewer() const { return cv; } void initInstruments(bool realTime = false);