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