|
From: Tapio V. <aa...@us...> - 2009-11-03 20:37:25
|
Module: performous
Branch: master
Commit: 0ba3edc9c97959e8d5822512468a6608be8e9421
Author: Tapio Vierros <tap...@gm...>
Date: Tue Nov 3 22:32:26 2009 +0200
Added support for rhythm and coop guitar tracks plus some broken track detection.
Additional guitar tracks are displayed in the song browser by interlaced guitar icons.
---
game/screen_sing.cc | 12 +++++++++++-
game/screen_songs.cc | 27 +++++++++++++++++----------
game/songparser-ini.cc | 16 +++++++++++++---
3 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index 1cf8429..f4c85f8 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -53,6 +53,8 @@ void ScreenSing::enter() {
// Here we load alternatively guitar/bass tracks until no guitar controler is available
// then we load all the drums tracks until no drum controler is available (and place them in second position)
bool no_guitar = false;
+ bool no_guitar2 = false;
+ bool no_guitar3 = false;
bool no_bass = false;
while (1) {
try {
@@ -61,9 +63,17 @@ void ScreenSing::enter() {
} catch (std::runtime_error&) {no_guitar = true;}
try {
Instruments::iterator it = m_instruments.end();
+ m_instruments.insert(it, new GuitarGraph(m_audio, *m_song, "coop guitar"));
+ } catch (std::runtime_error&) {no_guitar2 = true;}
+ try {
+ Instruments::iterator it = m_instruments.end();
m_instruments.insert(it, new GuitarGraph(m_audio, *m_song, "bass"));
} catch (std::runtime_error&) {no_bass = true;}
- if( no_guitar && no_bass ) break;
+ try {
+ Instruments::iterator it = m_instruments.end();
+ m_instruments.insert(it, new GuitarGraph(m_audio, *m_song, "rhythm guitar"));
+ } catch (std::runtime_error&) {no_guitar3 = true;}
+ if( no_guitar && no_guitar2 && no_guitar3 && no_bass ) break;
}
while(1) {
try {
diff --git a/game/screen_songs.cc b/game/screen_songs.cc
index 1b79007..7c0e6de 100644
--- a/game/screen_songs.cc
+++ b/game/screen_songs.cc
@@ -245,16 +245,23 @@ void ScreenSongs::draw() {
glTexCoord2f(0.25f, 1.0f); glVertex2f(x, dim.y2());
}
{
- // guitar
- alpha = (isTrackInside(song_display.track_map,"guitar")) ? 1.00 : 0.25;
- glutil::Begin block(GL_TRIANGLE_STRIP);
- glColor4f(1.0, 1.0, 1.0, alpha);
- x = dim.x1()+0.25*(dim.x2()-dim.x1());
- glTexCoord2f(0.25f, 0.0f); glVertex2f(x, dim.y1());
- glTexCoord2f(0.25f, 1.0f); glVertex2f(x, dim.y2());
- x = dim.x1()+0.50*(dim.x2()-dim.x1());
- glTexCoord2f(0.50f, 0.0f); glVertex2f(x, dim.y1());
- glTexCoord2f(0.50f, 1.0f); glVertex2f(x, dim.y2());
+ // guitars
+ alpha = 1.0;
+ int guitarCount = 0;
+ if (isTrackInside(song_display.track_map,"guitar")) guitarCount++;
+ if (isTrackInside(song_display.track_map,"coop guitar")) guitarCount++;
+ if (isTrackInside(song_display.track_map,"rhythm guitar")) guitarCount++;
+ if (guitarCount == 0) { guitarCount = 1; alpha = 0.25; }
+ for (int i = guitarCount-1; i >= 0; i--) {
+ glutil::Begin block(GL_TRIANGLE_STRIP);
+ glColor4f(1.0, 1.0, 1.0, alpha);
+ x = dim.x1()+(0.25+i*0.04)*(dim.x2()-dim.x1());
+ glTexCoord2f(0.25f, 0.0f); glVertex2f(x, dim.y1());
+ glTexCoord2f(0.25f, 1.0f); glVertex2f(x, dim.y2());
+ x = dim.x1()+(0.50+i*0.04)*(dim.x2()-dim.x1());
+ glTexCoord2f(0.50f, 0.0f); glVertex2f(x, dim.y1());
+ glTexCoord2f(0.50f, 1.0f); glVertex2f(x, dim.y2());
+ }
}
{
// bass
diff --git a/game/songparser-ini.cc b/game/songparser-ini.cc
index 4b53e57..a55d489 100644
--- a/game/songparser-ini.cc
+++ b/game/songparser-ini.cc
@@ -49,8 +49,8 @@ void SongParser::iniParse() {
// These are added features (not part of FoF)
else if (key == "cover") s.cover = value;
else if (key == "background") s.background = value;
- else if (key == "video") m_song.video = value;
- else if (key == "videogap") assign(m_song.videoGap, value);
+ else if (key == "video") s.video = value;
+ else if (key == "videogap") assign(s.videoGap, value);
// End of added features
}
if (s.title.empty() || s.artist.empty()) throw std::runtime_error("Required header fields missing");
@@ -94,7 +94,8 @@ void SongParser::iniParse() {
else if (name == "T1 GEMS") name = "guitar"; // Some old MIDI files have a track named T1 GEMS
else if (name.substr(0, 5) != "PART ") continue;
else name.erase(0, 5);
- if (name == "GUITAR COOP") continue; // TODO: do something with these? They don't work in current version
+ if (name == "GUITAR COOP") name = "coop guitar";
+ if (name == "RHYTHM") name = "rhythm guitar";
if (name == "DRUM") name = "drums";
if (name == "DRUMS") name = "drums";
if (name == "BASS") name = "bass";
@@ -102,6 +103,7 @@ void SongParser::iniParse() {
// Process non-vocal tracks
if (name != "VOCALS") {
bool drums = (name == "drums");
+ int durCount = 0;
s.track_map.insert(make_pair(name,Track(name)));
NoteMap& nm2 = s.track_map.find(name)->second.nm;
for (MidiFileParser::NoteMap::const_iterator it2 = it->notes.begin(); it2 != it->notes.end(); ++it2) {
@@ -114,8 +116,16 @@ void SongParser::iniParse() {
if (beg > end) throw std::runtime_error("Reversed notes");
if (drums) end = beg;
dur.push_back(Duration(beg, end));
+ durCount++;
}
}
+ // If a track has only 20 or less frets it's most likely b0rked.
+ // This number has been extracted from broken song tracks, but
+ // it is probably DIFFICULTYCOUNT * different_frets.
+ if (durCount <= 20) {
+ nm2.clear();
+ s.track_map.erase(name);
+ }
continue;
}
// Process vocal tracks
|