You can subscribe to this list here.
| 2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(25) |
Jul
(288) |
Aug
(119) |
Sep
(31) |
Oct
(59) |
Nov
(458) |
Dec
(359) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2010 |
Jan
(268) |
Feb
(26) |
Mar
(36) |
Apr
(48) |
May
(119) |
Jun
(37) |
Jul
(173) |
Aug
(429) |
Sep
(137) |
Oct
(156) |
Nov
(59) |
Dec
(45) |
| 2011 |
Jan
(398) |
Feb
(257) |
Mar
(49) |
Apr
(5) |
May
(34) |
Jun
(11) |
Jul
(38) |
Aug
(12) |
Sep
(1) |
Oct
(49) |
Nov
(5) |
Dec
(10) |
| 2012 |
Jan
(21) |
Feb
(32) |
Mar
(20) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(173) |
Aug
|
Sep
(25) |
Oct
(6) |
Nov
(44) |
Dec
|
|
From: Lasse Kärkkäi. <tr...@us...> - 2011-10-16 10:22:01
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Sun Oct 16 13:11:13 2011 +0300
Fix time offset bug with MIDI writer.
---
songwriter-ini.cc | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/songwriter-ini.cc b/songwriter-ini.cc
index 6ae8e69..31cced5 100644
--- a/songwriter-ini.cc
+++ b/songwriter-ini.cc
@@ -50,10 +50,12 @@ void FoFMIDIWriter::writeMIDI() const {
ev.channel = 0;
ev.arg1 = 105; // Special note value for starting a new sentence
// End the previous sentence (if not at the beginning)
- if (sentenceOn) { ev.arg2 = 0; writer.writeEvent(ev); } // Note OFF
+ if (sentenceOn) {
+ ev.arg2 = 0;
+ writer.writeEvent(ev);
+ ev.timecode = 0; // Reset time for the next event
+ } // Note OFF
sentenceOn = true;
- // The same timecode for the rest
- ev.timecode = 0;
// Begin a new one
ev.arg2 = 127; writer.writeEvent(ev); // Note ON
}
|
|
From: Tapio V. <aa...@us...> - 2011-10-11 20:02:15
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:12:34 2011 +0300 Added a paragraph of documentation about the additional music file feature. --- docs/helpindex.html | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/docs/helpindex.html b/docs/helpindex.html index fd67e6f..81f67bc 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -24,6 +24,7 @@ <h3><a name="initialimport">Importing song and lyrics</a></h3> <p>The first step is to import a music file for analyzation and lyrics text for generating notes. This can be done e.g. through the import menu. Supported song file formats vary depending on the platform, but at least mp3 and ogg should be ok. Lyrics assume that each phrase is on a line of its own - when the text is imported, a note is generated for each word and a sentence marker is placed at the beginning of each line.</p> +<p>You can also add an additional music file via the import menu. It will get analyzed and the results are displayed with different colors. The idea is that if you have a music file with both vocals and instruments, plus another karaoke version with just the instruments, you can use the analysis from the additional (karaoke) music to determine which tones belong to the background and are probably not singing.</p> <h3><a name="timing">Note timing</a></h3> <p>The easiest way to get the notes roughly timed is to switch to the <em>Tools</em> tab and start listening to the music. Each time you hear the phrase that is displayed in the tab, hit the <em>Time phrase</em> button (or its hotkey) and the start of the current phrase is placed to that position.</p> |
|
From: Tapio V. <aa...@us...> - 2011-10-11 20:02:07
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:06:50 2011 +0300 Fixed an errorenous line in help text. --- docs/helpindex.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/docs/helpindex.html b/docs/helpindex.html index 5bc700f..fd67e6f 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -22,7 +22,7 @@ <h2><a name="workflow">Basic Workflow</a></h2> <p>In addition to the sections here, the intended workflow is documented as a handy dialog with clickable items - follow it step-by-step and in the end you'll have finished notes for the song. Access it through the main menubar: Help --> Getting started.</p> -<h3><a name="initialimport">Importing song lyrics</h3> +<h3><a name="initialimport">Importing song and lyrics</a></h3> <p>The first step is to import a music file for analyzation and lyrics text for generating notes. This can be done e.g. through the import menu. Supported song file formats vary depending on the platform, but at least mp3 and ogg should be ok. Lyrics assume that each phrase is on a line of its own - when the text is imported, a note is generated for each word and a sentence marker is placed at the beginning of each line.</p> <h3><a name="timing">Note timing</a></h3> |
|
From: Tapio V. <aa...@us...> - 2011-10-11 20:01:57
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Oct 4 23:44:44 2011 +0300
Progressbar measures the least progressed PitchVis.
---
notegraphwidget.cc | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/notegraphwidget.cc b/notegraphwidget.cc
index db7f303..7ca533e 100644
--- a/notegraphwidget.cc
+++ b/notegraphwidget.cc
@@ -158,14 +158,14 @@ void NoteGraphWidget::timerEvent(QTimerEvent* event)
m_playbackPos += m_playbackInterval.restart();
updateMusicPos(m_playbackPos);
- // FIXME: Only considers first pitchvis
} else if (event->timerId() == m_analyzeTimer && m_pitch[0]) {
// PitchVis stuff
- double progress, duration;
- {
- QMutexLocker locker(&m_pitch[0]->mutex);
- progress = m_pitch[0]->getProgress();
- duration = m_pitch[0]->getDuration();
+ double progress = 1.0, duration;
+ for (int i = 0; i < MaxPitchVis; ++i) {
+ if (!m_pitch[i]) continue;
+ QMutexLocker locker(&m_pitch[i]->mutex);
+ progress = std::min(progress, m_pitch[i]->getProgress());
+ if (i == 0) duration = m_pitch[i]->getDuration();
}
emit analyzeProgress(1000 * progress, 1000); // Update progress bar
m_duration = std::max(m_duration, duration);
|
|
From: Tapio V. <aa...@us...> - 2011-10-11 20:01:41
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Oct 4 22:45:25 2011 +0300
A way to add additional music file for analyzing.
---
editor.ui | 6 ++++++
editorapp.cc | 30 +++++++++++++++++++++++-------
editorapp.hh | 3 ++-
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/editor.ui b/editor.ui
index 49333b6..cd41178 100644
--- a/editor.ui
+++ b/editor.ui
@@ -448,6 +448,7 @@
<string>&Insert</string>
</property>
<addaction name="actionMusicFile"/>
+ <addaction name="actionAdditionalMusicFile"/>
<addaction name="separator"/>
<addaction name="actionLyricsFromFile"/>
<addaction name="actionLyricsFromClipboard"/>
@@ -704,6 +705,11 @@
<string>About Qt...</string>
</property>
</action>
+ <action name="actionAdditionalMusicFile">
+ <property name="text">
+ <string>&Additional music file...</string>
+ </property>
+ </action>
</widget>
<resources/>
<connections>
diff --git a/editorapp.cc b/editorapp.cc
index 3dbe4ce..21c35ed 100644
--- a/editorapp.cc
+++ b/editorapp.cc
@@ -69,6 +69,7 @@ EditorApp::EditorApp(QWidget *parent)
ui.actionSelectAll->setIcon(QIcon::fromTheme("edit-select-all", QIcon(":/icons/edit-select-all.png")));
ui.menuPreferences->setIcon(QIcon::fromTheme("preferences-other", QIcon(":/icons/preferences-other.png")));
ui.actionMusicFile->setIcon(QIcon::fromTheme("insert-object", QIcon(":/icons/insert-object.png")));
+ ui.actionAdditionalMusicFile->setIcon(QIcon::fromTheme("insert-object", QIcon(":/icons/insert-object.png")));
ui.actionLyricsFromFile->setIcon(QIcon::fromTheme("insert-text", QIcon(":/icons/insert-text.png")));
ui.actionLyricsFromClipboard->setIcon(QIcon::fromTheme("insert-text", QIcon(":/icons/insert-text.png")));
ui.actionZoomIn->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/zoom-in.png")));
@@ -590,17 +591,19 @@ void EditorApp::on_actionAntiAliasing_toggled(bool checked)
// Insert menu
-void EditorApp::setMusic(QString filepath)
+void EditorApp::setMusic(QString filepath, bool primary)
{
ui.valMusicFile->setText(filepath);
- song->music["EDITOR"] = filepath;
+ song->music[primary ? "EDITOR" : "ADDITIONAL"] = filepath;
setWindowModified(true);
updateMenuStates();
- // Metadata is updated when it becomes available (signal)
- player->setCurrentSource(Phonon::MediaSource(QUrl::fromLocalFile(filepath)));
- noteGraph->updateMusicPos(0, false);
- // Fire up analyzer
- noteGraph->analyzeMusic(filepath);
+ if (primary) {
+ // Metadata is updated when it becomes available (signal)
+ player->setCurrentSource(Phonon::MediaSource(QUrl::fromLocalFile(filepath)));
+ noteGraph->updateMusicPos(0, false);
+ // Fire up analyzer
+ noteGraph->analyzeMusic(filepath);
+ } else noteGraph->analyzeMusic(filepath, 1);
}
void EditorApp::on_actionMusicFile_triggered()
@@ -615,6 +618,19 @@ void EditorApp::on_actionMusicFile_triggered()
}
}
+void EditorApp::on_actionAdditionalMusicFile_triggered()
+{
+ // FIXME: Duplication with on_actionMusicFile_triggered()
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
+ latestPath,
+ tr("Music files") + " (*.mp3 *.ogg *.wav *.wma *.flac)");
+
+ if (!fileName.isNull()) {
+ QFileInfo finfo(fileName); latestPath = finfo.path();
+ setMusic(fileName, false);
+ }
+}
+
void EditorApp::on_actionLyricsFromFile_triggered()
{
if ((noteGraph && noteGraph->noteLabels().empty())
diff --git a/editorapp.hh b/editorapp.hh
index 0164c14..ab9a8c9 100644
--- a/editorapp.hh
+++ b/editorapp.hh
@@ -59,7 +59,7 @@ public:
private:
void setupNoteGraph();
- void setMusic(QString filepath);
+ void setMusic(QString filepath, bool primary = true);
bool promptSaving();
void saveProject(QString fileName);
void exportSong(QString format, QString dialogTitle);
@@ -107,6 +107,7 @@ public slots:
// Insert menu
void on_actionMusicFile_triggered();
+ void on_actionAdditionalMusicFile_triggered();
void on_actionLyricsFromFile_triggered();
void on_actionLyricsFromClipboard_triggered();
|
|
From: Tapio V. <aa...@us...> - 2011-10-11 20:01:32
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Oct 4 22:38:21 2011 +0300
Experimental multiple PitchVis support for NoteGraphWidget (not yet used).
---
notegraphwidget.cc | 40 +++++++++++++++++++++++-----------------
notegraphwidget.hh | 13 +++++++------
pitchvis.cc | 7 ++++---
pitchvis.hh | 5 +++--
4 files changed, 37 insertions(+), 28 deletions(-)
diff --git a/notegraphwidget.cc b/notegraphwidget.cc
index ad4d4ea..a4357af 100644
--- a/notegraphwidget.cc
+++ b/notegraphwidget.cc
@@ -31,7 +31,7 @@ namespace {
NoteGraphWidget::NoteGraphWidget(QWidget *parent)
: NoteLabelManager(parent), m_mouseHotSpot(), m_seeking(), m_actionHappened(),
- m_pitch(), m_seekHandle(this), m_nextNotePixmap(), m_notePixmapTimer(), m_analyzeTimer(), m_playbackTimer(), m_playbackPos(), m_pixmap(), m_pixmapPos()
+ m_seekHandle(this), m_nextNotePixmap(), m_notePixmapTimer(), m_analyzeTimer(), m_playbackTimer(), m_playbackPos(), m_pixmap(), m_pixmapPos()
{
setProperty("darkBackground", true);
setStyleSheet("QLabel[darkBackground=\"true\"] { background: " + BGColor + "; }");
@@ -144,10 +144,10 @@ void NoteGraphWidget::scrollToFirstNote()
}
}
-void NoteGraphWidget::analyzeMusic(QString filepath)
+void NoteGraphWidget::analyzeMusic(QString filepath, int visId)
{
- m_pitch.reset(new PitchVis(filepath, this));
- connect(m_pitch.data(), SIGNAL(renderedImage(QImage,QPoint)), this, SLOT(updatePixmap(QImage,QPoint)));
+ m_pitch[visId].reset(new PitchVis(filepath, this));
+ connect(m_pitch[visId].data(), SIGNAL(renderedImage(QImage,QPoint,int)), this, SLOT(updatePixmap(QImage,QPoint,int)));
m_analyzeTimer = startTimer(100);
}
@@ -158,13 +158,14 @@ void NoteGraphWidget::timerEvent(QTimerEvent* event)
m_playbackPos += m_playbackInterval.restart();
updateMusicPos(m_playbackPos);
- } else if (event->timerId() == m_analyzeTimer && m_pitch) {
+ // FIXME: Only considers first pitchvis
+ } else if (event->timerId() == m_analyzeTimer && m_pitch[0]) {
// PitchVis stuff
double progress, duration;
{
- QMutexLocker locker(&m_pitch->mutex);
- progress = m_pitch->getProgress();
- duration = m_pitch->getDuration();
+ QMutexLocker locker(&m_pitch[0]->mutex);
+ progress = m_pitch[0]->getProgress();
+ duration = m_pitch[0]->getDuration();
}
emit analyzeProgress(1000 * progress, 1000); // Update progress bar
m_duration = std::max(m_duration, duration);
@@ -208,8 +209,10 @@ void NoteGraphWidget::paintEvent(QPaintEvent*)
QPainter painter(this);
// PitchVis pixmap
- if (!m_pixmap.isNull())
- painter.drawPixmap(m_pixmapPos, m_pixmap);
+ for (int i = 0; i < MaxPitchVis; ++i) {
+ if (!m_pixmap[i].isNull())
+ painter.drawPixmap(m_pixmapPos[i], m_pixmap[i]);
+ }
// Octave lines
QPen pen; pen.setWidth(1); pen.setColor(QColor("#666"));
@@ -226,12 +229,12 @@ void NoteGraphWidget::paintEvent(QPaintEvent*)
}
}
-void NoteGraphWidget::updatePixmap(const QImage &image, const QPoint &position)
+void NoteGraphWidget::updatePixmap(const QImage &image, const QPoint &position, int visId)
{
// PitchVis sends its renderings here, let's save & draw them
// This gets actually called in our own thread by our own event loop (queued connection)
- m_pixmap = QPixmap::fromImage(image);
- m_pixmapPos = position;
+ m_pixmap[visId] = QPixmap::fromImage(image);
+ m_pixmapPos[visId] = position;
update();
}
@@ -239,12 +242,13 @@ void NoteGraphWidget::updatePitch()
{
// Called whenever pitch needs updating
// Note that the scrollbar change signals are connected here, so no need to call this from everywhere
- if (!m_pitch) return;
+ if (!m_pitch[0]) return;
// Find out the viewport
int x1, y1, x2, y2;
calcViewport(x1, y1, x2, y2);
// Ask for a new render
- m_pitch->paint(x1, 0, x2, height());
+ for (int i = 0; i < MaxPitchVis; ++i)
+ if (m_pitch[i]) m_pitch[i]->paint(x1, 0, x2, height());
}
void NoteGraphWidget::updateNotes(bool leftToRight)
@@ -287,7 +291,8 @@ void NoteGraphWidget::updateNotes(bool leftToRight)
n2.begin = pos;
n2.end = pos + len;
// Try to find optimal pitch
- if (m_pitch) n2.note = m_pitch->guessNote(pos, pos + len + step, 24);
+ // TODO: Use info also from other pitchvis
+ if (m_pitch[0]) n2.note = m_pitch[0]->guessNote(pos, pos + len + step, 24);
// Calculate starting time for the next note
pos += (len + step) * (leftToRight ? 1 : -1);
// Update NoteLabel geometry
@@ -337,7 +342,8 @@ void NoteGraphWidget::timeCurrent()
double begin = px2s(m_seekHandle.curx());
double end = px2s(m_seekHandle.curx() + selectedNote()->width());
int n = selectedNote()->note().note;
- if (m_pitch) n = m_pitch->guessNote(begin, end, n);
+ // TODO: Use info also from other pitchvis
+ if (m_pitch[0]) n = m_pitch[0]->guessNote(begin, end, n);
op << getNoteLabelId(selectedNote()) << begin << end << n;
doOperation(op);
}
diff --git a/notegraphwidget.hh b/notegraphwidget.hh
index 6b770ca..7818c82 100644
--- a/notegraphwidget.hh
+++ b/notegraphwidget.hh
@@ -102,6 +102,7 @@ protected:
};
+const int MaxPitchVis = 2;
class NoteGraphWidget: public NoteLabelManager
{
@@ -115,7 +116,7 @@ public:
void setLyrics(QString lyrics);
void setLyrics(const VocalTrack &track);
- void analyzeMusic(QString filepath);
+ void analyzeMusic(QString filepath, int visId = 0);
void updateNotes(bool leftToRight = true);
void updateMusicPos(qint64 time, bool smoothing = true);
@@ -132,9 +133,9 @@ public slots:
void timeSyllable();
void timeSentence();
void setSeekHandleWrapToViewport(bool state) { m_seekHandle.wrapToViewport = state; }
- void updatePixmap(const QImage &image, const QPoint &position);
+ void updatePixmap(const QImage &image, const QPoint &position, int visId);
void updatePitch();
- void abortPitch() { if (m_pitch) m_pitch->cancel(); }
+ void abortPitch() { for (int i = 0; i < MaxPitchVis; ++i) if (m_pitch[i]) m_pitch[i]->cancel(); }
void scrollToFirstNote();
void startNotePixmapUpdates(); ///< Starts creating pixmaps for NoteLabels
@@ -162,7 +163,7 @@ private:
QPoint m_mouseHotSpot;
bool m_seeking;
bool m_actionHappened;
- QScopedPointer<PitchVis> m_pitch;
+ QScopedPointer<PitchVis> m_pitch[MaxPitchVis];
SeekHandle m_seekHandle;
int m_nextNotePixmap;
int m_notePixmapTimer;
@@ -170,8 +171,8 @@ private:
int m_playbackTimer;
QElapsedTimer m_playbackInterval;
qint64 m_playbackPos;
- QPixmap m_pixmap;
- QPoint m_pixmapPos;
+ QPixmap m_pixmap[MaxPitchVis];
+ QPoint m_pixmapPos[MaxPitchVis];
};
diff --git a/pitchvis.cc b/pitchvis.cc
index 8383f49..6c795fb 100644
--- a/pitchvis.cc
+++ b/pitchvis.cc
@@ -11,8 +11,9 @@
#include <QLabel>
#include <QSettings>
-PitchVis::PitchVis(QString const& filename, QWidget *parent)
- : QThread(parent), mutex(), fileName(filename), duration(), moreAvailable(), quit(), cancelled(), restart(), m_x1(), m_y1(), m_x2(), m_y2(), condition()
+PitchVis::PitchVis(QString const& filename, QWidget *parent, int visId)
+ : QThread(parent), mutex(), fileName(filename), duration(), moreAvailable(), quit(),
+ cancelled(), restart(), m_x1(), m_y1(), m_x2(), m_y2(), m_visId(visId), condition()
{
start(); // Launch the thread
}
@@ -175,7 +176,7 @@ void PitchVis::renderer() {
// Send the image
// This is actually delivered by the reciever's event loop thread, and not called directly from here
- emit renderedImage(image, QPoint(x1, y1));
+ emit renderedImage(image, QPoint(x1, y1), m_visId);
mutex.lock();
// If nothing to do, sleep here
diff --git a/pitchvis.hh b/pitchvis.hh
index 7b83028..a029f4d 100644
--- a/pitchvis.hh
+++ b/pitchvis.hh
@@ -32,7 +32,7 @@ public:
typedef std::vector<PitchPath> Paths;
QMutex mutex;
- PitchVis(QString const& filename, QWidget *parent = NULL);
+ PitchVis(QString const& filename, QWidget *parent = NULL, int visId = 0);
~PitchVis() { stop(); wait(); }
void stop();
@@ -44,7 +44,7 @@ public:
int guessNote(double begin, double end, int initial);
signals:
- void renderedImage(const QImage &image, const QPoint &position);
+ void renderedImage(const QImage &image, const QPoint &position, int visId);
protected:
void run(); // Thread runs here
@@ -64,5 +64,6 @@ private:
bool restart; ///< Should we start the rendering again?
QWaitCondition condition;
int m_x1, m_y1, m_x2, m_y2;
+ int m_visId;
};
|
|
From: Tapio V. <aa...@us...> - 2011-10-05 15:15:14
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:12:34 2011 +0300 Added a paragraph of documentation about the additional music file feature. --- docs/helpindex.html | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/docs/helpindex.html b/docs/helpindex.html index fd67e6f..81f67bc 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -24,6 +24,7 @@ <h3><a name="initialimport">Importing song and lyrics</a></h3> <p>The first step is to import a music file for analyzation and lyrics text for generating notes. This can be done e.g. through the import menu. Supported song file formats vary depending on the platform, but at least mp3 and ogg should be ok. Lyrics assume that each phrase is on a line of its own - when the text is imported, a note is generated for each word and a sentence marker is placed at the beginning of each line.</p> +<p>You can also add an additional music file via the import menu. It will get analyzed and the results are displayed with different colors. The idea is that if you have a music file with both vocals and instruments, plus another karaoke version with just the instruments, you can use the analysis from the additional (karaoke) music to determine which tones belong to the background and are probably not singing.</p> <h3><a name="timing">Note timing</a></h3> <p>The easiest way to get the notes roughly timed is to switch to the <em>Tools</em> tab and start listening to the music. Each time you hear the phrase that is displayed in the tab, hit the <em>Time phrase</em> button (or its hotkey) and the start of the current phrase is placed to that position.</p> |
|
From: Tapio V. <aa...@us...> - 2011-10-05 15:15:06
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:06:50 2011 +0300 Fixed an errorenous line in help text. --- docs/helpindex.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/docs/helpindex.html b/docs/helpindex.html index 5bc700f..fd67e6f 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -22,7 +22,7 @@ <h2><a name="workflow">Basic Workflow</a></h2> <p>In addition to the sections here, the intended workflow is documented as a handy dialog with clickable items - follow it step-by-step and in the end you'll have finished notes for the song. Access it through the main menubar: Help --> Getting started.</p> -<h3><a name="initialimport">Importing song lyrics</h3> +<h3><a name="initialimport">Importing song and lyrics</a></h3> <p>The first step is to import a music file for analyzation and lyrics text for generating notes. This can be done e.g. through the import menu. Supported song file formats vary depending on the platform, but at least mp3 and ogg should be ok. Lyrics assume that each phrase is on a line of its own - when the text is imported, a note is generated for each word and a sentence marker is placed at the beginning of each line.</p> <h3><a name="timing">Note timing</a></h3> |
|
From: Tapio V. <aa...@us...> - 2011-10-05 15:14:55
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:06:50 2011 +0300 Fixed an errorenous line in help text. --- docs/helpindex.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/docs/helpindex.html b/docs/helpindex.html index 150d57c..44202e9 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -22,7 +22,7 @@ <h2><a name="workflow">Basic Workflow</a></h2> <p>In addition to the sections here, the intended workflow is documented as a handy dialog with clickable items - follow it step-by-step and in the end you'll have finished notes for the song. Access it through the main menubar: Help --> Getting started.</p> -<h3><a name="initialimport">Importing song lyrics</h3> +<h3><a name="initialimport">Importing song and lyrics</a></h3> <p>The first step is to import a music file for analyzation and lyrics text for generating notes. This can be done e.g. through the import menu. Supported song file formats vary depending on the platform, but at least mp3 and ogg should be ok. Lyrics assume that each phrase is on a line of its own - when the text is imported, a note is generated for each word and a sentence marker is placed at the beginning of each line.</p> <h3><a name="timing">Note timing</a></h3> |
|
From: Tapio V. <aa...@us...> - 2011-10-05 15:14:45
|
Author: Tapio Vierros <tap...@gm...> Date: Wed Oct 5 18:00:59 2011 +0300 Update format support docs. --- docs/FileFormats.txt | 2 +- docs/helpindex.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/FileFormats.txt b/docs/FileFormats.txt index 23e9bc1..417c14b 100644 --- a/docs/FileFormats.txt +++ b/docs/FileFormats.txt @@ -21,7 +21,7 @@ Import and export. All tags are not preserved. Frets on Fire MIDI/INI ---------------------- -No support, but both import and export are planned. +Vocal track import and export. Plain text lyrics diff --git a/docs/helpindex.html b/docs/helpindex.html index 5bc700f..150d57c 100644 --- a/docs/helpindex.html +++ b/docs/helpindex.html @@ -47,12 +47,12 @@ <h2><a name="formats">File formats</a></h2> -<p>Various formats are supported:</p> +<p>Various formats are supported to a reasonable extent:</p> <ul> <li>"Native" project file format, which preserves floating note status and undo history.</li> <li>SingStar XML, import/export</li> <li>UltraStar TXT, import/export</li> -<li>Frets on Fire INI+MIDI, import</li> +<li>Frets on Fire INI+MIDI, import/export</li> <li>LRC karaoke lyrics, export</li> <li>Plain text lyrics, import/export</li> </ul> |
|
From: Tapio V. <aa...@us...> - 2011-10-04 20:47:12
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Oct 4 23:44:44 2011 +0300
Progressbar measures the least progressed PitchVis.
---
notegraphwidget.cc | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/notegraphwidget.cc b/notegraphwidget.cc
index db7f303..7ca533e 100644
--- a/notegraphwidget.cc
+++ b/notegraphwidget.cc
@@ -158,14 +158,14 @@ void NoteGraphWidget::timerEvent(QTimerEvent* event)
m_playbackPos += m_playbackInterval.restart();
updateMusicPos(m_playbackPos);
- // FIXME: Only considers first pitchvis
} else if (event->timerId() == m_analyzeTimer && m_pitch[0]) {
// PitchVis stuff
- double progress, duration;
- {
- QMutexLocker locker(&m_pitch[0]->mutex);
- progress = m_pitch[0]->getProgress();
- duration = m_pitch[0]->getDuration();
+ double progress = 1.0, duration;
+ for (int i = 0; i < MaxPitchVis; ++i) {
+ if (!m_pitch[i]) continue;
+ QMutexLocker locker(&m_pitch[i]->mutex);
+ progress = std::min(progress, m_pitch[i]->getProgress());
+ if (i == 0) duration = m_pitch[i]->getDuration();
}
emit analyzeProgress(1000 * progress, 1000); // Update progress bar
m_duration = std::max(m_duration, duration);
|
|
From: Tapio V. <aa...@us...> - 2011-10-04 20:46:21
|
Author: Tapio Vierros <tap...@gm...> Date: Tue Oct 4 22:36:53 2011 +0300 Gitignore robustness. --- .gitignore | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/.gitignore b/.gitignore index 74a1780..ba51859 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ build build32 build64 -CMakeLists.txt.user +CMakeLists.txt.user* |
|
From: Tapio V. <aa...@us...> - 2011-10-04 18:12:58
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Oct 4 21:11:14 2011 +0300
Fixed compile failure on newest ffmpeg version.
Courtesy of Vincent.
---
ffmpeg.cc | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/ffmpeg.cc b/ffmpeg.cc
index 7ae263a..365de0c 100644
--- a/ffmpeg.cc
+++ b/ffmpeg.cc
@@ -57,6 +57,12 @@ double FFmpeg::duration() const {
return d >= 0.0 ? d : getInf();
}
+// FFMPEG has fluctuating API
+#if LIBAVCODEC_VERSION_INT < ((52<<16)+(64<<8)+0)
+#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
+#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
+#endif
+
void FFmpeg::open() {
QMutexLocker l(&s_avcodec_mutex);
av_register_all();
@@ -69,7 +75,7 @@ void FFmpeg::open() {
for (unsigned int i=0; i<pFormatCtx->nb_streams; i++) {
AVCodecContext* cc = pFormatCtx->streams[i]->codec;
cc->workaround_bugs = FF_BUG_AUTODETECT;
- if (audioStream == -1 && cc->codec_type==CODEC_TYPE_AUDIO) audioStream = i;
+ if (audioStream == -1 && cc->codec_type==AVMEDIA_TYPE_AUDIO) audioStream = i;
}
if (audioStream == -1) throw std::runtime_error("No audio stream found");
AVCodecContext* cc = pFormatCtx->streams[audioStream]->codec;
|
|
From: Lasse Kärkkäi. <tr...@us...> - 2011-09-19 09:50:45
|
Author: Lasse Kärkkäinen <tronic+ndrm at trn.iki.fi> Date: Mon Sep 19 12:49:38 2011 +0300 libpng voidp API change --- game/image.hh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/game/image.hh b/game/image.hh index 58a63a3..d50b1ae 100644 --- a/game/image.hh +++ b/game/image.hh @@ -26,7 +26,7 @@ namespace { } void loadPNG_internal(png_structp pngPtr, png_infop infoPtr, std::ifstream& file, std::vector<unsigned char>& image, std::vector<png_bytep>& rows, unsigned& w, unsigned& h) { if (setjmp(png_jmpbuf(pngPtr))) throw std::runtime_error("Reading PNG failed"); - png_set_read_fn(pngPtr,(voidp)&file, readPngHelper); + png_set_read_fn(pngPtr,(png_voidp)&file, readPngHelper); png_read_info(pngPtr, infoPtr); png_set_expand(pngPtr); // Expand everything to RGB(A) png_set_strip_16(pngPtr); // Strip everything down to 8 bit/component |
|
From: Tapio V. <aa...@us...> - 2011-08-23 16:07:46
|
Author: Tapio Vierros <tap...@gm...> Date: Tue Aug 23 19:06:33 2011 +0300 Merge branch 'master' of git://git.performous.org/gitroot/performous/performous --- |
|
From: Tapio V. <aa...@us...> - 2011-08-23 16:07:39
|
Author: Tapio Vierros <tap...@gm...>
Date: Tue Aug 23 19:05:43 2011 +0300
Fixed loading screen rendering.
---
game/screen.hh | 3 +++
game/screenmanager.cc | 14 +++++++++-----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/game/screen.hh b/game/screen.hh
index 1ea4fbd..64d3e29 100644
--- a/game/screen.hh
+++ b/game/screen.hh
@@ -62,6 +62,8 @@ class ScreenManager: public Singleton <ScreenManager> {
/// Draw a loading progress indication
void loading(std::string const& message, float progress);
+ /// Internal rendering function for loading indicator
+ void drawLoading();
/// Draw an error notification and quit
void fatalError(std::string const& message);
/// Set a message to flash in current screen
@@ -97,6 +99,7 @@ class ScreenManager: public Singleton <ScreenManager> {
std::string m_message;
AnimValue m_messagePopup;
SvgTxtTheme m_textMessage;
+ float m_loadingProgress;
Surface m_logo;
AnimValue m_logoAnim;
// Dialog members
diff --git a/game/screenmanager.cc b/game/screenmanager.cc
index 6087d2c..5b289b8 100644
--- a/game/screenmanager.cc
+++ b/game/screenmanager.cc
@@ -16,7 +16,7 @@ ScreenManager::ScreenManager(Window& _window):
m_window(_window), m_finished(false), newScreen(), currentScreen(),
m_timeToFadeIn(), m_timeToFadeOut(), m_timeToShow(), m_message(),
m_messagePopup(0.0, 1.0), m_textMessage(getThemePath("message_text.svg"), config["graphic/text_lod"].f()),
- m_logo(getThemePath("logo.svg")), m_logoAnim(0.0, 0.5)
+ m_loadingProgress(0.0f), m_logo(getThemePath("logo.svg")), m_logoAnim(0.0, 0.5)
{
m_textMessage.dimensions.middle().center(-0.05);
}
@@ -49,23 +49,27 @@ void ScreenManager::drawScreen() {
drawNotifications();
}
-
void ScreenManager::loading(std::string const& message, float progress) {
// TODO: Create a better one, this is quite ugly
flashMessage(message + " " + boost::lexical_cast<std::string>(int(round(progress*100))) + "%", 0.0f, 1.0f, 1.0f);
+ m_loadingProgress = progress;
m_window.blank();
+ m_window.render(boost::bind(&ScreenManager::drawLoading, this));
+ m_window.swap();
+}
+
+void ScreenManager::drawLoading() {
drawLogo();
drawNotifications();
const int maxi = 20;
const float x = 0.3;
const float spacing = 0.01;
const float sq_size = (2*x - (maxi-1)*spacing) / maxi;
- for (int i = 0; i <= progress * maxi; ++i) {
- ColorTrans c(Color(0.2f, 0.7f, 0.7f, (progress + 1)*0.5f));
+ for (int i = 0; i <= m_loadingProgress * maxi; ++i) {
+ ColorTrans c(Color(0.2f, 0.7f, 0.7f, (m_loadingProgress + 1)*0.5f));
UseShader shader(getShader("color"));
glutil::Square(-x + i * (sq_size + spacing), 0, sq_size/2, true);
}
- m_window.swap();
}
void ScreenManager::fatalError(std::string const& message) {
|
|
From: sajjadG <sa...@us...> - 2011-08-01 22:57:14
|
Author: sajjadg <saj...@gm...> Date: Mon Aug 1 03:25:05 2011 -0400 Update for The Persian Language Translation. It's almost complete with just 3 fuzzy strings. --- lang/fa.po | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 279 insertions(+), 4 deletions(-) |
|
From: Tapio V. <aa...@us...> - 2011-08-01 19:45:15
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 22:44:41 2011 +0300 Gitignore robustness. --- .gitignore | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/.gitignore b/.gitignore index 74a1780..ba51859 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ build build32 build64 -CMakeLists.txt.user +CMakeLists.txt.user* |
|
From: Tapio V. <aa...@us...> - 2011-08-01 19:12:20
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 22:11:28 2011 +0300 Synced most translations from sources. --- lang/ast.po | 837 ++++++++++++++++++++++++++++++++++++++------------------- lang/da.po | 827 +++++++++++++++++++++++++++++-------------------------- lang/de.po | 814 +++++++++++++++++++++++++++++-------------------------- lang/es.po | 846 ++++++++++++++++++++++++++++++--------------------------- lang/fr.po | 834 ++++++++++++++++++++++++++++++-------------------------- lang/hu.po | 755 +++++++++++++++++++++++++++------------------------ lang/it.po | 788 ++++++++++++++++++++++++++++------------------------- lang/ja.po | 792 ++++++++++++++++++++++++++++------------------------- lang/nl.po | 835 ++++++++++++++++++++++++++++++-------------------------- lang/pl.po | 836 ++++++++++++++++++++++++++++++-------------------------- lang/sv.po | 878 +++++++++++++++++++++++++++++++---------------------------- 11 files changed, 4917 insertions(+), 4125 deletions(-) |
|
From: Tapio V. <aa...@us...> - 2011-08-01 19:12:12
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 22:02:38 2011 +0300 Updated performous.pot --- lang/performous.pot | 696 ++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 497 insertions(+), 199 deletions(-) |
|
From: Tapio V. <aa...@us...> - 2011-08-01 18:56:07
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 21:55:22 2011 +0300 Added Qt Creator's CMakeLists.txt.user to gitignore. --- .gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.gitignore b/.gitignore index 4497982..74a1780 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build build32 build64 +CMakeLists.txt.user |
|
From: Tapio V. <aa...@us...> - 2011-08-01 18:55:59
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 21:54:21 2011 +0300 Added Asturian translation. --- lang/ast.po | 578 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 578 insertions(+), 0 deletions(-) |
|
From: Tapio V. <aa...@us...> - 2011-08-01 18:53:44
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 21:53:13 2011 +0300 Update FI translation. --- lang/fi.po | 418 +++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 228 insertions(+), 190 deletions(-) |
|
From: Tapio V. <aa...@us...> - 2011-08-01 18:47:12
|
Author: Tapio Vierros <tap...@gm...>
Date: Mon Aug 1 21:46:05 2011 +0300
Fixed xml_gettext.sh to reflect changes in schema.xml
---
tools/scripts/xml_gettext.sh | 32 ++++++++++++++++----------------
1 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/tools/scripts/xml_gettext.sh b/tools/scripts/xml_gettext.sh
index 7c6b8e1..2f59120 100755
--- a/tools/scripts/xml_gettext.sh
+++ b/tools/scripts/xml_gettext.sh
@@ -4,27 +4,27 @@
# See instructions in lang/README.
#
# As long as the xml files are well-formed XML documents with
-# locale blocks like the following one (from scheme.xml) this
+# entry blocks like the following one (from scheme.xml) this
# script should have no problems extracting the strings.
-# <locale name="C">
+# <entry ...>
# <short>Karaoke mode</short>
# <long>Hide pitch wave, notes and scoring.</long>
-# </locale>
+# </entry>
# adds a line to the temporary source file
append_temp_src(){
echo "$*" >> "$TEMP_SRC"
}
-# match <locale name="C">, ignoring allowed whitespace.
-match_locale_start(){
- echo "$1" | grep -qE '^[[:space:]]*<[[:space:]]*locale[[:space:]]+name="C"[[:space:]]*>[[:space:]]*$'
+# match <entry, ignoring allowed whitespace.
+match_entry_start(){
+ echo "$1" | grep -qE '^[[:space:]]*<[[:space:]]*entry.*>[[:space:]]*$'
return $?
}
-# match </locale>, ignoring allowed whitespace.
-match_locale_end(){
- echo "$1" | grep -qE '^[[:space:]]*<[[:space:]]*/[[:space:]]*locale>[[:space:]]*$'
+# match </entry>, ignoring allowed whitespace.
+match_entry_end(){
+ echo "$1" | grep -qE '^[[:space:]]*<[[:space:]]*/[[:space:]]*entry>[[:space:]]*$'
return $?
}
@@ -58,24 +58,24 @@ process_xml(){
do
line_no=$(($line_no + 1))
- # A simple 2-state automata, either we're in a <locale/>-block
+ # A simple 2-state automata, either we're in a <entry/>-block
# or we're not. Limited detection and bail-out on malformed XML
if [[ $IN_BLOCK -eq 1 ]] ; then
- match_locale_end "$line"
+ match_entry_end "$line"
if [[ $? -eq 0 ]] ; then
IN_BLOCK=0
else
process_locale_block_line "$line"
fi
- # <locale...> with out </locale> found:
- match_locale_start "$line" && (echo "Malformed XML $file:$line_no: Opening locale-tag found while already inside a locale block." >&2 ;exit -1)
+ # <entry...> with out </entry> found:
+ match_entry_start "$line" && (echo "Malformed XML $file:$line_no: Opening entry-tag found while already inside an entry block." >&2 ;exit -1)
else
- # </locale> with out <locale> found:
- match_locale_end "$line" && (echo "Malformed XML $file:$line_no:: Closing locale-tag without prior opening tag." >&2 ;exit -1)
+ # </entry> with out <entry> found:
+ match_entry_end "$line" && (echo "Malformed XML $file:$line_no:: Closing entry-tag without prior opening tag." >&2 ;exit -1)
- match_locale_start "$line"
+ match_entry_start "$line"
if [[ $? -eq 0 ]] ; then
IN_BLOCK=1
fi
|
|
From: Tapio V. <aa...@us...> - 2011-08-01 18:47:05
|
Author: Tapio Vierros <tap...@gm...> Date: Mon Aug 1 21:44:31 2011 +0300 Typo fix. --- data/schema.xml | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/data/schema.xml b/data/schema.xml index a9ca5cc..ac324e6 100644 --- a/data/schema.xml +++ b/data/schema.xml @@ -110,7 +110,7 @@ to save the current settings to XML. <ui unit=" %" /> <limits min="0" max="100" step="2" /> <short>Stereo3D separation</short> - <long>The strenght of the effect. Experiment with different settings for best results.</long> + <long>The strength of the effect. Experiment with different settings for best results.</long> </entry> <entry name="graphic/video" type="bool" value="true"> <short>Video playback</short> |