1 //=============================================================================
2 //  MuseScore
3 //  Linux Music Score Editor
4 //
5 //  Copyright (C) 20011 Werner Schweer and others
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License version 2.
9 //
10 //  This program is distributed in the hope that it will be useful,
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //  GNU General Public License for more details.
14 //
15 //  You should have received a copy of the GNU General Public License
16 //  along with this program; if not, write to the Free Software
17 //  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //=============================================================================
19 
20 #include "mediadialog.h"
21 #include "icons.h"
22 #include "musescore.h"
23 #include "libmscore/score.h"
24 #include "libmscore/audio.h"
25 #include "scoreview.h"
26 #include "omr/omr.h"
27 #include "libmscore/tempo.h"
28 
29 namespace Ms {
30 
31 //---------------------------------------------------------
32 //   MediaDialog
33 //---------------------------------------------------------
34 
MediaDialog(QWidget *)35 MediaDialog::MediaDialog(QWidget* /*parent*/)
36    : QDialog()
37       {
38       setObjectName("MediaDialog");
39       setupUi(this);
40       setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
41       setWindowTitle(tr("Additional Media"));
42 
43       connect(addScan,         SIGNAL(clicked()), SLOT(addScanPressed()));
44       connect(removeScan,      SIGNAL(clicked()), SLOT(removeScanPressed()));
45       connect(addAudio,        SIGNAL(clicked()), SLOT(addAudioPressed()));
46       connect(removeAudio,     SIGNAL(clicked()), SLOT(removeAudioPressed()));
47       connect(scanFileButton,  SIGNAL(clicked()), SLOT(scanFileButtonPressed()));
48       connect(audioFileButton, SIGNAL(clicked()), SLOT(audioFileButtonPressed()));
49 
50       scanFileButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
51       audioFileButton->setIcon(*icons[int(Icons::fileOpen_ICON)]);
52 
53       MuseScore::restoreGeometry(this);
54       }
55 
56 //---------------------------------------------------------
57 //   setScore
58 //---------------------------------------------------------
59 
setScore(Score * s)60 void MediaDialog::setScore(Score* s)
61       {
62       score = s->masterScore();
63       Omr* omr = score->masterScore()->omr();
64       if (omr) {
65             scanFile->setText(omr->path());
66             addScan->setEnabled(false);
67             removeScan->setEnabled(true);
68             scanFileButton->setEnabled(false);
69             }
70       else {
71             scanFile->setText(QString());
72             addScan->setEnabled(true);
73             removeScan->setEnabled(false);
74             scanFileButton->setEnabled(true);
75             }
76       Audio* audio = score->audio();
77       if (audio) {
78             audioFile->setText(audio->path());
79             addAudio->setEnabled(false);
80             removeAudio->setEnabled(true);
81             audioFileButton->setEnabled(false);
82             }
83       else {
84             audioFile->setText(QString());
85             addAudio->setEnabled(true);
86             removeAudio->setEnabled(false);
87             audioFileButton->setEnabled(true);
88             }
89       }
90 
91 //---------------------------------------------------------
92 //   addScanPressed
93 //---------------------------------------------------------
94 
addScanPressed()95 void MediaDialog::addScanPressed()
96       {
97       QString path = scanFile->text();
98       if (score->masterScore()->omr() || path.isEmpty())
99             return;
100       Omr* omr = new Omr(path, score);
101       if (!omr->readPdf()) {
102             qDebug("read omr failed");
103             delete omr;
104             return;
105             }
106       score->masterScore()->setOmr(omr);
107       mscore->currentScoreView()->showOmr(true);
108       }
109 
110 //---------------------------------------------------------
111 //   removeScanPressed
112 //---------------------------------------------------------
113 
removeScanPressed()114 void MediaDialog::removeScanPressed()
115       {
116       mscore->currentScoreView()->showOmr(false);
117       score->removeOmr();
118       scanFile->setText(QString());
119       addScan->setEnabled(true);
120       removeScan->setEnabled(false);
121       scanFileButton->setEnabled(true);
122       }
123 
124 //---------------------------------------------------------
125 //   addAudioPressed
126 //---------------------------------------------------------
127 
addAudioPressed()128 void MediaDialog::addAudioPressed()
129       {
130       QString path = audioFile->text();
131       if (score->audio() || path.isEmpty())
132             return;
133       QFile f(path);
134       if (!f.open(QIODevice::ReadOnly))
135             return;
136       QByteArray ba = f.readAll();
137       f.close();
138       Audio* audio = new Audio;
139       audio->setPath(path);
140       audio->setData(ba);
141       score->setAudio(audio);
142       mscore->updatePlayMode();
143 
144 #if 0
145       QString wavPath = QDir::tempPath() + "/score.wav";
146       mscore->saveAs(score, true, wavPath, "wav");
147       QString program = "D:/HACK/sonic-annotator/bologna.bat";
148       QStringList arguments;
149       arguments << QDir::toNativeSeparators(path)<< QDir::toNativeSeparators(wavPath);
150       QProcess myProcess(this);
151       myProcess.start(program, arguments);
152       myProcess.waitForFinished();
153       qDebug() << myProcess.readAll();
154 #endif
155 
156       QFileInfo fi(path);
157       QFile syncFile(fi.absolutePath() + "/" + fi.completeBaseName() + ".txt");
158 
159       TempoMap* tmo = score->tempomap();
160 
161       if (!syncFile.open(QIODevice::ReadOnly))
162             return;
163 
164       qreal t = 0;
165       int tick = 0;
166       qreal lastTempo = tmo->tempo(0);
167       TempoMap* tmn = new TempoMap();
168       tmn->setTempo(0, lastTempo);
169       int resolution = 25;
170       while (!syncFile.atEnd()) {
171             for (int i = 0; !syncFile.atEnd() && i < resolution-1; i++)
172                   syncFile.readLine();
173 
174             if (syncFile.atEnd())
175                   break;
176 
177             QByteArray line = syncFile.readLine();
178             QString s(line);
179             QStringList sl = s.split(":");
180 
181             qreal tScore = sl[0].trimmed().toDouble();
182             qreal tPerformance = sl[1].trimmed().toDouble();
183 
184             // timestamp of last
185             int scoreTick = tmo->time2tick(tScore);
186             qreal deltaError = tmo->tick2time(scoreTick) - tScore;
187             int dt = scoreTick - tick;
188             qreal deltaTime = tPerformance - t;
189 
190             if (deltaTime > 0) {
191                   qreal tempo = dt / (480 * deltaTime);
192                   if(tempo != lastTempo) {
193                   qDebug() << tempo;
194                         tmn->setTempo(tick, tempo);
195                         lastTempo = tempo;
196                         }
197                   }
198 
199             t = tPerformance - deltaError;
200             tick = scoreTick;
201             }
202       score->setTempomap(tmn);
203       syncFile.close();
204       QMessageBox::information(0, tr("Done"), tr("Done"));
205       }
206 
207 //---------------------------------------------------------
208 //   removeAudioPressed
209 //---------------------------------------------------------
210 
removeAudioPressed()211 void MediaDialog::removeAudioPressed()
212       {
213       score->removeAudio();
214       audioFile->setText(QString());
215       addAudio->setEnabled(true);
216       removeAudio->setEnabled(false);
217       audioFileButton->setEnabled(true);
218       }
219 
220 //---------------------------------------------------------
221 //   scanFileButtonPressed
222 //---------------------------------------------------------
223 
scanFileButtonPressed()224 void MediaDialog::scanFileButtonPressed()
225       {
226       QString s = mscore->getScanFile(QString());
227       if (!s.isNull())
228             scanFile->setText(s);
229       }
230 
231 //---------------------------------------------------------
232 //   audioFileButtonPressed
233 //---------------------------------------------------------
234 
audioFileButtonPressed()235 void MediaDialog::audioFileButtonPressed()
236       {
237       QString s = mscore->getAudioFile(QString());
238       if (!s.isNull())
239             audioFile->setText(s);
240       }
241 
242 //---------------------------------------------------------
243 //   hideEvent
244 //---------------------------------------------------------
245 
hideEvent(QHideEvent * event)246 void MediaDialog::hideEvent(QHideEvent* event)
247       {
248       MuseScore::saveGeometry(this);
249       QWidget::hideEvent(event);
250       }
251 
252 }
253 
254