diff --git a/Documentation/input/alphatex/beat-effects.cshtml b/Documentation/input/alphatex/beat-effects.cshtml index 29d738e5c..2371165df 100644 --- a/Documentation/input/alphatex/beat-effects.cshtml +++ b/Documentation/input/alphatex/beat-effects.cshtml @@ -53,6 +53,19 @@ TexSample: true $('#alphaTabBeatEffects').alphaTab(); +

Dynamics

+ +

+ Dynamics are beat effects with the indicator dy followed by one of the supported dynamics values FFF, FF, F, MF, MP, P, PP or PPP +

+ +
+1.1.8{dy ppp} 1.1{dy pp} 1.1{dy p} 1.1{dy mp} 1.1{dy mf} 1.1{dy f} 1.1{dy ff} 1.1{dy fff} +
+ +

Tuplet Ranges

diff --git a/Source/AlphaTab.Test.Js/test/alphaTab.tests.specs.js b/Source/AlphaTab.Test.Js/test/alphaTab.tests.specs.js index 3b3d235e7..b6ad0c53f 100644 --- a/Source/AlphaTab.Test.Js/test/alphaTab.tests.specs.js +++ b/Source/AlphaTab.Test.Js/test/alphaTab.tests.specs.js @@ -55,6 +55,11 @@ describe("alphaTab.test.audio.MidiPlaybackControllerTest", function() { alphaTab.test.TestPlatform.Done = done; __instance.testRepeatCloseAlternateEndings(); }); + it("testRepeatWithAlphaTex", function(done) { + alphaTab.test.TestPlatform.Done = done; + __instance.testRepeatWithAlphaTex(); + done(); + }); }); describe("alphaTab.test.importer.AlphaTexImporterTest", function() { var __instance = new alphaTab.test.importer.AlphaTexImporterTest(); @@ -228,6 +233,21 @@ describe("alphaTab.test.importer.AlphaTexImporterTest", function() { __instance.testRandomAnacrusis(); done(); }); + it("testRepeat", function(done) { + alphaTab.test.TestPlatform.Done = done; + __instance.testRepeat(); + done(); + }); + it("testDefaultTranspositionOnInstruments", function(done) { + alphaTab.test.TestPlatform.Done = done; + __instance.testDefaultTranspositionOnInstruments(); + done(); + }); + it("testDynamics", function(done) { + alphaTab.test.TestPlatform.Done = done; + __instance.testDynamics(); + done(); + }); }); describe("alphaTab.test.importer.Gp3ImporterTest", function() { var __instance = new alphaTab.test.importer.Gp3ImporterTest(); diff --git a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs index 5b9ca418e..28353355a 100644 --- a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs +++ b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs @@ -950,5 +950,22 @@ 1.2 3.2 0.1 1.1 Assert.AreEqual(0, score.Tracks[1].Staves[0].TranspositionPitch); Assert.AreEqual(-12, score.Tracks[1].Staves[0].DisplayTranspositionPitch); } + + [TestMethod] + public void TestDynamics() + { + var tex = @"1.1.8{dy ppp} 1.1{dy pp} 1.1{dy p} 1.1{dy mp} 1.1{dy mf} 1.1{dy f} 1.1{dy ff} 1.1{dy fff}"; + var score = ParseTex(tex); + Assert.AreEqual(DynamicValue.PPP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Dynamics); + Assert.AreEqual(DynamicValue.PP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[1].Dynamics); + Assert.AreEqual(DynamicValue.P, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].Dynamics); + Assert.AreEqual(DynamicValue.MP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[3].Dynamics); + Assert.AreEqual(DynamicValue.MF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[4].Dynamics); + Assert.AreEqual(DynamicValue.F, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[5].Dynamics); + Assert.AreEqual(DynamicValue.FF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[6].Dynamics); + Assert.AreEqual(DynamicValue.FFF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[7].Dynamics); + } + + } } diff --git a/Source/AlphaTab/Importer/AlphaTexImporter.cs b/Source/AlphaTab/Importer/AlphaTexImporter.cs index 8dfda1879..9c167750b 100644 --- a/Source/AlphaTab/Importer/AlphaTexImporter.cs +++ b/Source/AlphaTab/Importer/AlphaTexImporter.cs @@ -1501,6 +1501,40 @@ private bool ApplyBeatEffect(Beat beat) return true; } + if (syData == "dy") + { + NewSy(); + switch (_syData.ToString().ToLower()) + { + case "ppp": + beat.Dynamics = DynamicValue.PPP; + break; + case "pp": + beat.Dynamics = DynamicValue.PP; + break; + case "p": + beat.Dynamics = DynamicValue.P; + break; + case "mp": + beat.Dynamics = DynamicValue.MP; + break; + case "mf": + beat.Dynamics = DynamicValue.MF; + break; + case "f": + beat.Dynamics = DynamicValue.F; + break; + case "ff": + beat.Dynamics = DynamicValue.FF; + break; + case "fff": + beat.Dynamics = DynamicValue.FFF; + break; + } + NewSy(); + return true; + } + if (syData == "tp") { NewSy();