diff --git a/Source/AlphaTab.Test/Audio/MidiPlaybackControllerTest.cs b/Source/AlphaTab.Test/Audio/MidiPlaybackControllerTest.cs index d3d0f6137..fdfaefd4f 100644 --- a/Source/AlphaTab.Test/Audio/MidiPlaybackControllerTest.cs +++ b/Source/AlphaTab.Test/Audio/MidiPlaybackControllerTest.cs @@ -1,5 +1,7 @@ using System.Diagnostics; using AlphaTab.Audio.Generator; +using AlphaTab.Collections; +using AlphaTab.Importer; using AlphaTab.Model; using AlphaTab.Test.Importer; using AlphaTab.Util; @@ -13,60 +15,64 @@ public class MidiPlaybackControllerTest : GpImporterTestBase [TestMethod, AsyncTestMethod] public void TestRepeatClose() { - PrepareImporterWithFile("GuitarPro5\\RepeatClose.gp5", reader => - { - var score = reader.ReadScore(); - var expectedIndexes = new[] + PrepareImporterWithFile("GuitarPro5\\RepeatClose.gp5", + reader => { - 0, 1, 0, 1, 2 - }; + var score = reader.ReadScore(); + var expectedIndexes = new[] + { + 0, 1, 0, 1, 2 + }; - TestRepeat(score, expectedIndexes); - }); + TestRepeat(score, expectedIndexes); + }); } [TestMethod, AsyncTestMethod] public void TestRepeatCloseMulti() { - PrepareImporterWithFile("GuitarPro5\\RepeatCloseMulti.gp5", reader => - { - var score = reader.ReadScore(); - var expectedIndexes = new[] + PrepareImporterWithFile("GuitarPro5\\RepeatCloseMulti.gp5", + reader => { - 0,1,0,1,0,1,0,1,2 - }; - TestRepeat(score, expectedIndexes); - }); + var score = reader.ReadScore(); + var expectedIndexes = new[] + { + 0, 1, 0, 1, 0, 1, 0, 1, 2 + }; + TestRepeat(score, expectedIndexes); + }); } [TestMethod, AsyncTestMethod] public void TestRepeatCloseWithoutStartAtBeginning() { - PrepareImporterWithFile("GuitarPro5\\RepeatCloseWithoutStartAtBeginning.gp5", reader => - { - var score = reader.ReadScore(); - var expectedIndexes = new[] + PrepareImporterWithFile("GuitarPro5\\RepeatCloseWithoutStartAtBeginning.gp5", + reader => { - 0,1,0,1 - }; + var score = reader.ReadScore(); + var expectedIndexes = new[] + { + 0, 1, 0, 1 + }; - TestRepeat(score, expectedIndexes); - }); + TestRepeat(score, expectedIndexes); + }); } [TestMethod, AsyncTestMethod] public void TestRepeatCloseAlternateEndings() { - PrepareImporterWithFile("GuitarPro5\\RepeatCloseAlternateEndings.gp5", reader => - { - var score = reader.ReadScore(); - var expectedIndexes = new[] + PrepareImporterWithFile("GuitarPro5\\RepeatCloseAlternateEndings.gp5", + reader => { - 0,1,0,2,3,0,1,0,4 - }; + var score = reader.ReadScore(); + var expectedIndexes = new[] + { + 0, 1, 0, 2, 3, 0, 1, 0, 4 + }; - TestRepeat(score, expectedIndexes); - }); + TestRepeat(score, expectedIndexes); + }); } private void TestRepeat(Score score, int[] expectedIndexes) @@ -83,11 +89,51 @@ private void TestRepeat(Score score, int[] expectedIndexes) Assert.AreEqual(expectedIndexes[i], index); i++; } + controller.MoveNext(); } Assert.AreEqual(expectedIndexes.Length, i); Assert.IsTrue(controller.Finished); } + + [TestMethod] + public void TestRepeatWithAlphaTex() + { + var tex = @"\ro 1.3 2.3 3.3 4.3 | 5.3 6.3 7.3 8.3 | \rc 2 1.3 2.3 3.3 4.3 | \ro \rc 3 1.3 2.3 3.3 4.3"; + var importer = new AlphaTexImporter(); + importer.Init(TestPlatform.CreateStringReader(tex), new Settings()); + var score = importer.ReadScore(); + + var playedBars = new FastList(); + var controller = new MidiPlaybackController(score); + while (!controller.Finished) + { + var index = controller.Index; + playedBars.Add(index); + controller.ProcessCurrent(); + controller.MoveNext(); + + if (playedBars.Count > 50) + { + Assert.Fail("Too many bars generated"); + } + } + + var expectedBars = new FastList + { + 0, + 1, + 2, + 0, + 1, + 2, + 3, + 3, + 3 + }; + + Assert.AreEqual(string.Join(",", expectedBars), string.Join(",", playedBars)); + } } } diff --git a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs index 344238fa3..11699a535 100644 --- a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs +++ b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs @@ -918,5 +918,16 @@ public void TestRandomAnacrusis() Assert.AreEqual(1920, score.MasterBars[2].CalculateDuration()); Assert.AreEqual(3840, score.MasterBars[3].CalculateDuration()); } + + [TestMethod] + public void TestRepeat() + { + var tex = @"\ro 1.3 2.3 3.3 4.3 | 5.3 6.3 7.3 8.3 | \rc 2 1.3 2.3 3.3 4.3 | \ro \rc 3 1.3 2.3 3.3 4.3 |"; + var score = ParseTex(tex); + Assert.AreEqual(0, score.MasterBars[0].RepeatCount); + Assert.AreEqual(0, score.MasterBars[1].RepeatCount); + Assert.AreEqual(2, score.MasterBars[2].RepeatCount); + Assert.AreEqual(3, score.MasterBars[3].RepeatCount); + } } } diff --git a/Source/AlphaTab/Importer/AlphaTexImporter.cs b/Source/AlphaTab/Importer/AlphaTexImporter.cs index 26d058aba..2bb0458fc 100644 --- a/Source/AlphaTab/Importer/AlphaTexImporter.cs +++ b/Source/AlphaTab/Importer/AlphaTexImporter.cs @@ -61,6 +61,8 @@ public override Score ReadScore() Consolidate(); _score.Finish(Settings); + _score.RebuildRepeatGroups(); + foreach (var track in _lyrics) { _score.Tracks[track].ApplyLyrics(_lyrics[track]); @@ -2023,7 +2025,7 @@ private void BarMeta(Bar bar) Error("repeatclose", AlphaTexSymbols.Number); } - master.RepeatCount = (int)_syData - 1; + master.RepeatCount = (int)_syData; NewSy(); } else if (syData == "ks")