move autogen into NoteDataUtil
This commit is contained in:
@@ -758,134 +758,6 @@ void NoteData::LoadTransformed( const NoteData* pOriginal, int iNewNumTracks, co
|
||||
m_AttackMap = Original.GetAttackMap();
|
||||
}
|
||||
|
||||
void NoteData::LoadOverlapped( const NoteData* pOriginal, int iNewNumTracks )
|
||||
{
|
||||
SetNumTracks( iNewNumTracks );
|
||||
|
||||
NoteData in;
|
||||
in.To4s( *pOriginal );
|
||||
|
||||
/* Keep track of the last source track that put a tap into each destination track,
|
||||
* and the row of that tap. Then, if two rows are trying to put taps into the
|
||||
* same row within the shift threshold, shift the newcomer source row. */
|
||||
int LastSourceTrack[MAX_NOTE_TRACKS];
|
||||
int LastSourceRow[MAX_NOTE_TRACKS];
|
||||
int DestRow[MAX_NOTE_TRACKS];
|
||||
|
||||
for( unsigned tr = 0; tr < MAX_NOTE_TRACKS; ++tr )
|
||||
{
|
||||
LastSourceTrack[tr] = -1;
|
||||
LastSourceRow[tr] = -9999;
|
||||
DestRow[tr] = tr;
|
||||
wrap( DestRow[tr], iNewNumTracks );
|
||||
}
|
||||
|
||||
const int ShiftThreshold = BeatToNoteRow(1);
|
||||
|
||||
const int iLastRow = in.GetMaxRow();
|
||||
for( int row = 0; row < iLastRow; ++row )
|
||||
{
|
||||
for ( int i = 0; i < in.GetNumTracks(); i++ )
|
||||
{
|
||||
const int iTrackFrom = i;
|
||||
int &iTrackTo = DestRow[i];
|
||||
|
||||
const TapNote iStepFrom = in.m_TapNotes[iTrackFrom][row];
|
||||
if( iStepFrom == TAP_EMPTY )
|
||||
continue;
|
||||
|
||||
if( LastSourceTrack[iTrackTo] != iTrackFrom &&
|
||||
row - LastSourceRow[iTrackTo] < ShiftThreshold )
|
||||
{
|
||||
/* This destination track is in use by a different source track. Use the
|
||||
* least-recently-used track. */
|
||||
for( int DestTrack = 0; DestTrack < iNewNumTracks; ++DestTrack )
|
||||
if( LastSourceRow[DestTrack] < LastSourceRow[iTrackTo] )
|
||||
iTrackTo = DestTrack;
|
||||
}
|
||||
|
||||
/* If it's still in use, then we just don't have an available track. */
|
||||
if( LastSourceTrack[iTrackTo] != iTrackFrom &&
|
||||
row - LastSourceRow[iTrackTo] < ShiftThreshold )
|
||||
continue;
|
||||
|
||||
LastSourceTrack[iTrackTo] = iTrackFrom;
|
||||
LastSourceRow[iTrackTo] = row;
|
||||
SetTapNote( iTrackTo, row, iStepFrom );
|
||||
}
|
||||
}
|
||||
|
||||
Convert4sToHoldNotes();
|
||||
}
|
||||
|
||||
void NoteData::LoadTransformedSlidingWindow( const NoteData* pOriginal, int iNewNumTracks )
|
||||
{
|
||||
// reset all notes
|
||||
Init();
|
||||
|
||||
if( pOriginal->GetNumTracks() > iNewNumTracks )
|
||||
{
|
||||
/* Use a different algorithm for reducing tracks. */
|
||||
LoadOverlapped( pOriginal, iNewNumTracks );
|
||||
return;
|
||||
}
|
||||
|
||||
NoteData Original;
|
||||
Original.To4s( *pOriginal );
|
||||
|
||||
Config(*pOriginal);
|
||||
m_iNumTracks = iNewNumTracks;
|
||||
|
||||
|
||||
int iCurTrackOffset = 0;
|
||||
int iTrackOffsetMin = 0;
|
||||
int iTrackOffsetMax = abs( iNewNumTracks - Original.m_iNumTracks );
|
||||
int bOffsetIncreasing = true;
|
||||
|
||||
int iLastRow = Original.GetLastRow();
|
||||
for( int r=0; r<=iLastRow; )
|
||||
{
|
||||
// copy notes in this measure
|
||||
for( int t=0; t<Original.m_iNumTracks; t++ )
|
||||
{
|
||||
int iOldTrack = t;
|
||||
int iNewTrack = (iOldTrack + iCurTrackOffset) % iNewNumTracks;
|
||||
this->SetTapNote(iNewTrack, r, Original.GetTapNote(iOldTrack, r));
|
||||
}
|
||||
r++;
|
||||
|
||||
if( r % (ROWS_PER_MEASURE*4) == 0 ) // adjust sliding window every 4 measures
|
||||
{
|
||||
// See if there is a hold crossing the beginning of this measure
|
||||
bool bHoldCrossesThisMeasure = false;
|
||||
|
||||
if( r )
|
||||
for( int t=0; t<=Original.m_iNumTracks; t++ )
|
||||
{
|
||||
if( Original.GetTapNote(t, r) == TAP_HOLD &&
|
||||
Original.GetTapNote(t, r-1) == TAP_HOLD)
|
||||
{
|
||||
bHoldCrossesThisMeasure = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// adjust offset
|
||||
if( !bHoldCrossesThisMeasure )
|
||||
{
|
||||
iCurTrackOffset += bOffsetIncreasing ? 1 : -1;
|
||||
if( iCurTrackOffset == iTrackOffsetMin || iCurTrackOffset == iTrackOffsetMax )
|
||||
bOffsetIncreasing ^= true;
|
||||
CLAMP( iCurTrackOffset, iTrackOffsetMin, iTrackOffsetMax );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Convert4sToHoldNotes();
|
||||
|
||||
m_AttackMap = Original.GetAttackMap();
|
||||
}
|
||||
|
||||
void NoteData::PadTapNotes(int rows)
|
||||
{
|
||||
int needed = rows - m_TapNotes[0].size() + 1;
|
||||
|
||||
Reference in New Issue
Block a user