MuseScore/mscore/mediadialog.cpp

251 lines
7.8 KiB
C++

//=============================================================================
// MuseScore
// Linux Music Score Editor
// $Id:$
//
// Copyright (C) 20011 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#include "mediadialog.h"
#include "icons.h"
#include "musescore.h"
#include "libmscore/score.h"
#include "libmscore/audio.h"
#include "scoreview.h"
#include "omr/omr.h"
#include "libmscore/tempo.h"
namespace Ms {
//---------------------------------------------------------
// MediaDialog
//---------------------------------------------------------
MediaDialog::MediaDialog(QWidget* /*parent*/)
: QDialog()
{
setObjectName("MediaDialog");
setupUi(this);
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
setWindowTitle(tr("Additional Media"));
connect(addScan, SIGNAL(clicked()), SLOT(addScanPressed()));
connect(removeScan, SIGNAL(clicked()), SLOT(removeScanPressed()));
connect(addAudio, SIGNAL(clicked()), SLOT(addAudioPressed()));
connect(removeAudio, SIGNAL(clicked()), SLOT(removeAudioPressed()));
connect(scanFileButton, SIGNAL(clicked()), SLOT(scanFileButtonPressed()));
connect(audioFileButton, SIGNAL(clicked()), SLOT(audioFileButtonPressed()));
MuseScore::restoreGeometry(this);
}
//---------------------------------------------------------
// setScore
//---------------------------------------------------------
void MediaDialog::setScore(Score* s)
{
score = s->masterScore();
Omr* omr = score->masterScore()->omr();
if (omr) {
scanFile->setText(omr->path());
addScan->setEnabled(false);
removeScan->setEnabled(true);
scanFileButton->setEnabled(false);
}
else {
scanFile->setText(QString());
addScan->setEnabled(true);
removeScan->setEnabled(false);
scanFileButton->setEnabled(true);
}
Audio* audio = score->audio();
if (audio) {
audioFile->setText(audio->path());
addAudio->setEnabled(false);
removeAudio->setEnabled(true);
audioFileButton->setEnabled(false);
}
else {
audioFile->setText(QString());
addAudio->setEnabled(true);
removeAudio->setEnabled(false);
audioFileButton->setEnabled(true);
}
}
//---------------------------------------------------------
// addScanPressed
//---------------------------------------------------------
void MediaDialog::addScanPressed()
{
QString path = scanFile->text();
if (score->masterScore()->omr() || path.isEmpty())
return;
Omr* omr = new Omr(path, score);
if (!omr->readPdf()) {
qDebug("read omr failed");
delete omr;
return;
}
score->masterScore()->setOmr(omr);
mscore->currentScoreView()->showOmr(true);
}
//---------------------------------------------------------
// removeScanPressed
//---------------------------------------------------------
void MediaDialog::removeScanPressed()
{
mscore->currentScoreView()->showOmr(false);
score->removeOmr();
scanFile->setText(QString());
addScan->setEnabled(true);
removeScan->setEnabled(false);
scanFileButton->setEnabled(true);
}
//---------------------------------------------------------
// addAudioPressed
//---------------------------------------------------------
void MediaDialog::addAudioPressed()
{
QString path = audioFile->text();
if (score->audio() || path.isEmpty())
return;
QFile f(path);
if (!f.open(QIODevice::ReadOnly))
return;
QByteArray ba = f.readAll();
f.close();
Audio* audio = new Audio;
audio->setPath(path);
audio->setData(ba);
score->setAudio(audio);
mscore->updatePlayMode();
#if 0
QString wavPath = QDir::tempPath() + "/score.wav";
mscore->saveAs(score, true, wavPath, "wav");
QString program = "D:/HACK/sonic-annotator/bologna.bat";
QStringList arguments;
arguments << QDir::toNativeSeparators(path)<< QDir::toNativeSeparators(wavPath);
QProcess myProcess(this);
myProcess.start(program, arguments);
myProcess.waitForFinished();
qDebug() << myProcess.readAll();
#endif
QFileInfo fi(path);
QFile syncFile(fi.absolutePath() + "/" + fi.completeBaseName() + ".txt");
TempoMap* tmo = score->tempomap();
if (!syncFile.open(QIODevice::ReadOnly))
return;
qreal t = 0;
int tick = 0;
qreal lastTempo = tmo->tempo(0);
TempoMap* tmn = new TempoMap();
tmn->setTempo(0, lastTempo);
int resolution = 25;
while (!syncFile.atEnd()) {
for (int i = 0; !syncFile.atEnd() && i < resolution-1; i++)
syncFile.readLine();
if (syncFile.atEnd())
break;
QByteArray line = syncFile.readLine();
QString s(line);
QStringList sl = s.split(":");
qreal tScore = sl[0].trimmed().toDouble();
qreal tPerformance = sl[1].trimmed().toDouble();
// timestamp of last
int scoreTick = tmo->time2tick(tScore);
qreal deltaError = tmo->tick2time(scoreTick) - tScore;
int dt = scoreTick - tick;
qreal deltaTime = tPerformance - t;
if (deltaTime > 0) {
qreal tempo = dt / (480 * deltaTime);
if(tempo != lastTempo) {
qDebug() << tempo;
tmn->setTempo(tick, tempo);
lastTempo = tempo;
}
}
t = tPerformance - deltaError;
tick = scoreTick;
}
score->setTempomap(tmn);
syncFile.close();
QMessageBox::information(0, tr("Done"), tr("Done"));
}
//---------------------------------------------------------
// removeAudioPressed
//---------------------------------------------------------
void MediaDialog::removeAudioPressed()
{
score->removeAudio();
audioFile->setText(QString());
addAudio->setEnabled(true);
removeAudio->setEnabled(false);
audioFileButton->setEnabled(true);
}
//---------------------------------------------------------
// scanFileButtonPressed
//---------------------------------------------------------
void MediaDialog::scanFileButtonPressed()
{
QString s = mscore->getScanFile(QString());
if (!s.isNull())
scanFile->setText(s);
}
//---------------------------------------------------------
// audioFileButtonPressed
//---------------------------------------------------------
void MediaDialog::audioFileButtonPressed()
{
QString s = mscore->getAudioFile(QString());
if (!s.isNull())
audioFile->setText(s);
}
//---------------------------------------------------------
// hideEvent
//---------------------------------------------------------
void MediaDialog::hideEvent(QHideEvent* event)
{
MuseScore::saveGeometry(this);
QWidget::hideEvent(event);
}
}