implement NoteDataUtil::LoadTransformedSlidingWindow (not

NoteDataUtil::LoadOverlapped) without 4s.  Slight change of behavior:
if a hold note overlaps the spot where we want to shift the offset, instead
of leaving the offset where it is for another full four measures, we'll try
to change it again at the next measure change.  This reduces the cases
where hold notes can prevent the offset from changing for long periods.
This commit is contained in:
Glenn Maynard
2005-01-23 18:21:30 +00:00
parent 5da9c848d6
commit 64714a0566
+19 -15
View File
@@ -265,7 +265,7 @@ void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &o
} }
NoteData Original; NoteData Original;
Original.To4s( in ); Original.To2sAnd3s( in );
out.Config( in ); out.Config( in );
out.SetNumTracks( iNewNumTracks ); out.SetNumTracks( iNewNumTracks );
@@ -277,28 +277,22 @@ void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &o
int bOffsetIncreasing = true; int bOffsetIncreasing = true;
int iLastMeasure = 0; int iLastMeasure = 0;
int iMeasuresSinceChange = 0;
FOREACH_NONEMPTY_ROW_ALL_TRACKS( Original, r ) FOREACH_NONEMPTY_ROW_ALL_TRACKS( Original, r )
{ {
// copy notes in this measure const int iMeasure = r / ROWS_PER_MEASURE;
for( int t=0; t<Original.GetNumTracks(); t++ ) if( iMeasure != iLastMeasure )
{ ++iMeasuresSinceChange;
int iOldTrack = t;
int iNewTrack = (iOldTrack + iCurTrackOffset) % iNewNumTracks;
const TapNote &tn = Original.GetTapNote( iOldTrack, r );
out.SetTapNote( iNewTrack, r, tn );
}
const int iMeasure = (r+1) / ROWS_PER_MEASURE; if( iMeasure != iLastMeasure && iMeasuresSinceChange >= 4 ) // adjust sliding window every 4 measures at most
if( iMeasure / 4 != iLastMeasure / 4 ) // adjust sliding window every 4 measures
{ {
// See if there is a hold crossing the beginning of this measure // See if there is a hold crossing the beginning of this measure
bool bHoldCrossesThisMeasure = false; bool bHoldCrossesThisMeasure = false;
if( r )
for( int t=0; t<Original.GetNumTracks(); t++ ) for( int t=0; t<Original.GetNumTracks(); t++ )
{ {
if( Original.GetTapNote(t,r).type == TapNote::hold && if( Original.IsHoldNoteAtBeat( t, r-1 ) &&
Original.GetTapNote(t,r-1).type == TapNote::hold ) Original.IsHoldNoteAtBeat( t, r ) )
{ {
bHoldCrossesThisMeasure = true; bHoldCrossesThisMeasure = true;
break; break;
@@ -308,6 +302,7 @@ void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &o
// adjust offset // adjust offset
if( !bHoldCrossesThisMeasure ) if( !bHoldCrossesThisMeasure )
{ {
iMeasuresSinceChange = 0;
iCurTrackOffset += bOffsetIncreasing ? 1 : -1; iCurTrackOffset += bOffsetIncreasing ? 1 : -1;
if( iCurTrackOffset == iTrackOffsetMin || iCurTrackOffset == iTrackOffsetMax ) if( iCurTrackOffset == iTrackOffsetMin || iCurTrackOffset == iTrackOffsetMax )
bOffsetIncreasing ^= true; bOffsetIncreasing ^= true;
@@ -316,9 +311,18 @@ void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &o
} }
iLastMeasure = iMeasure; iLastMeasure = iMeasure;
// copy notes in this measure
for( int t=0; t<Original.GetNumTracks(); t++ )
{
int iOldTrack = t;
int iNewTrack = (iOldTrack + iCurTrackOffset) % iNewNumTracks;
const TapNote &tn = Original.GetTapNote( iOldTrack, r );
out.SetTapNote( iNewTrack, r, tn );
}
} }
out.Convert4sToHoldNotes(); out.Convert2sAnd3sToHoldNotes();
} }
void NoteDataUtil::LoadOverlapped( const NoteData &input, NoteData &out, int iNewNumTracks ) void NoteDataUtil::LoadOverlapped( const NoteData &input, NoteData &out, int iNewNumTracks )