Try a new autogen (pump->dance) experiment.

This commit is contained in:
Glenn Maynard
2003-12-02 22:55:55 +00:00
parent b137b81f34
commit 70491c724d
+40 -19
View File
@@ -599,36 +599,57 @@ void NoteData::LoadTransformed( const NoteData* pOriginal, int iNewNumTracks, co
void NoteData::LoadOverlapped( const NoteData* pOriginal, int iNewNumTracks ) void NoteData::LoadOverlapped( const NoteData* pOriginal, int iNewNumTracks )
{ {
// ??? Something is not right here - either we're not being called,
// or we're not working correctly at all. :-/
SetNumTracks( iNewNumTracks ); SetNumTracks( iNewNumTracks );
NoteData in; NoteData in;
in.To4s( *pOriginal ); in.To4s( *pOriginal );
const int iLastRow = in.GetMaxRow(); /* Keep track of the last source track that put a tap into each destination track,
for ( int i = 0; i < in.GetNumTracks(); i++ ) * 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. */
const int iTrackTo = i % iNewNumTracks; int LastSourceTrack[MAX_NOTE_TRACKS];
const int iTrackFrom = i; 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 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]; const TapNote iStepFrom = in.m_TapNotes[iTrackFrom][row];
/* Hold notes always take precedence: don't split holds. */
if( GetTapNote(iTrackTo, row) == TAP_HOLD )
continue;
// Whoever rewrote the function:
// This transfers EMPTY steps over as well...
// ...so it's been fixed. Should I define operator| for
// TapNote so that it combines tracks? :-P
if( iStepFrom == TAP_EMPTY ) if( iStepFrom == TAP_EMPTY )
continue; 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 ); SetTapNote( iTrackTo, row, iStepFrom );
} }
} }
@@ -643,7 +664,7 @@ void NoteData::LoadTransformedSlidingWindow( const NoteData* pOriginal, int iNew
if( pOriginal->GetNumTracks() > iNewNumTracks ) if( pOriginal->GetNumTracks() > iNewNumTracks )
{ {
/* Use a ifferent algorithm for reducing tracks. */ /* Use a different algorithm for reducing tracks. */
LoadOverlapped( pOriginal, iNewNumTracks ); LoadOverlapped( pOriginal, iNewNumTracks );
return; return;
} }