diff --git a/Sources/VLModel.cpp b/Sources/VLModel.cpp index 9c06b5e..436c3cd 100644 --- a/Sources/VLModel.cpp +++ b/Sources/VLModel.cpp @@ -997,7 +997,7 @@ static const uint8_t * sDiv4[] = { NULL, sDiv4_8, NULL, NULL, NULL, sDiv4_12}; static const uint8_t sDiv6_2[] = {0, 0, 0, 1, 1, 1}; -static const uint8_t sDiv6_3[] = {0, 0, 1, 1, 2, 2}; +static const uint8_t sDiv6_3[] = {0, 0, 1, 2, 2, 2}; static const uint8_t sDiv6_4[] = {0, 1, 2, 2, 3, 3}; static const uint8_t sDiv6_8[] = {0, 2, 3, 4, 6, 7}; static const uint8_t sDiv6_12[]= {0, 2, 4, 6, 8,10}; @@ -1851,7 +1851,13 @@ VLSong::iterator::iterator(const VLSong & song, bool end) if (end) { fMeasure = fSong.CountMeasures()-fSong.EmptyEnding(); } else { + bool repeat; fMeasure = 0; + if (fSong.fCoda > 0 + && !fSong.DoesEndRepeat(fMeasure) + && !fSong.DoesEndEnding(fMeasure, &repeat) + ) + fStatus.push_back(Repeat(fMeasure, 2)); AdjustStatus(); } } @@ -1868,7 +1874,7 @@ void VLSong::iterator::AdjustStatus() { int times; size_t volta; - bool repeat; + bool repeat = true; if (fSong.DoesEndRepeat(fMeasure) || (fSong.DoesEndEnding(fMeasure, &repeat) && repeat) ) { @@ -1880,6 +1886,8 @@ void VLSong::iterator::AdjustStatus() return; } + } else if (!repeat) { + fStatus.pop_back(); } if (fSong.fCoda > 0 && fMeasure==fSong.fGoToCoda) if (fStatus.size() && fStatus.back().fVolta == fStatus.back().fTimes-1) { @@ -1887,7 +1895,9 @@ void VLSong::iterator::AdjustStatus() return; } - if (fMeasure == fSong.CountMeasures()-fSong.EmptyEnding()) + if (fMeasure == fSong.CountMeasures()-fSong.EmptyEnding() + || (fSong.fCoda > 0 && fMeasure == fSong.fCoda) + ) while (fStatus.size()) if (++fStatus.back().fVolta < fStatus.back().fTimes) { fMeasure = fStatus.back().fBegin;