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:
@@ -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 )
|
||||||
|
|||||||
Reference in New Issue
Block a user