From 6ee884aed29f541b3e074fb07967819b94ffeff6 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Fri, 23 May 2003 01:14:43 +0000 Subject: [PATCH] Add support for #DISPLAYBPM in DWI and SM files --- stepmania/src/BPMDisplay.cpp | 22 ++++++++++++++++++++++ stepmania/src/BPMDisplay.h | 3 ++- stepmania/src/NotesLoaderDWI.cpp | 18 ++++++++++++++++++ stepmania/src/NotesLoaderSM.cpp | 16 ++++++++++++++++ stepmania/src/NotesWriterDWI.cpp | 15 +++++++++++++++ stepmania/src/NotesWriterSM.cpp | 16 ++++++++++++++++ stepmania/src/ScreenGameplay.cpp | 5 ++--- stepmania/src/ScreenSelectMusic.cpp | 4 +--- stepmania/src/Song.cpp | 7 +++++-- stepmania/src/song.h | 19 +++++++++++-------- 10 files changed, 108 insertions(+), 17 deletions(-) diff --git a/stepmania/src/BPMDisplay.cpp b/stepmania/src/BPMDisplay.cpp index 4de75d95c1..9b8464d1cb 100644 --- a/stepmania/src/BPMDisplay.cpp +++ b/stepmania/src/BPMDisplay.cpp @@ -167,3 +167,25 @@ void BPMDisplay::NoBPM() m_textBPM.SetDiffuse( NORMAL_COLOR ); m_sprLabel.SetDiffuse( NORMAL_COLOR ); } + +void BPMDisplay::SetBPM( const Song* pSong ) +{ + ASSERT( pSong ); + switch( pSong->m_DisplayBPMType ) + { + case Song::DISPLAY_ACTUAL: + { + float fMinBPM, fMaxBPM; + pSong->GetActualBPM( fMinBPM, fMaxBPM ); + SetBPMRange( fMinBPM, fMaxBPM ); + } + break; + case Song::DISPLAY_SPECIFIED: + SetBPMRange( pSong->m_fDisplayBPMMin, pSong->m_fDisplayBPMMax ); + break; + case Song::DISPLAY_RANDOM: + break; + default: + ASSERT(0); + } +} diff --git a/stepmania/src/BPMDisplay.h b/stepmania/src/BPMDisplay.h index 33a08121b0..0e6be24e61 100644 --- a/stepmania/src/BPMDisplay.h +++ b/stepmania/src/BPMDisplay.h @@ -16,7 +16,7 @@ #include "ActorFrame.h" #include "BitmapText.h" #include "Quad.h" - +class Song; class BPMDisplay : public ActorFrame { @@ -24,6 +24,7 @@ public: BPMDisplay(); virtual void Update( float fDeltaTime ); void SetBPMRange( float fLowBPM, float fHighBPM ); + void SetBPM( const Song* pSong ); void CycleRandomly(); void NoBPM(); diff --git a/stepmania/src/NotesLoaderDWI.cpp b/stepmania/src/NotesLoaderDWI.cpp index cabdf20d0d..ae852f5574 100644 --- a/stepmania/src/NotesLoaderDWI.cpp +++ b/stepmania/src/NotesLoaderDWI.cpp @@ -311,6 +311,24 @@ bool DWILoader::LoadFromDWIFile( CString sPath, Song &out ) else if( 0==stricmp(sValueName,"BPM") ) out.AddBPMSegment( BPMSegment(0, (float)atof(sParams[1])) ); + else if( 0==stricmp(sValueName,"DISPLAYBPM") ) + { + // #DISPLAYBPM:[xxx..xxx]|[xxx]|[*]; + if( sscanf( sParams[1], "%f..%f", &out.m_fDisplayBPMMin, &out.m_fDisplayBPMMax ) == 2 ) + { + out.m_DisplayBPMType = Song::DISPLAY_SPECIFIED; + } + else if( sscanf( sParams[1], "%f", &out.m_fDisplayBPMMin ) != 1 ) + { + out.m_DisplayBPMType = Song::DISPLAY_SPECIFIED; + out.m_fDisplayBPMMax = out.m_fDisplayBPMMin; + } + else + { + out.m_DisplayBPMType = Song::DISPLAY_RANDOM; + } + } + else if( 0==stricmp(sValueName,"GAP") ) // the units of GAP is 1/1000 second out.m_fBeat0OffsetInSeconds = -atoi( sParams[1] ) / 1000.0f; diff --git a/stepmania/src/NotesLoaderSM.cpp b/stepmania/src/NotesLoaderSM.cpp index 547e01c2fc..de9e5a3863 100644 --- a/stepmania/src/NotesLoaderSM.cpp +++ b/stepmania/src/NotesLoaderSM.cpp @@ -147,6 +147,22 @@ bool SMLoader::LoadFromSMFile( CString sPath, Song &out ) else if( 0==stricmp(sValueName,"SAMPLELENGTH") ) out.m_fMusicSampleLengthSeconds = TimeToSeconds( sParams[1] ); + else if( 0==stricmp(sValueName,"DISPLAYBPM") ) + { + // #DISPLAYBPM:[xxx,xxx]|[xxx]|[*]; + if( sParams[1] == "*" ) + out.m_DisplayBPMType = Song::DISPLAY_RANDOM; + else + { + out.m_DisplayBPMType = Song::DISPLAY_SPECIFIED; + out.m_fDisplayBPMMin = (float)atof( sParams[1] ); + if( sParams[2].empty() ) + out.m_fDisplayBPMMax = out.m_fDisplayBPMMin; + else + out.m_fDisplayBPMMax = (float)atof( sParams[2] ); + } + } + else if( 0==stricmp(sValueName,"OFFSET") ) out.m_fBeat0OffsetInSeconds = (float)atof( sParams[1] ); diff --git a/stepmania/src/NotesWriterDWI.cpp b/stepmania/src/NotesWriterDWI.cpp index 7f9d53e757..7d270f3b84 100644 --- a/stepmania/src/NotesWriterDWI.cpp +++ b/stepmania/src/NotesWriterDWI.cpp @@ -229,6 +229,21 @@ bool NotesWriterDWI::Write( CString sPath, const Song &out ) fprintf( fp, "#SAMPLELENGTH:%.3f;\n", out.m_fMusicSampleLengthSeconds ); if( out.m_sCDTitleFile.size() ) fprintf( fp, "#CDTITLE:%s;\n", out.m_sCDTitleFile.c_str() ); + switch( out.m_DisplayBPMType ) + { + case Song::DISPLAY_ACTUAL: + // write nothing + break; + case Song::DISPLAY_SPECIFIED: + if( out.m_fDisplayBPMMin == out.m_fDisplayBPMMax ) + fprintf( fp, "#DISPLAYBPM:%.3f", out.m_fDisplayBPMMin ); + else + fprintf( fp, "#DISPLAYBPM:%.3f..%.3f", out.m_fDisplayBPMMin, out.m_fDisplayBPMMax ); + break; + case Song::DISPLAY_RANDOM: + fprintf( fp, "#DISPLAYBPM:*" ); + break; + } if( !out.m_StopSegments.empty() ) { diff --git a/stepmania/src/NotesWriterSM.cpp b/stepmania/src/NotesWriterSM.cpp index 182945871f..06d78c3e4e 100644 --- a/stepmania/src/NotesWriterSM.cpp +++ b/stepmania/src/NotesWriterSM.cpp @@ -25,6 +25,22 @@ void NotesWriterSM::WriteGlobalTags(FILE *fp, const Song &out) fprintf( fp, "#SAMPLESTART:%.3f;\n", out.m_fMusicSampleStartSeconds ); fprintf( fp, "#SAMPLELENGTH:%.3f;\n", out.m_fMusicSampleLengthSeconds ); fprintf( fp, "#SELECTABLE:" ); + switch( out.m_DisplayBPMType ) + { + case Song::DISPLAY_ACTUAL: + // write nothing + break; + case Song::DISPLAY_SPECIFIED: + if( out.m_fDisplayBPMMin == out.m_fDisplayBPMMax ) + fprintf( fp, "#DISPLAYBPM:%.3f", out.m_fDisplayBPMMin ); + else + fprintf( fp, "#DISPLAYBPM:%.3f,%.3f", out.m_fDisplayBPMMin, out.m_fDisplayBPMMax ); + break; + case Song::DISPLAY_RANDOM: + fprintf( fp, "#DISPLAYBPM:*" ); + break; + } + switch(out.m_SelectionDisplay) { default: ASSERT(0); /* fallthrough */ diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 97d9ce928c..510e68a67c 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -675,9 +675,8 @@ void ScreenGameplay::LoadNextSong() m_textSongTitle.SetText( GAMESTATE->m_pCurSong->m_sMainTitle ); /* XXX: set it to the current BPM, not the range */ - float fMinBPM, fMaxBPM; - GAMESTATE->m_pCurSong->GetMinMaxBPM( fMinBPM, fMaxBPM ); - m_BPMDisplay.SetBPMRange( fMinBPM, fMaxBPM ); + /* What does this comment mean? -Chris */ + m_BPMDisplay.SetBPM( GAMESTATE->m_pCurSong ); const bool bExtra = GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2(); const bool bReverse[NUM_PLAYERS] = { diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index ab3994b293..85d49f566d 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -824,9 +824,7 @@ void ScreenSelectMusic::AfterMusicChange() } else { - float fMinBPM, fMaxBPM; - pSong->GetMinMaxBPM( fMinBPM, fMaxBPM ); - m_BPMDisplay.SetBPMRange( fMinBPM, fMaxBPM ); + m_BPMDisplay.SetBPM( pSong ); } const CString CDTitlePath = pSong->HasCDTitle()? pSong->GetCDTitlePath():THEME->GetPathToG("ScreenSelectMusic fallback cdtitle"); diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index b2bcb3ce54..9393ea7d0e 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -91,6 +91,9 @@ Song::Song() m_fFirstBeat = -1; m_fLastBeat = -1; m_SelectionDisplay = SHOW_ALWAYS; + m_DisplayBPMType = DISPLAY_ACTUAL; + m_fDisplayBPMMin = 0; + m_fDisplayBPMMax = 0; } Song::~Song() @@ -1070,8 +1073,8 @@ void SortSongPointerArrayByDifficulty( vector &arraySongPointers ) bool CompareSongPointersByBPM(const Song *pSong1, const Song *pSong2) { float fMinBPM1, fMaxBPM1, fMinBPM2, fMaxBPM2; - pSong1->GetMinMaxBPM( fMinBPM1, fMaxBPM1 ); - pSong2->GetMinMaxBPM( fMinBPM2, fMaxBPM2 ); + pSong1->GetActualBPM( fMinBPM1, fMaxBPM1 ); + pSong2->GetActualBPM( fMinBPM2, fMaxBPM2 ); if( fMaxBPM1 < fMaxBPM2 ) return true; diff --git a/stepmania/src/song.h b/stepmania/src/song.h index 419f3efe4e..e07f06cc50 100644 --- a/stepmania/src/song.h +++ b/stepmania/src/song.h @@ -141,6 +141,9 @@ public: float GetLastBeat() const; float m_fMusicSampleStartSeconds; float m_fMusicSampleLengthSeconds; + enum { DISPLAY_ACTUAL, DISPLAY_SPECIFIED, DISPLAY_RANDOM } m_DisplayBPMType; + int m_fDisplayBPMMin; + int m_fDisplayBPMMax; // if a range, then Min != Max float GetMusicStartBeat() const; @@ -175,17 +178,17 @@ public: void AddBackgroundChange( BackgroundChange seg ); void AddLyricSegment( LyricSegment seg ); - void GetMinMaxBPM( float &fMinBPM, float &fMaxBPM ) const + void GetActualBPM( float &fMinBPMOut, float &fMaxBPMOut ) const { - fMaxBPM = 0; - fMinBPM = 100000; // inf + fMaxBPMOut = 0; + fMinBPMOut = 100000; // inf for( unsigned i=0; i fBeat ) break; return m_BPMSegments[i].m_fBPM; - }; + } BPMSegment& GetBPMSegmentAtBeat( float fBeat ) { unsigned i; @@ -209,7 +212,7 @@ public: if( m_BackgroundChanges[i+1].m_fStartBeat > fBeat ) break; return m_BackgroundChanges[i].m_sBGName; - }; + } void GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const; float GetBeatFromElapsedTime( float fElapsedTime ) const // shortcut for places that care only about the beat {