From 6ad6b3656e5d99ecdf60823fce28fb1cacbd0fbc Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 7 Sep 2003 22:28:46 +0000 Subject: [PATCH] add tempo compress/expand in editor --- stepmania/src/NoteDataUtil.cpp | 43 ++++++++++++++++ stepmania/src/NoteDataUtil.h | 5 ++ stepmania/src/ScreenEdit.cpp | 93 ++++++++++++++++------------------ stepmania/src/ScreenEdit.h | 4 +- stepmania/src/Song.cpp | 21 ++++++++ stepmania/src/song.h | 1 + 6 files changed, 116 insertions(+), 51 deletions(-) diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 0a7479ebc3..5fa8c9738f 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -980,3 +980,46 @@ void NoteDataUtil::TransformNoteData( NoteData &nd, PlayerOptions &po, StepsType } } +void NoteDataUtil::Scale( NoteData &nd, float fScale ) +{ + ASSERT( fScale > 0 ); + + NoteData temp; + temp.CopyAll( &nd ); + nd.ClearAll(); + + for( int r=0; r<=temp.GetLastRow(); r++ ) + { + for( int t=0; t 0 ) // add blank rows + iPasteAtRow += BeatToNoteRow( fBeatsToShift ); + else // delete rows + iTakeFromRow += BeatToNoteRow( -fBeatsToShift ); + + temp.CopyRange( &nd, iTakeFromRow, nd.GetLastRow() ); + nd.ClearRange( min(iTakeFromRow,iPasteAtRow), nd.GetLastRow() ); + nd.CopyRange( &temp, 0, temp.GetLastRow(), iPasteAtRow ); +} \ No newline at end of file diff --git a/stepmania/src/NoteDataUtil.h b/stepmania/src/NoteDataUtil.h index 0574be97b6..f413cadd76 100644 --- a/stepmania/src/NoteDataUtil.h +++ b/stepmania/src/NoteDataUtil.h @@ -77,6 +77,11 @@ namespace NoteDataUtil void EliminateNonPassingTaps( NoteData &in, int row, const bool bValidMask[] ); void TransformNoteData( NoteData &nd, PlayerOptions &po, StepsType st ); + + void Scale( NoteData &nd, float fScale ); + + // If fBeatsToShift>0, add blank rows. If fBeatsToShift<0, delete rows + void ShiftRows( NoteData &nd, float fStartBeat, float fBeatsToShift ); }; #endif diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 7ce4f9c87b..d54e8a0b92 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -156,6 +156,7 @@ Menu g_AreaMenu MenuRow( "Turn", true, 0, "Left","Right","Mirror","Shuffle","Super Shuffle" ), MenuRow( "Transform", true, 0, "Little","Wide","Big","Quick","Skippy" ), MenuRow( "Alter", true, 0, "Backwards","Swap Sides","Copy Left To Right","Copy Right To Left","Clear Left","Clear Right","Collapse To One","Shift Left","Shift Right" ), + MenuRow( "Tempo", true, 0, "Compress 2x","Expand 2x" ), MenuRow( "Play selection", true ), MenuRow( "Record in selection", true ), MenuRow( "Insert beat and shift down", true ), @@ -569,6 +570,7 @@ void ScreenEdit::Input( const DeviceInput& DeviceI, const InputEventType type, c } } + void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) { if( DeviceI.device != DEVICE_KEYBOARD ) @@ -826,6 +828,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ g_AreaMenu.rows[turn].enabled = bAreaSelected; g_AreaMenu.rows[transform].enabled = bAreaSelected; g_AreaMenu.rows[alter].enabled = bAreaSelected; + g_AreaMenu.rows[tempo].enabled = bAreaSelected; g_AreaMenu.rows[play].enabled = bAreaSelected; g_AreaMenu.rows[record].enabled = bAreaSelected; SCREENMAN->MiniMenu( &g_AreaMenu, SM_BackFromAreaMenu ); @@ -909,26 +912,9 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ case IET_SLOW_REPEAT: fDeltaBPM *= 10; break; case IET_FAST_REPEAT: fDeltaBPM *= 40; break; } + float fNewBPM = fBPM + fDeltaBPM; - - unsigned i; - for( i=0; im_BPMSegments.size(); i++ ) - if( m_pSong->m_BPMSegments[i].m_fStartBeat == GAMESTATE->m_fSongBeat ) - break; - - if( i == m_pSong->m_BPMSegments.size() ) // there is no BPMSegment at the current beat - { - // create a new BPMSegment - m_pSong->AddBPMSegment( BPMSegment(GAMESTATE->m_fSongBeat, fNewBPM) ); - } - else // BPMSegment being modified is m_BPMSegments[i] - { - if( i > 0 && fabsf(m_pSong->m_BPMSegments[i-1].m_fBPM - fNewBPM) < 0.009f ) - m_pSong->m_BPMSegments.erase( m_pSong->m_BPMSegments.begin()+i, - m_pSong->m_BPMSegments.begin()+i+1); - else - m_pSong->m_BPMSegments[i].m_fBPM = fNewBPM; - } + m_pSong->SetBPMAtBeat( GAMESTATE->m_fSongBeat, fNewBPM ); } break; case SDLK_F9: @@ -1501,8 +1487,6 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) break; case transform: { -// HandleAreaMenuChoice( cut, NULL ); - float fBeginBeat = m_NoteFieldEdit.m_fBeginMarker; float fEndBeat = m_NoteFieldEdit.m_fEndMarker; TransformType tt = (TransformType)iAnswers[c]; @@ -1518,8 +1502,6 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) // bake in the additions NoteDataUtil::ConvertAdditionsToRegular( m_NoteFieldEdit ); - -// HandleAreaMenuChoice( paste_at_begin_marker, NULL ); } break; case alter: @@ -1544,6 +1526,43 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) HandleAreaMenuChoice( paste_at_begin_marker, NULL ); } break; + case tempo: + { + HandleAreaMenuChoice( cut, NULL ); + + AlterType at = (AlterType)iAnswers[c]; + float fScale = -1; + switch( at ) + { + case compress_2x: fScale = 0.5f; break; + case expand_2x: fScale = 2; break; + default: ASSERT(0); + } + + switch( at ) + { + case compress_2x: NoteDataUtil::Scale( m_Clipboard, fScale ); break; + case expand_2x: NoteDataUtil::Scale( m_Clipboard, fScale ); break; + default: ASSERT(0); + } + + float fOldClipboardEndBeat = m_NoteFieldEdit.m_fEndMarker; + float fOldClipboardBeats = m_NoteFieldEdit.m_fEndMarker - m_NoteFieldEdit.m_fBeginMarker; + float fNewClipboardBeats = fOldClipboardBeats * fScale; + float fDeltaBeats = fNewClipboardBeats - fOldClipboardBeats; + float fNewClipboardEndBeat = m_NoteFieldEdit.m_fBeginMarker + fNewClipboardBeats; + NoteDataUtil::ShiftRows( m_NoteFieldEdit, m_NoteFieldEdit.m_fBeginMarker, fDeltaBeats ); + + HandleAreaMenuChoice( paste_at_begin_marker, NULL ); + + m_NoteFieldEdit.m_fEndMarker = fNewClipboardEndBeat; + + float fOldBPM = m_pSong->GetBPMAtBeat( m_NoteFieldEdit.m_fBeginMarker ); + float fNewBPM = fOldBPM * fScale; + m_pSong->SetBPMAtBeat( m_NoteFieldEdit.m_fBeginMarker, fNewBPM ); + m_pSong->SetBPMAtBeat( fNewClipboardEndBeat, fOldBPM ); + } + break; case play: { ASSERT( m_NoteFieldEdit.m_fBeginMarker!=-1 && m_NoteFieldEdit.m_fEndMarker!=-1 ); @@ -1596,34 +1615,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) } break; case insert_and_shift: - { - NoteData temp; - temp.SetNumTracks( m_NoteFieldEdit.GetNumTracks() ); - int iTakeFromRow=0; - int iPasteAtRow; - - iTakeFromRow = BeatToNoteRow( GAMESTATE->m_fSongBeat ); - iPasteAtRow = BeatToNoteRow( GAMESTATE->m_fSongBeat+1 ); - - temp.CopyRange( &m_NoteFieldEdit, iTakeFromRow, m_NoteFieldEdit.GetLastRow() ); - m_NoteFieldEdit.ClearRange( min(iTakeFromRow,iPasteAtRow), m_NoteFieldEdit.GetLastRow() ); - m_NoteFieldEdit.CopyRange( &temp, 0, temp.GetLastRow(), iPasteAtRow ); - } + NoteDataUtil::ShiftRows( m_NoteFieldEdit, GAMESTATE->m_fSongBeat, 1 ); break; case delete_and_shift: - { - NoteData temp; - temp.SetNumTracks( m_NoteFieldEdit.GetNumTracks() ); - int iTakeFromRow=0; - int iPasteAtRow; - - iTakeFromRow = BeatToNoteRow( GAMESTATE->m_fSongBeat+1 ); - iPasteAtRow = BeatToNoteRow( GAMESTATE->m_fSongBeat ); - - temp.CopyRange( &m_NoteFieldEdit, iTakeFromRow, m_NoteFieldEdit.GetLastRow() ); - m_NoteFieldEdit.ClearRange( min(iTakeFromRow,iPasteAtRow), m_NoteFieldEdit.GetLastRow() ); - m_NoteFieldEdit.CopyRange( &temp, 0, temp.GetLastRow(), iPasteAtRow ); - } + NoteDataUtil::ShiftRows( m_NoteFieldEdit, GAMESTATE->m_fSongBeat, -1 ); break; default: ASSERT(0); diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 6417305c64..1764ba83eb 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -107,8 +107,6 @@ public: player_options, song_options, edit_song_info, -// edit_bpm, -// edit_stop, edit_bg_change, play_preview_music, exit, @@ -126,6 +124,7 @@ public: turn, transform, alter, + tempo, play, record, insert_and_shift, @@ -136,6 +135,7 @@ public: enum TurnType { left, right, mirror, shuffle, super_shuffle, NUM_TURN_TYPES }; enum TransformType { little, wide, big, quick, skippy, NUM_TRANSFORM_TYPES }; enum AlterType { backwards, swap_sides, copy_left_to_right, copy_right_to_left, clear_left, clear_right, collapse_to_one, shift_left, shift_right, NUM_ALTER_TYPES }; + enum TempoType { compress_2x, expand_2x, NUM_TEMPO_TYPES }; enum EditNotesStatisticsChoice { difficulty, diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 18a66c9631..d1395c8ff4 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -130,6 +130,27 @@ void Song::AddBPMSegment( BPMSegment seg ) SortBPMSegmentsArray( m_BPMSegments ); } +void Song::SetBPMAtBeat( float fBeat, float fBPM ) +{ + unsigned i; + for( i=0; i 0 && fabsf(m_BPMSegments[i-1].m_fBPM - fBPM) < 0.009f ) + m_BPMSegments.erase( m_BPMSegments.begin()+i, + m_BPMSegments.begin()+i+1); + else + m_BPMSegments[i].m_fBPM = fBPM; + } +} void Song::AddStopSegment( StopSegment seg ) { diff --git a/stepmania/src/song.h b/stepmania/src/song.h index 2f305d894a..ee38e33455 100644 --- a/stepmania/src/song.h +++ b/stepmania/src/song.h @@ -210,6 +210,7 @@ public: break; return m_BPMSegments[i].m_fBPM; } + void SetBPMAtBeat( float fBeat, float fBPM ); BPMSegment& GetBPMSegmentAtBeat( float fBeat ) { unsigned i;