[timing] Some more stuff.

Need dinner though.
This commit is contained in:
Jason Felds
2011-07-14 19:52:37 -04:00
parent 2c85e902b4
commit 4f490c3d3b
+53 -39
View File
@@ -44,6 +44,8 @@ void TimingData::AddSegment(TimingSegmentType tst, TimingSegment * seg)
segs.insert(upper_bound(segs.begin(), segs.end(), seg), seg); segs.insert(upper_bound(segs.begin(), segs.end(), seg), seg);
} }
// TODO: Find a way to combine all of these SetAtRows to one.
/* Change an existing BPM segment, merge identical segments together or insert a new one. */ /* Change an existing BPM segment, merge identical segments together or insert a new one. */
void TimingData::SetBPMAtRow( int iNoteRow, float fBPM ) void TimingData::SetBPMAtRow( int iNoteRow, float fBPM )
{ {
@@ -58,71 +60,78 @@ void TimingData::SetBPMAtRow( int iNoteRow, float fBPM )
{ {
// There is no BPMSegment at the specified beat. If the BPM being set differs // There is no BPMSegment at the specified beat. If the BPM being set differs
// from the last BPMSegment's BPM, create a new BPMSegment. // from the last BPMSegment's BPM, create a new BPMSegment.
if( i == 0 || fabsf(m_BPMSegments[i-1].GetBPM() - fBPM) > 1e-5f ) if (i == 0 ||
AddBPMSegment( BPMSegment(iNoteRow, fBPM) ); fabsf(static_cast<BPMSegment *>(bpms[i-1])->GetBPM() - fBPM) > 1e-5f )
AddSegment( SEGMENT_BPM, new BPMSegment(iNoteRow, fBPM) );
} }
else // BPMSegment being modified is m_BPMSegments[i] else // BPMSegment being modified is m_BPMSegments[i]
{ {
if( i > 0 && fabsf(m_BPMSegments[i-1].GetBPM() - fBPM) < 1e-5f ) if (i > 0 &&
m_BPMSegments.erase( m_BPMSegments.begin()+i, m_BPMSegments.begin()+i+1 ); fabsf(static_cast<BPMSegment *>(bpms[i-1])->GetBPM() - fBPM) < 1e-5f )
bpms.erase( bpms.begin()+i, bpms.begin()+i+1 );
else else
m_BPMSegments[i].SetBPM(fBPM); bs->SetBPM(fBPM);
} }
} }
void TimingData::SetStopAtRow( int iRow, float fSeconds, bool bDelay ) void TimingData::SetStopAtRow( int iRow, float fSeconds, bool bDelay )
{ {
unsigned i; unsigned i;
for( i=0; i<m_StopSegments.size(); i++ ) vector<TimingSegment *> &stops = this->allTimingSegments[SEGMENT_STOP_DELAY];
if( m_StopSegments[i].GetRow() == iRow && m_StopSegments[i].GetDelay() == bDelay ) for( i=0; i<stops.size(); i++ )
if (stops[i]->GetRow() == iRow &&
static_cast<StopSegment *>(stops[i])->GetDelay() == bDelay )
break; break;
if( i == m_StopSegments.size() ) // there is no Stop/Delay Segment at the current beat StopSegment *ss = static_cast<StopSegment *>(stops[i]);
if( i == stops.size() ) // there is no Stop/Delay Segment at the current beat
{ {
// create a new StopSegment // create a new StopSegment
if( fSeconds > 0 ) if( fSeconds > 0 )
{ {
AddStopSegment( StopSegment(iRow, fSeconds, bDelay) ); AddSegment( SEGMENT_STOP_DELAY, new StopSegment(iRow, fSeconds, bDelay) );
} }
} }
else // StopSegment being modified is m_StopSegments[i] else // StopSegment being modified is m_StopSegments[i]
{ {
if( fSeconds > 0 ) if( fSeconds > 0 )
{ {
m_StopSegments[i].SetPause(fSeconds); ss->SetPause(fSeconds);
} }
else else
m_StopSegments.erase( m_StopSegments.begin()+i, m_StopSegments.begin()+i+1 ); stops.erase( stops.begin()+i, stops.begin()+i+1 );
} }
} }
void TimingData::SetTimeSignatureAtRow( int iRow, int iNumerator, int iDenominator ) void TimingData::SetTimeSignatureAtRow( int iRow, int iNumerator, int iDenominator )
{ {
unsigned i; unsigned i;
for( i = 0; i < m_vTimeSignatureSegments.size(); i++ ) vector<TimingSegment *> &tSigs = this->allTimingSegments[SEGMENT_TIME_SIG];
for( i = 0; i < tSigs.size(); i++ )
{ {
if( m_vTimeSignatureSegments[i].GetRow() >= iRow) if( tSigs[i]->GetRow() >= iRow)
break; // We found our segment. break; // We found our segment.
} }
if ( i == m_vTimeSignatureSegments.size() || m_vTimeSignatureSegments[i].GetRow() != iRow ) TimeSignatureSegment *ts = static_cast<TimeSignatureSegment *>(tSigs[i]);
if ( i == tSigs.size() || ts->GetRow() != iRow )
{ {
// No specific segmeent here: place one if it differs. // No specific segment here: place one if it differs.
if( i == 0 || if (i == 0 ||
( m_vTimeSignatureSegments[i-1].GetNum() != iNumerator (static_cast<TimeSignatureSegment *>(tSigs[i-1])->GetNum() != iNumerator ||
|| m_vTimeSignatureSegments[i-1].GetDen() != iDenominator ) ) static_cast<TimeSignatureSegment *>(tSigs[i-1])->GetDen() != iDenominator ) )
AddTimeSignatureSegment( TimeSignatureSegment(iRow, iNumerator, iDenominator) ); AddSegment( SEGMENT_TIME_SIG, new TimeSignatureSegment(iRow, iNumerator, iDenominator) );
} }
else // TimeSignatureSegment being modified is m_vTimeSignatureSegments[i] else // TimeSignatureSegment being modified is m_vTimeSignatureSegments[i]
{ {
if( i > 0 && m_vTimeSignatureSegments[i-1].GetNum() == iNumerator if (i > 0 &&
&& m_vTimeSignatureSegments[i-1].GetDen() == iDenominator ) static_cast<TimeSignatureSegment *>(tSigs[i-1])->GetNum() == iNumerator &&
m_vTimeSignatureSegments.erase( m_vTimeSignatureSegments.begin()+i, static_cast<TimeSignatureSegment *>(tSigs[i-1])->GetDen() == iDenominator )
m_vTimeSignatureSegments.begin()+i+1 ); tSigs.erase( tSigs.begin()+i, tSigs.begin()+i+1 );
else else
{ {
m_vTimeSignatureSegments[i].SetNum(iNumerator); ts->SetNum(iNumerator);
m_vTimeSignatureSegments[i].SetDen(iDenominator); ts->SetDen(iDenominator);
} }
} }
} }
@@ -144,25 +153,26 @@ void TimingData::SetTimeSignatureDenominatorAtRow( int iRow, int iDenominator )
void TimingData::SetWarpAtRow( int iRow, float fNew ) void TimingData::SetWarpAtRow( int iRow, float fNew )
{ {
unsigned i; unsigned i;
for( i=0; i<m_WarpSegments.size(); i++ ) vector<TimingSegment *> &warps = this->allTimingSegments[SEGMENT_WARP];
if( m_WarpSegments[i].GetRow() == iRow ) for( i=0; i<warps.size(); i++ )
if( warps[i]->GetRow() == iRow )
break; break;
bool valid = iRow > 0 && fNew > 0; bool valid = iRow > 0 && fNew > 0;
if( i == m_WarpSegments.size() ) if( i == warps.size() )
{ {
if( valid ) if( valid )
{ {
AddWarpSegment( WarpSegment(iRow, fNew) ); AddSegment( SEGMENT_WARP, new WarpSegment(iRow, fNew) );
} }
} }
else else
{ {
if( valid ) if( valid )
{ {
m_WarpSegments[i].SetLength(fNew); static_cast<WarpSegment *>(warps[i])->SetLength(fNew);
} }
else else
m_WarpSegments.erase( m_WarpSegments.begin()+i, m_WarpSegments.begin()+i+1 ); warps.erase( warps.begin()+i, warps.begin()+i+1 );
} }
} }
@@ -170,22 +180,26 @@ void TimingData::SetWarpAtRow( int iRow, float fNew )
void TimingData::SetTickcountAtRow( int iRow, int iTicks ) void TimingData::SetTickcountAtRow( int iRow, int iTicks )
{ {
unsigned i; unsigned i;
for( i=0; i<m_TickcountSegments.size(); i++ ) vector<TimingSegment *> &ticks = this->allTimingSegments[SEGMENT_TICKCOUNT];
if( m_TickcountSegments[i].GetRow() >= iRow ) for( i=0; i<ticks.size(); i++ )
if( ticks[i]->GetRow() >= iRow )
break; break;
if( i == m_TickcountSegments.size() || m_TickcountSegments[i].GetRow() != iRow ) TickcountSegment *ts = static_cast<TickcountSegment *>(ticks[i]);
if( i == ticks.size() || ts->GetRow() != iRow )
{ {
// No TickcountSegment here. Make a new segment if required. // No TickcountSegment here. Make a new segment if required.
if( i == 0 || m_TickcountSegments[i-1].GetTicks() != iTicks ) if (i == 0 ||
AddTickcountSegment( TickcountSegment(iRow, iTicks ) ); static_cast<TickcountSegment *>(ticks[i-1])->GetTicks() != iTicks )
AddSegment( SEGMENT_TICKCOUNT, new TickcountSegment(iRow, iTicks ) );
} }
else // TickcountSegment being modified is m_TickcountSegments[i] else // TickcountSegment being modified is m_TickcountSegments[i]
{ {
if( i > 0 && m_TickcountSegments[i-1].GetTicks() == iTicks ) if (i > 0 &&
m_TickcountSegments.erase( m_TickcountSegments.begin()+i, m_TickcountSegments.begin()+i+1 ); static_cast<TickcountSegment *>(ticks[i-1])->GetTicks() == iTicks )
ticks.erase( ticks.begin()+i, ticks.begin()+i+1 );
else else
m_TickcountSegments[i].SetTicks(iTicks); ts->SetTicks(iTicks);
} }
} }