diff --git a/src/TimingData.cpp b/src/TimingData.cpp index 1a8c0e9802..8ad0a813f8 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -1038,6 +1038,17 @@ void TimingData::ScaleRegion( float fScale, int iStartIndex, int iEndIndex, bool m_StopSegments[i].m_iStartRow = lrintf((iSegStartRow - iStartIndex) * fScale) + iStartIndex; } + for( unsigned i = 0; i < m_vTimeSignatureSegments.size(); i++ ) + { + const int iSegStartRow = m_vTimeSignatureSegments[i].m_iStartRow; + if( iSegStartRow < iStartIndex ) + continue; + else if( iSegStartRow > iEndIndex ) + m_vTimeSignatureSegments[i].m_iStartRow += lrintf((iEndIndex - iStartIndex) * (fScale - 1)); + else + m_vTimeSignatureSegments[i].m_iStartRow = lrintf((iSegStartRow - iStartIndex) * fScale) + iStartIndex; + } + for( unsigned i = 0; i < m_WarpSegments.size(); i++ ) { const int iSegStartRow = m_WarpSegments[i].m_iStartRow; @@ -1120,6 +1131,17 @@ void TimingData::ScaleRegion( float fScale, int iStartIndex, int iEndIndex, bool m_FakeSegments[i].m_iStartRow = lrintf((iSegStartRow - iStartIndex) * fScale) + iStartIndex; } + for( unsigned i = 0; i < m_ScrollSegments.size(); i++ ) + { + const int iSegStartRow = m_ScrollSegments[i].m_iStartRow; + if( iSegStartRow < iStartIndex ) + continue; + else if( iSegStartRow > iEndIndex ) + m_ScrollSegments[i].m_iStartRow += lrintf((iEndIndex - iStartIndex) * (fScale - 1)); + else + m_ScrollSegments[i].m_iStartRow = lrintf((iSegStartRow - iStartIndex) * fScale) + iStartIndex; + } + // adjust BPM changes to preserve timing if( bAdjustBPM ) { @@ -1218,6 +1240,14 @@ void TimingData::InsertRows( int iStartRow, int iRowsToAdd ) continue; fake.m_iStartRow += iRowsToAdd; } + + for( unsigned i = 0; i < m_ScrollSegments.size(); i++ ) + { + ScrollSegment &scrl = m_ScrollSegments[i]; + if( scrl.m_iStartRow < iStartRow ) + continue; + scrl.m_iStartRow += iRowsToAdd; + } if( iStartRow == 0 ) { @@ -1405,6 +1435,22 @@ void TimingData::DeleteRows( int iStartRow, int iRowsToDelete ) fake.m_iStartRow -= iRowsToDelete; } + + for( unsigned i = 0; i < m_ScrollSegments.size(); i++ ) + { + ScrollSegment &scrl = m_ScrollSegments[i]; + + if( scrl.m_iStartRow < iStartRow ) + continue; + + if( scrl.m_iStartRow < iStartRow+iRowsToDelete ) + { + m_ScrollSegments.erase( m_ScrollSegments.begin()+i, m_ScrollSegments.begin()+i+1 ); + --i; + continue; + } + scrl.m_iStartRow -= iRowsToDelete; + } this->SetBPMAtRow( iStartRow, fNewBPM ); }