Skip to content

Commit 4d4c967

Browse files
authored
Add dynamics support to alphaTex (#329)
1 parent d92795a commit 4d4c967

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

Documentation/input/alphatex/beat-effects.cshtml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ TexSample: true
5353
$('#alphaTabBeatEffects').alphaTab();
5454
</script>
5555

56+
<h2 id="dynamics">Dynamics</h2>
57+
58+
<p>
59+
Dynamics are beat effects with the indicator <code>dy</code> followed by one of the supported dynamics values FFF, FF, F, MF, MP, P, PP or PPP
60+
</p>
61+
62+
<div id="alphaTabBeatDynamics" data-tex="true">
63+
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}
64+
</div>
65+
<script type="text/x-alphatab">
66+
$('#alphaTabBeatDynamics').alphaTab();
67+
</script>
68+
5669
<h2 id="tuplet-ranges">Tuplet Ranges</h2>
5770

5871
<p>

Source/AlphaTab.Test.Js/test/alphaTab.tests.specs.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ describe("alphaTab.test.audio.MidiPlaybackControllerTest", function() {
5555
alphaTab.test.TestPlatform.Done = done;
5656
__instance.testRepeatCloseAlternateEndings();
5757
});
58+
it("testRepeatWithAlphaTex", function(done) {
59+
alphaTab.test.TestPlatform.Done = done;
60+
__instance.testRepeatWithAlphaTex();
61+
done();
62+
});
5863
});
5964
describe("alphaTab.test.importer.AlphaTexImporterTest", function() {
6065
var __instance = new alphaTab.test.importer.AlphaTexImporterTest();
@@ -228,6 +233,21 @@ describe("alphaTab.test.importer.AlphaTexImporterTest", function() {
228233
__instance.testRandomAnacrusis();
229234
done();
230235
});
236+
it("testRepeat", function(done) {
237+
alphaTab.test.TestPlatform.Done = done;
238+
__instance.testRepeat();
239+
done();
240+
});
241+
it("testDefaultTranspositionOnInstruments", function(done) {
242+
alphaTab.test.TestPlatform.Done = done;
243+
__instance.testDefaultTranspositionOnInstruments();
244+
done();
245+
});
246+
it("testDynamics", function(done) {
247+
alphaTab.test.TestPlatform.Done = done;
248+
__instance.testDynamics();
249+
done();
250+
});
231251
});
232252
describe("alphaTab.test.importer.Gp3ImporterTest", function() {
233253
var __instance = new alphaTab.test.importer.Gp3ImporterTest();

Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,5 +950,22 @@ 1.2 3.2 0.1 1.1
950950
Assert.AreEqual(0, score.Tracks[1].Staves[0].TranspositionPitch);
951951
Assert.AreEqual(-12, score.Tracks[1].Staves[0].DisplayTranspositionPitch);
952952
}
953+
954+
[TestMethod]
955+
public void TestDynamics()
956+
{
957+
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}";
958+
var score = ParseTex(tex);
959+
Assert.AreEqual(DynamicValue.PPP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Dynamics);
960+
Assert.AreEqual(DynamicValue.PP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[1].Dynamics);
961+
Assert.AreEqual(DynamicValue.P, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].Dynamics);
962+
Assert.AreEqual(DynamicValue.MP, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[3].Dynamics);
963+
Assert.AreEqual(DynamicValue.MF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[4].Dynamics);
964+
Assert.AreEqual(DynamicValue.F, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[5].Dynamics);
965+
Assert.AreEqual(DynamicValue.FF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[6].Dynamics);
966+
Assert.AreEqual(DynamicValue.FFF, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[7].Dynamics);
967+
}
968+
969+
953970
}
954971
}

Source/AlphaTab/Importer/AlphaTexImporter.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,40 @@ private bool ApplyBeatEffect(Beat beat)
15011501
return true;
15021502
}
15031503

1504+
if (syData == "dy")
1505+
{
1506+
NewSy();
1507+
switch (_syData.ToString().ToLower())
1508+
{
1509+
case "ppp":
1510+
beat.Dynamics = DynamicValue.PPP;
1511+
break;
1512+
case "pp":
1513+
beat.Dynamics = DynamicValue.PP;
1514+
break;
1515+
case "p":
1516+
beat.Dynamics = DynamicValue.P;
1517+
break;
1518+
case "mp":
1519+
beat.Dynamics = DynamicValue.MP;
1520+
break;
1521+
case "mf":
1522+
beat.Dynamics = DynamicValue.MF;
1523+
break;
1524+
case "f":
1525+
beat.Dynamics = DynamicValue.F;
1526+
break;
1527+
case "ff":
1528+
beat.Dynamics = DynamicValue.FF;
1529+
break;
1530+
case "fff":
1531+
beat.Dynamics = DynamicValue.FFF;
1532+
break;
1533+
}
1534+
NewSy();
1535+
return true;
1536+
}
1537+
15041538
if (syData == "tp")
15051539
{
15061540
NewSy();

0 commit comments

Comments
 (0)