diff --git a/Documentation/input/alphatex/note-effects.cshtml b/Documentation/input/alphatex/note-effects.cshtml
index 6269c1597..c1e298b76 100644
--- a/Documentation/input/alphatex/note-effects.cshtml
+++ b/Documentation/input/alphatex/note-effects.cshtml
@@ -26,6 +26,8 @@ TexSample: true
3.3{sl} 4.3 3.3{ss} 4.3 |
// slides (into-from-below, intro-from-above, out-up, out-down)
3.3{sib} 3.3{sia} 3.3{sou} 3.3{sod} |
+ // slides (combined)
+ 3.3{sib sou} 3.3{sib sod} 3.3{sia sod} 3.3{sia sou} |
// pick-slides (down and up)
x.3{psd} 3.3 |
x.3{psu} 3.3 |
diff --git a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs
index 28353355a..6d58f1582 100644
--- a/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs
+++ b/Source/AlphaTab.Test/Importer/AlphaTexImporterTest.cs
@@ -724,25 +724,25 @@ public void TestSlides()
Assert.AreEqual(1, score.Tracks.Count);
Assert.AreEqual(4, score.MasterBars.Count);
- Assert.AreEqual(SlideType.Legato, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.Legato, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[1].Notes[0].Id,
score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].SlideTarget.Id);
- Assert.AreEqual(SlideType.Shift, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.Shift, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].Notes[0].Id,
score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].SlideTarget.Id);
- Assert.AreEqual(SlideType.IntoFromBelow,
- score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].Notes[0].SlideType);
- Assert.AreEqual(SlideType.IntoFromAbove,
- score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[1].Notes[0].SlideType);
- Assert.AreEqual(SlideType.OutUp, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[2].Notes[0].SlideType);
- Assert.AreEqual(SlideType.OutDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[3].Notes[0].SlideType);
-
- Assert.AreEqual(SlideType.PickSlideDown,
- score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].Notes[0].SlideType);
- Assert.AreEqual(SlideType.PickSlideUp,
- score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].Notes[0].SlideType);
+ Assert.AreEqual(SlideInType.IntoFromBelow,
+ score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].Notes[0].SlideInType);
+ Assert.AreEqual(SlideInType.IntoFromAbove,
+ score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[1].Notes[0].SlideInType);
+ Assert.AreEqual(SlideOutType.OutUp, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[2].Notes[0].SlideOutType);
+ Assert.AreEqual(SlideOutType.OutDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[3].Notes[0].SlideOutType);
+
+ Assert.AreEqual(SlideOutType.PickSlideDown,
+ score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].Notes[0].SlideOutType);
+ Assert.AreEqual(SlideOutType.PickSlideUp,
+ score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].Notes[0].SlideOutType);
}
[TestMethod]
diff --git a/Source/AlphaTab.Test/Importer/Gp3ImporterTest.cs b/Source/AlphaTab.Test/Importer/Gp3ImporterTest.cs
index 560adb99a..7fefd24d9 100644
--- a/Source/AlphaTab.Test/Importer/Gp3ImporterTest.cs
+++ b/Source/AlphaTab.Test/Importer/Gp3ImporterTest.cs
@@ -81,12 +81,12 @@ public void TestAccentuation()
}
[TestMethod]
- public void TestGuitarPro3Harmonics()
+ public void TestGuitarPro3Harmonics()
{
// TODO: Find out about GP3 harmonics!
//var reader = PrepareImporterWithFile("GuitarPro3/TestHarmonics.gp3");
//var score = reader.ReadScore();
-
+
//Assert.AreEqual(HarmonicType.Natural, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].HarmonicType);
//Assert.AreEqual(HarmonicType.Artificial, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[1].Notes[0].HarmonicType);
}
@@ -120,14 +120,14 @@ public void TestSlides()
{
var score = reader.ReadScore();
- Assert.AreEqual(SlideType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].GetNoteOnString(5).SlideType);
- Assert.AreEqual(SlideType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].GetNoteOnString(2).SlideType);
+ Assert.AreEqual(SlideOutType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].GetNoteOnString(5).SlideOutType);
+ Assert.AreEqual(SlideOutType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].GetNoteOnString(2).SlideOutType);
Render(score);
});
}
[TestMethod, AsyncTestMethod]
- public void TestGuitarPro3Vibrato()
+ public void TestGuitarPro3Vibrato()
{
// TODO: Check why this vibrato is not recognized
PrepareImporterWithFile("GuitarPro3/TestVibrato.gp3", reader =>
diff --git a/Source/AlphaTab.Test/Importer/Gp7ImporterTest.cs b/Source/AlphaTab.Test/Importer/Gp7ImporterTest.cs
index 442d5c4fa..c03693f5c 100644
--- a/Source/AlphaTab.Test/Importer/Gp7ImporterTest.cs
+++ b/Source/AlphaTab.Test/Importer/Gp7ImporterTest.cs
@@ -1110,51 +1110,51 @@ public void TestPickSlide()
{
var score = reader.ReadScore();
- Assert.AreEqual(SlideType.PickSlideUp, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideUp, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].Notes[0].Fret);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[1].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].Notes[0].SlideOutType);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].Notes[0].Fret);
Assert.AreEqual(0, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[3].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideUp, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideUp, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(0, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].Notes[0].Fret);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[2].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[2].Notes[0].SlideOutType);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[2].Notes[0].Fret);
Assert.AreEqual(5, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[3].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(20, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[0].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[1].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[1].Notes[0].SlideOutType);
Assert.AreEqual(12, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[1].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[2].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[2].Notes[0].SlideOutType);
Assert.AreEqual(5, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[2].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[3].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[3].Notes[0].SlideOutType);
Assert.AreEqual(0, score.Tracks[0].Staves[0].Bars[2].Voices[0].Beats[3].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(20, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[0].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].Notes[0].SlideOutType);
Assert.AreEqual(12, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[1].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideUp, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[2].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideUp, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[2].Notes[0].SlideOutType);
Assert.AreEqual(5, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[2].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideUp, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[3].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideUp, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[3].Notes[0].SlideOutType);
Assert.AreEqual(10, score.Tracks[0].Staves[0].Bars[3].Voices[0].Beats[3].Notes[0].Fret);
- Assert.AreEqual(SlideType.PickSlideDown, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].Notes[0].SlideType);
+ Assert.AreEqual(SlideOutType.PickSlideDown, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].Notes[0].SlideOutType);
Assert.AreEqual(20, score.Tracks[0].Staves[0].Bars[4].Voices[0].Beats[0].Notes[0].Fret);
Render(score);
diff --git a/Source/AlphaTab.Test/Importer/GpImporterTestBase.cs b/Source/AlphaTab.Test/Importer/GpImporterTestBase.cs
index 70d713bf7..06da24b7a 100644
--- a/Source/AlphaTab.Test/Importer/GpImporterTestBase.cs
+++ b/Source/AlphaTab.Test/Importer/GpImporterTestBase.cs
@@ -240,12 +240,12 @@ protected void CheckTremolo(Score score)
protected void CheckSlides(Score score)
{
- Assert.AreEqual(SlideType.Legato, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].GetNoteOnString(5).SlideType);
- Assert.AreEqual(SlideType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].GetNoteOnString(2).SlideType);
- Assert.AreEqual(SlideType.IntoFromBelow, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].GetNoteOnString(5).SlideType);
- Assert.AreEqual(SlideType.IntoFromAbove, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].GetNoteOnString(5).SlideType);
- Assert.AreEqual(SlideType.OutDown, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[2].GetNoteOnString(5).SlideType);
- Assert.AreEqual(SlideType.OutUp, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[3].GetNoteOnString(5).SlideType);
+ Assert.AreEqual(SlideOutType.Legato, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[0].GetNoteOnString(5).SlideOutType);
+ Assert.AreEqual(SlideOutType.Shift, score.Tracks[0].Staves[0].Bars[0].Voices[0].Beats[2].GetNoteOnString(2).SlideOutType);
+ Assert.AreEqual(SlideInType.IntoFromBelow, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[0].GetNoteOnString(5).SlideInType);
+ Assert.AreEqual(SlideInType.IntoFromAbove, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[1].GetNoteOnString(5).SlideInType);
+ Assert.AreEqual(SlideOutType.OutDown, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[2].GetNoteOnString(5).SlideOutType);
+ Assert.AreEqual(SlideOutType.OutUp, score.Tracks[0].Staves[0].Bars[1].Voices[0].Beats[3].GetNoteOnString(5).SlideOutType);
}
protected void CheckStrings(Score score)
diff --git a/Source/AlphaTab.Test/Importer/MusicXmlImporterTestBase.cs b/Source/AlphaTab.Test/Importer/MusicXmlImporterTestBase.cs
index 31dfc5268..65a32fdcb 100644
--- a/Source/AlphaTab.Test/Importer/MusicXmlImporterTestBase.cs
+++ b/Source/AlphaTab.Test/Importer/MusicXmlImporterTestBase.cs
@@ -313,7 +313,8 @@ protected void AreEqual(Note expected, Note actual)
Assert.AreEqual(expected.IsPalmMute, actual.IsPalmMute, "Mismatch on IsPalmMute");
Assert.AreEqual(expected.IsDead, actual.IsDead, "Mismatch on IsDead");
Assert.AreEqual(expected.IsStaccato, actual.IsStaccato, "Mismatch on IsStaccato");
- Assert.AreEqual(expected.SlideType, actual.SlideType, "Mismatch on SlideType");
+ Assert.AreEqual(expected.SlideInType, actual.SlideInType, "Mismatch on SlideInType");
+ Assert.AreEqual(expected.SlideOutType, actual.SlideOutType, "Mismatch on SlideOutType");
Assert.AreEqual(expected.Vibrato, actual.Vibrato, "Mismatch on Vibrato");
Assert.AreEqual(expected.IsTieDestination, actual.IsTieDestination, "Mismatch on IsTieDestination");
Assert.AreEqual(expected.IsTieOrigin, actual.IsTieOrigin, "Mismatch on IsTieOrigin");
diff --git a/Source/AlphaTab/Audio/Generator/MidiFileGenerator.cs b/Source/AlphaTab/Audio/Generator/MidiFileGenerator.cs
index 2b1c27b41..4255f1086 100644
--- a/Source/AlphaTab/Audio/Generator/MidiFileGenerator.cs
+++ b/Source/AlphaTab/Audio/Generator/MidiFileGenerator.cs
@@ -498,7 +498,7 @@ private void GenerateNote(Note note, int beatStart, int beatDuration, int[] brus
{
GenerateWhammy(note.Beat, noteStart, noteDuration, channel);
}
- else if (note.SlideType != SlideType.None)
+ else if (note.SlideInType != SlideInType.None || note.SlideOutType != SlideOutType.None)
{
// TODO GenerateSlide(note, noteStart, noteDuration, noteKey, dynamicValue, channel);
}
diff --git a/Source/AlphaTab/Exporter/AlphaTexExporter.cs b/Source/AlphaTab/Exporter/AlphaTexExporter.cs
index b1a9d0abc..5b3437579 100644
--- a/Source/AlphaTab/Exporter/AlphaTexExporter.cs
+++ b/Source/AlphaTab/Exporter/AlphaTexExporter.cs
@@ -4,7 +4,7 @@
namespace AlphaTab.Exporter
{
///
- /// This class allows converting scores into alphaTex.
+ /// This class allows converting scores into alphaTex.
///
// ReSharper disable once UnusedMember.Global
public class AlphaTexExporter
@@ -20,7 +20,7 @@ public AlphaTexExporter()
}
///
- /// Exports the given track.
+ /// Exports the given track.
///
/// The track to export
public void Export(Track track)
@@ -35,7 +35,7 @@ private void Score(Track track)
}
///
- /// Returns the generated tex code.
+ /// Returns the generated tex code.
///
///
public string ToTex()
@@ -97,7 +97,7 @@ private void StringMetaData(string key, string value)
private void Bars(Track track)
{
- // alphatab only supports single staves,
+ // alphatab only supports single staves,
for (var i = 0; i < 1; i++)
{
for (var j = 0; j < track.Staves[i].Bars.Count; j++)
@@ -250,13 +250,13 @@ private void NoteEffects(Note note)
_builder.Append("v ");
}
- if (note.SlideType == SlideType.Legato)
+ if (note.SlideOutType == SlideOutType.Legato)
{
hasEffectOpen = EffectOpen(hasEffectOpen);
_builder.Append("sl ");
}
- if (note.SlideType == SlideType.Shift)
+ if (note.SlideOutType == SlideOutType.Shift)
{
hasEffectOpen = EffectOpen(hasEffectOpen);
_builder.Append("ss ");
diff --git a/Source/AlphaTab/Importer/AlphaTexImporter.cs b/Source/AlphaTab/Importer/AlphaTexImporter.cs
index 9c167750b..427bcf006 100644
--- a/Source/AlphaTab/Importer/AlphaTexImporter.cs
+++ b/Source/AlphaTab/Importer/AlphaTexImporter.cs
@@ -1860,42 +1860,42 @@ private void NoteEffects(Note note)
else if (syData == "sl")
{
NewSy();
- note.SlideType = SlideType.Legato;
+ note.SlideOutType = SlideOutType.Legato;
}
else if (syData == "ss")
{
NewSy();
- note.SlideType = SlideType.Shift;
+ note.SlideOutType = SlideOutType.Shift;
}
else if (syData == "sib")
{
NewSy();
- note.SlideType = SlideType.IntoFromBelow;
+ note.SlideInType = SlideInType.IntoFromBelow;
}
else if (syData == "sia")
{
NewSy();
- note.SlideType = SlideType.IntoFromAbove;
+ note.SlideInType = SlideInType.IntoFromAbove;
}
else if (syData == "sou")
{
NewSy();
- note.SlideType = SlideType.OutUp;
+ note.SlideOutType = SlideOutType.OutUp;
}
else if (syData == "sod")
{
NewSy();
- note.SlideType = SlideType.OutDown;
+ note.SlideOutType = SlideOutType.OutDown;
}
else if (syData == "psd")
{
NewSy();
- note.SlideType = SlideType.PickSlideDown;
+ note.SlideOutType = SlideOutType.PickSlideDown;
}
else if (syData == "psu")
{
NewSy();
- note.SlideType = SlideType.PickSlideUp;
+ note.SlideOutType = SlideOutType.PickSlideUp;
}
else if (syData == "h")
{
diff --git a/Source/AlphaTab/Importer/Gp3To5Importer.cs b/Source/AlphaTab/Importer/Gp3To5Importer.cs
index 357ab0e74..944a3ffe9 100644
--- a/Source/AlphaTab/Importer/Gp3To5Importer.cs
+++ b/Source/AlphaTab/Importer/Gp3To5Importer.cs
@@ -1155,7 +1155,7 @@ public void ReadNoteEffects(Track track, Voice voice, Beat beat, Note note)
{
if ((flags & 0x04) != 0)
{
- note.SlideType = SlideType.Shift;
+ note.SlideOutType = SlideOutType.Shift;
}
}
@@ -1227,7 +1227,7 @@ public void ReadGrace(Voice voice, Note note)
case 0: // none
break;
case 1:
- graceNote.SlideType = SlideType.Legato;
+ graceNote.SlideOutType = SlideOutType.Legato;
graceNote.SlideTarget = note;
break;
case 2: // bend
@@ -1277,29 +1277,30 @@ public void ReadSlide(Note note)
if (_versionNumber >= 500)
{
var type = Data.ReadSignedByte();
- switch (type)
+ if ((type & 1) != 0)
{
- case 1:
- note.SlideType = SlideType.Shift;
- break;
- case 2:
- note.SlideType = SlideType.Legato;
- break;
- case 4:
- note.SlideType = SlideType.OutDown;
- break;
- case 8:
- note.SlideType = SlideType.OutUp;
- break;
- case 16:
- note.SlideType = SlideType.IntoFromBelow;
- break;
- case 32:
- note.SlideType = SlideType.IntoFromAbove;
- break;
- default:
- note.SlideType = SlideType.None;
- break;
+ note.SlideOutType = SlideOutType.Shift;
+ }
+ else if ((type & 2) != 0)
+ {
+ note.SlideOutType = SlideOutType.Legato;
+ }
+ else if ((type & 4) != 0)
+ {
+ note.SlideOutType = SlideOutType.OutDown;
+ }
+ else if ((type & 8) != 0)
+ {
+ note.SlideOutType = SlideOutType.OutUp;
+ }
+
+ if ((type & 16) != 0)
+ {
+ note.SlideInType = SlideInType.IntoFromBelow;
+ }
+ else if ((type & 32) != 0)
+ {
+ note.SlideInType = SlideInType.IntoFromAbove;
}
}
else
@@ -1308,25 +1309,22 @@ public void ReadSlide(Note note)
switch (type)
{
case 1:
- note.SlideType = SlideType.Shift;
+ note.SlideOutType = SlideOutType.Shift;
break;
case 2:
- note.SlideType = SlideType.Legato;
+ note.SlideOutType = SlideOutType.Legato;
break;
case 3:
- note.SlideType = SlideType.OutDown;
+ note.SlideOutType = SlideOutType.OutDown;
break;
case 4:
- note.SlideType = SlideType.OutUp;
+ note.SlideOutType = SlideOutType.OutUp;
break;
case -1:
- note.SlideType = SlideType.IntoFromBelow;
+ note.SlideInType = SlideInType.IntoFromBelow;
break;
case -2:
- note.SlideType = SlideType.IntoFromAbove;
- break;
- default:
- note.SlideType = SlideType.None;
+ note.SlideInType = SlideInType.IntoFromAbove;
break;
}
}
diff --git a/Source/AlphaTab/Importer/GpifParser.cs b/Source/AlphaTab/Importer/GpifParser.cs
index d6becca0d..1c5faf446 100644
--- a/Source/AlphaTab/Importer/GpifParser.cs
+++ b/Source/AlphaTab/Importer/GpifParser.cs
@@ -1998,42 +1998,37 @@ private void ParseNoteProperties(XmlNode node, Note note, string noteId)
var slideFlags = Platform.Platform.ParseInt(c.FindChildElement("Flags").InnerText);
if ((slideFlags & 1) != 0)
{
- note.SlideType = SlideType.Shift;
+ note.SlideOutType = SlideOutType.Shift;
}
-
- if ((slideFlags & 2) != 0)
+ else if ((slideFlags & 2) != 0)
{
- note.SlideType = SlideType.Legato;
+ note.SlideOutType = SlideOutType.Legato;
}
-
- if ((slideFlags & 4) != 0)
+ else if ((slideFlags & 4) != 0)
{
- note.SlideType = SlideType.OutDown;
+ note.SlideOutType = SlideOutType.OutDown;
}
-
- if ((slideFlags & 8) != 0)
+ else if ((slideFlags & 8) != 0)
{
- note.SlideType = SlideType.OutUp;
+ note.SlideOutType = SlideOutType.OutUp;
}
if ((slideFlags & 16) != 0)
{
- note.SlideType = SlideType.IntoFromBelow;
+ note.SlideInType = SlideInType.IntoFromBelow;
}
-
- if ((slideFlags & 32) != 0)
+ else if ((slideFlags & 32) != 0)
{
- note.SlideType = SlideType.IntoFromAbove;
+ note.SlideInType = SlideInType.IntoFromAbove;
}
-
+
if ((slideFlags & 64) != 0)
{
- note.SlideType = SlideType.PickSlideDown;
+ note.SlideOutType = SlideOutType.PickSlideDown;
}
-
- if ((slideFlags & 128) != 0)
+ else if ((slideFlags & 128) != 0)
{
- note.SlideType = SlideType.PickSlideUp;
+ note.SlideOutType = SlideOutType.PickSlideUp;
}
break;
diff --git a/Source/AlphaTab/Importer/MusicXmlImporter.cs b/Source/AlphaTab/Importer/MusicXmlImporter.cs
index 6caab3418..c574394d2 100644
--- a/Source/AlphaTab/Importer/MusicXmlImporter.cs
+++ b/Source/AlphaTab/Importer/MusicXmlImporter.cs
@@ -1006,7 +1006,7 @@ private void ParseNotations(XmlNode element, Beat beat, Note note)
case "glissando":
if (c.GetAttribute("type") == "start")
{
- note.SlideType = SlideType.Shift;
+ note.SlideOutType = SlideOutType.Shift;
}
break;
diff --git a/Source/AlphaTab/Model/Note.cs b/Source/AlphaTab/Model/Note.cs
index bba8109f5..e4829a10e 100644
--- a/Source/AlphaTab/Model/Note.cs
+++ b/Source/AlphaTab/Model/Note.cs
@@ -223,9 +223,14 @@ public class Note
public bool IsStaccato { get; set; }
///
- /// Gets or sets the slide type this note is played with.
+ /// Gets or sets the slide-in type this note is played with.
///
- public SlideType SlideType { get; set; }
+ public SlideInType SlideInType { get; set; }
+
+ ///
+ /// Gets or sets the slide-out type this note is played with.
+ ///
+ public SlideOutType SlideOutType { get; set; }
///
/// Gets or sets the target note for several slide types.
@@ -637,7 +642,8 @@ public Note()
Accentuated = AccentuationType.None;
Fret = int.MinValue;
HarmonicType = HarmonicType.None;
- SlideType = SlideType.None;
+ SlideInType = SlideInType.None;
+ SlideOutType = SlideOutType.None;
Vibrato = VibratoType.None;
LeftHandFinger = Fingers.Unknown;
@@ -671,7 +677,8 @@ internal static void CopyTo(Note src, Note dst)
dst.IsPalmMute = src.IsPalmMute;
dst.IsDead = src.IsDead;
dst.IsStaccato = src.IsStaccato;
- dst.SlideType = src.SlideType;
+ dst.SlideInType = src.SlideInType;
+ dst.SlideOutType = src.SlideOutType;
dst.Vibrato = src.Vibrato;
dst.IsTieDestination = src.IsTieDestination;
dst.IsSlurDestination = src.IsSlurDestination;
@@ -812,14 +819,14 @@ internal void Finish(Settings settings)
}
// set slides
- switch (SlideType)
+ switch (SlideOutType)
{
- case SlideType.Shift:
- case SlideType.Legato:
+ case SlideOutType.Shift:
+ case SlideOutType.Legato:
SlideTarget = nextNoteOnLine.Value;
if (SlideTarget == null)
{
- SlideType = SlideType.None;
+ SlideOutType = SlideOutType.None;
}
break;
@@ -830,7 +837,7 @@ internal void Finish(Settings settings)
{
effectSlurDestination = HammerPullDestination;
}
- else if (SlideType == SlideType.Legato && SlideTarget != null)
+ else if (SlideOutType == SlideOutType.Legato && SlideTarget != null)
{
effectSlurDestination = SlideTarget;
}
diff --git a/Source/AlphaTab/Model/SlideType.cs b/Source/AlphaTab/Model/SlideType.cs
index ab94b9768..0d599c8e5 100644
--- a/Source/AlphaTab/Model/SlideType.cs
+++ b/Source/AlphaTab/Model/SlideType.cs
@@ -1,34 +1,45 @@
namespace AlphaTab.Model
{
///
- /// This public enum lists all different types of finger slides on a string.
+ /// This public enum lists all different types of finger slide-ins on a string.
///
- public enum SlideType
+ public enum SlideInType
{
///
- /// No slide.
+ /// No slide.
///
None,
///
- /// Shift slide to next note on same string
+ /// Slide into the note from below on the same string.
///
- Shift,
+ IntoFromBelow,
///
- /// Legato slide to next note on same string.
+ /// Slide into the note from above on the same string.
///
- Legato,
+ IntoFromAbove
+ }
+
+ ///
+ /// This public enum lists all different types of finger slide-outs on a string.
+ ///
+ public enum SlideOutType
+ {
+ ///
+ /// No slide.
+ ///
+ None,
///
- /// Slide into the note from below on the same string.
+ /// Shift slide to next note on same string
///
- IntoFromBelow,
+ Shift,
///
- /// Slide into the note from above on the same string.
+ /// Legato slide to next note on same string.
///
- IntoFromAbove,
+ Legato,
///
/// Slide out from the note from upwards on the same string.
diff --git a/Source/AlphaTab/Rendering/Effects/PickSlideEffectInfo.cs b/Source/AlphaTab/Rendering/Effects/PickSlideEffectInfo.cs
index b59b25517..4c7e4f1d0 100644
--- a/Source/AlphaTab/Rendering/Effects/PickSlideEffectInfo.cs
+++ b/Source/AlphaTab/Rendering/Effects/PickSlideEffectInfo.cs
@@ -9,7 +9,7 @@ internal class PickSlideEffectInfo : NoteEffectInfoBase
protected override bool ShouldCreateGlyphForNote(Note note)
{
- return note.SlideType == SlideType.PickSlideDown || note.SlideType == SlideType.PickSlideUp;
+ return note.SlideOutType == SlideOutType.PickSlideDown || note.SlideOutType == SlideOutType.PickSlideUp;
}
public override EffectBarGlyphSizing SizingMode => EffectBarGlyphSizing.GroupedOnBeat;
diff --git a/Source/AlphaTab/Rendering/Glyphs/NoteHeadGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/NoteHeadGlyph.cs
index 45537a603..47f5718a8 100644
--- a/Source/AlphaTab/Rendering/Glyphs/NoteHeadGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/NoteHeadGlyph.cs
@@ -7,7 +7,7 @@ internal class NoteHeadGlyph : MusicFontGlyph
{
public const float GraceScale = 0.75f;
public const float NoteHeadHeight = 9;
- public const int QuarterNoteHeadWidth = 8;
+ public const int QuarterNoteHeadWidth = 10;
private readonly bool _isGrace;
private readonly Duration _duration;
diff --git a/Source/AlphaTab/Rendering/Glyphs/ScoreBeatContainerGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/ScoreBeatContainerGlyph.cs
index df11880f7..29b9e5c64 100644
--- a/Source/AlphaTab/Rendering/Glyphs/ScoreBeatContainerGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/ScoreBeatContainerGlyph.cs
@@ -65,7 +65,7 @@ protected override void CreateTies(Note n)
return;
}
- // NOTE: we create 2 tie glyphs if we have a line break inbetween
+ // NOTE: we create 2 tie glyphs if we have a line break inbetween
// the two notes
if (n.IsTieOrigin && !n.HasBend && !n.Beat.HasWhammyBar && n.Beat.GraceType != GraceType.BendGrace &&
n.TieDestination != null && n.TieDestination.IsVisible)
@@ -82,9 +82,9 @@ protected override void CreateTies(Note n)
// TODO: depending on the type we have other positioning
// we should place glyphs in the preNotesGlyph or postNotesGlyph if needed
- if (n.SlideType != SlideType.None)
+ if (n.SlideInType != SlideInType.None || n.SlideOutType != SlideOutType.None)
{
- var l = new ScoreSlideLineGlyph(n.SlideType, n, this);
+ var l = new ScoreSlideLineGlyph(n.SlideInType, n.SlideOutType, n, this);
Ties.Add(l);
}
diff --git a/Source/AlphaTab/Rendering/Glyphs/ScoreBeatPreNotesGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/ScoreBeatPreNotesGlyph.cs
index a318bc2c6..32a70fe68 100644
--- a/Source/AlphaTab/Rendering/Glyphs/ScoreBeatPreNotesGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/ScoreBeatPreNotesGlyph.cs
@@ -7,6 +7,8 @@ internal class ScoreBeatPreNotesGlyph : BeatGlyphBase
private BendNoteHeadGroupGlyph _prebends;
public float PrebendNoteHeadOffset => _prebends.X + _prebends.NoteHeadOffset;
+ public AccidentalGroupGlyph Accidentals { get; private set; }
+
public override void DoLayout()
{
if (!Container.Beat.IsRest)
@@ -71,6 +73,7 @@ public override void DoLayout()
if (!accidentals.IsEmpty)
{
+ Accidentals = accidentals;
AddGlyph(accidentals);
AddGlyph(new SpacingGlyph(0,
0,
diff --git a/Source/AlphaTab/Rendering/Glyphs/ScoreNoteChordGlyphBase.cs b/Source/AlphaTab/Rendering/Glyphs/ScoreNoteChordGlyphBase.cs
index dc04997ae..bff9d9408 100644
--- a/Source/AlphaTab/Rendering/Glyphs/ScoreNoteChordGlyphBase.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/ScoreNoteChordGlyphBase.cs
@@ -69,6 +69,7 @@ public override void DoLayout()
var anyDisplaced = false;
var direction = Direction;
+ var lineOffset = Scale * 1.5f;
var w = 0f;
for (int i = 0, j = _infos.Count; i < j; i++)
{
@@ -79,7 +80,7 @@ public override void DoLayout()
var displace = false;
if (i == 0)
{
- displacedX = g.Width;
+ displacedX = g.Width - lineOffset;
}
else
{
@@ -90,7 +91,7 @@ public override void DoLayout()
if (!lastDisplaced)
{
displace = true;
- g.X = displacedX - Scale;
+ g.X = displacedX;
anyDisplaced = true;
lastDisplaced = true; // let next iteration know we are displace now
}
@@ -123,7 +124,7 @@ public override void DoLayout()
g.X += NoteStartX;
lastLine = _infos[i].Line;
- w = Math.Max(w, g.X + g.Width);
+ w = Math.Max(w, g.X + g.Width - lineOffset);
}
if (anyDisplaced)
diff --git a/Source/AlphaTab/Rendering/Glyphs/ScoreSlideLineGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/ScoreSlideLineGlyph.cs
index e5467f62e..e80a4ba9f 100644
--- a/Source/AlphaTab/Rendering/Glyphs/ScoreSlideLineGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/ScoreSlideLineGlyph.cs
@@ -6,14 +6,16 @@ namespace AlphaTab.Rendering.Glyphs
{
internal class ScoreSlideLineGlyph : Glyph
{
+ private readonly SlideOutType _outType;
+ private readonly SlideInType _inType;
private readonly Note _startNote;
- private readonly SlideType _type;
private readonly BeatContainerGlyph _parent;
- public ScoreSlideLineGlyph(SlideType type, Note startNote, BeatContainerGlyph parent)
+ public ScoreSlideLineGlyph(SlideInType inType, SlideOutType outType, Note startNote, BeatContainerGlyph parent)
: base(0, 0)
{
- _type = type;
+ _outType = outType;
+ _inType = inType;
_startNote = startNote;
_parent = parent;
}
@@ -24,9 +26,67 @@ public override void DoLayout()
}
public override void Paint(float cx, float cy, ICanvas canvas)
+ {
+ PaintSlideIn(cx, cy, canvas);
+ DrawSlideOut(cx, cy, canvas);
+ }
+
+ private void PaintSlideIn(float cx, float cy, ICanvas canvas)
{
var startNoteRenderer = (ScoreBarRenderer)Renderer;
+ var sizeX = 12 * Scale;
+ var offsetX = 1 * Scale;
+ float startX;
+ float startY;
+ float endX;
+ float endY;
+
+ switch (_inType)
+ {
+ case SlideInType.IntoFromBelow:
+ endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false) - offsetX;
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
+ NoteHeadGlyph.NoteHeadHeight / 2;
+
+ startX = endX - sizeX;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
+ NoteHeadGlyph.NoteHeadHeight;
+ break;
+ case SlideInType.IntoFromAbove:
+ endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false) - offsetX;
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
+ NoteHeadGlyph.NoteHeadHeight / 2;
+
+ startX = endX - sizeX;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true);
+ break;
+ default:
+ return;
+ }
+
+ var accidentalsWidth = GetAccidentalsWidth(startNoteRenderer, _startNote.Beat);
+ startX -= accidentalsWidth;
+ endX -= accidentalsWidth;
+
+ PaintSlideLine(canvas, false, startX, endX, startY, endY);
+ }
+
+
+ private float GetAccidentalsWidth(ScoreBarRenderer renderer, Beat beat)
+ {
+ var preNotes = (ScoreBeatPreNotesGlyph)renderer.GetPreNotesGlyphForBeat(beat);
+ if (preNotes != null && preNotes.Accidentals != null)
+ {
+ return preNotes.Accidentals.Width;
+ }
+
+ return 0;
+ }
+
+ private void DrawSlideOut(float cx, float cy, ICanvas canvas)
+ {
+ var startNoteRenderer = (ScoreBarRenderer)Renderer;
var sizeX = 12 * Scale;
var offsetX = 1 * Scale;
float startX;
@@ -35,10 +95,10 @@ public override void Paint(float cx, float cy, ICanvas canvas)
float endY;
var waves = false;
- switch (_type)
+ switch (_outType)
{
- case SlideType.Shift:
- case SlideType.Legato:
+ case SlideOutType.Shift:
+ case SlideOutType.Legato:
startX = cx + startNoteRenderer.X +
startNoteRenderer.GetBeatX(_startNote.Beat, BeatXPosition.PostNotes) + offsetX;
var isUp = _startNote.SlideTarget.RealValue > _startNote.RealValue;
@@ -86,62 +146,62 @@ public override void Paint(float cx, float cy, ICanvas canvas)
}
break;
- case SlideType.IntoFromBelow:
- endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false) - offsetX;
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
- NoteHeadGlyph.NoteHeadHeight / 2;
-
- startX = endX - sizeX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
- NoteHeadGlyph.NoteHeadHeight;
- break;
- case SlideType.IntoFromAbove:
- endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false) - offsetX;
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
- NoteHeadGlyph.NoteHeadHeight / 2;
-
- startX = endX - sizeX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
- break;
- case SlideType.OutUp:
- startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
+ case SlideOutType.OutUp:
+ startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX * 2;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
NoteHeadGlyph.NoteHeadHeight / 2;
endX = startX + sizeX;
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true);
break;
- case SlideType.OutDown:
- startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
+ case SlideOutType.OutDown:
+ startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX * 2;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
NoteHeadGlyph.NoteHeadHeight / 2;
endX = startX + sizeX;
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
NoteHeadGlyph.NoteHeadHeight;
break;
- case SlideType.PickSlideUp:
- startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
+ case SlideOutType.PickSlideUp:
+ startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX * 2;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
NoteHeadGlyph.NoteHeadHeight / 2;
- endX = cx + startNoteRenderer.X +
- startNoteRenderer.GetBeatX(_startNote.Beat, BeatXPosition.EndBeat);
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) -
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) -
NoteHeadGlyph.NoteHeadHeight;
+ endX = cx + startNoteRenderer.X + startNoteRenderer.Width;
+
+ if (_startNote.Beat.NextBeat != null && _startNote.Beat.NextBeat.Voice == _startNote.Beat.Voice)
+ {
+ endX = cx + startNoteRenderer.X +
+ startNoteRenderer.GetBeatX(_startNote.Beat.NextBeat, BeatXPosition.PreNotes);
+ }
+
waves = true;
break;
- case SlideType.PickSlideDown:
- startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) -
+ case SlideOutType.PickSlideDown:
+ startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote) + offsetX * 2;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) -
NoteHeadGlyph.NoteHeadHeight / 2;
- endX = cx + startNoteRenderer.X +
- startNoteRenderer.GetBeatX(_startNote.Beat, BeatXPosition.EndBeat);
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) +
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote, true) +
NoteHeadGlyph.NoteHeadHeight;
+ endX = cx + startNoteRenderer.X + startNoteRenderer.Width;
+
+ if (_startNote.Beat.NextBeat != null && _startNote.Beat.NextBeat.Voice == _startNote.Beat.Voice)
+ {
+ endX = cx + startNoteRenderer.X +
+ startNoteRenderer.GetBeatX(_startNote.Beat.NextBeat, BeatXPosition.PreNotes);
+ }
+
waves = true;
break;
default:
return;
}
+ PaintSlideLine(canvas, waves, startX, endX, startY, endY);
+ }
+
+ private void PaintSlideLine(ICanvas canvas, bool waves, float startX, float endX, float startY, float endY)
+ {
if (waves)
{
var b = endX - startX;
diff --git a/Source/AlphaTab/Rendering/Glyphs/TabBeatContainerGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/TabBeatContainerGlyph.cs
index 3104e8e25..6746779fb 100644
--- a/Source/AlphaTab/Rendering/Glyphs/TabBeatContainerGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/TabBeatContainerGlyph.cs
@@ -87,9 +87,9 @@ protected override void CreateTies(Note n)
}
}
- if (n.SlideType != SlideType.None)
+ if (n.SlideInType != SlideInType.None || n.SlideOutType != SlideOutType.None)
{
- var l = new TabSlideLineGlyph(n.SlideType, n, this);
+ var l = new TabSlideLineGlyph(n.SlideInType, n.SlideOutType, n, this);
Ties.Add(l);
}
diff --git a/Source/AlphaTab/Rendering/Glyphs/TabSlideLineGlyph.cs b/Source/AlphaTab/Rendering/Glyphs/TabSlideLineGlyph.cs
index dcb5663e8..cdec3e267 100644
--- a/Source/AlphaTab/Rendering/Glyphs/TabSlideLineGlyph.cs
+++ b/Source/AlphaTab/Rendering/Glyphs/TabSlideLineGlyph.cs
@@ -6,14 +6,16 @@ namespace AlphaTab.Rendering.Glyphs
{
internal class TabSlideLineGlyph : Glyph
{
+ private readonly SlideInType _inType;
+ private readonly SlideOutType _outType;
private readonly Note _startNote;
- private readonly SlideType _type;
private readonly BeatContainerGlyph _parent;
- public TabSlideLineGlyph(SlideType type, Note startNote, BeatContainerGlyph parent)
+ public TabSlideLineGlyph(SlideInType inType, SlideOutType outType, Note startNote, BeatContainerGlyph parent)
: base(0, 0)
{
- _type = type;
+ _inType = inType;
+ _outType = outType;
_startNote = startNote;
_parent = parent;
}
@@ -24,6 +26,47 @@ public override void DoLayout()
}
public override void Paint(float cx, float cy, ICanvas canvas)
+ {
+ PaintSlideIn(cx, cy, canvas);
+ PaintSlideOut(cx, cy, canvas);
+ }
+
+ private void PaintSlideIn(float cx, float cy, ICanvas canvas)
+ {
+ var startNoteRenderer = (TabBarRenderer)Renderer;
+
+ var sizeX = 12 * Scale;
+ var sizeY = 3 * Scale;
+ float startX;
+ float startY;
+ float endX;
+ float endY;
+
+ switch (_inType)
+ {
+ case SlideInType.IntoFromBelow:
+ endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false);
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
+
+ startX = endX - sizeX;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) + sizeY;
+ break;
+ case SlideInType.IntoFromAbove:
+ endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false);
+ endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
+
+ startX = endX - sizeX;
+ startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) - sizeY;
+ break;
+ default:
+ return;
+ }
+
+ PaintSlideLine(canvas, false, startX, endX, startY, endY);
+ }
+
+
+ private void PaintSlideOut(float cx, float cy, ICanvas canvas)
{
var startNoteRenderer = (TabBarRenderer)Renderer;
@@ -35,10 +78,10 @@ public override void Paint(float cx, float cy, ICanvas canvas)
float endY;
var waves = false;
- switch (_type)
+ switch (_outType)
{
- case SlideType.Shift:
- case SlideType.Legato:
+ case SlideOutType.Shift:
+ case SlideOutType.Legato:
float startOffsetY;
float endOffsetY;
@@ -87,21 +130,7 @@ public override void Paint(float cx, float cy, ICanvas canvas)
break;
- case SlideType.IntoFromBelow:
- endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false);
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
-
- startX = endX - sizeX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) + sizeY;
- break;
- case SlideType.IntoFromAbove:
- endX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote, false);
- endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
-
- startX = endX - sizeX;
- startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) - sizeY;
- break;
- case SlideType.OutUp:
+ case SlideOutType.OutUp:
startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
@@ -109,7 +138,7 @@ public override void Paint(float cx, float cy, ICanvas canvas)
endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) - sizeY;
break;
- case SlideType.OutDown:
+ case SlideOutType.OutDown:
startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote);
@@ -117,7 +146,7 @@ public override void Paint(float cx, float cy, ICanvas canvas)
endY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) + sizeY;
break;
- case SlideType.PickSlideDown:
+ case SlideOutType.PickSlideDown:
startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) - sizeY * 2;
@@ -129,7 +158,7 @@ public override void Paint(float cx, float cy, ICanvas canvas)
waves = true;
break;
- case SlideType.PickSlideUp:
+ case SlideOutType.PickSlideUp:
startX = cx + startNoteRenderer.X + startNoteRenderer.GetNoteX(_startNote);
startY = cy + startNoteRenderer.Y + startNoteRenderer.GetNoteY(_startNote) + sizeY;
@@ -144,6 +173,11 @@ public override void Paint(float cx, float cy, ICanvas canvas)
return;
}
+ PaintSlideLine(canvas, waves, startX, endX, startY, endY);
+ }
+
+ private void PaintSlideLine(ICanvas canvas, bool waves, float startX, float endX, float startY, float endY)
+ {
if (waves)
{
var b = endX - startX;
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Bends.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Bends.png
index 0a010b14e..b6c425b9e 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Bends.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Bends.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Brush.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Brush.png
index c7231d2e4..e64b66f74 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Brush.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Brush.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Chords.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Chords.png
index 00de8defa..441c8442b 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Chords.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Chords.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/FadeIn.png b/TestData/VisualTests/Features/EffectsAndAnnotations/FadeIn.png
index 5a644c4ae..8c6aa764f 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/FadeIn.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/FadeIn.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Fingering.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Fingering.png
index 34d5ef5ef..4fbd4dc63 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Fingering.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Fingering.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/LetRing.png b/TestData/VisualTests/Features/EffectsAndAnnotations/LetRing.png
index 2c836071a..31c797672 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/LetRing.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/LetRing.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/PalmMute.png b/TestData/VisualTests/Features/EffectsAndAnnotations/PalmMute.png
index 016e31c59..f8af6bf1d 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/PalmMute.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/PalmMute.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Slides.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Slides.png
index 155811d96..10c911109 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Slides.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Slides.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Text.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Text.png
index a391be970..8f0ad549b 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Text.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Text.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloBar.png b/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloBar.png
index e2795283e..60e6730f5 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloBar.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloBar.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloPicking.png b/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloPicking.png
index 4884aadc8..5df4460e3 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloPicking.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/TremoloPicking.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Trill.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Trill.png
index f9840878e..6959a4fef 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Trill.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Trill.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/TripletFeel.png b/TestData/VisualTests/Features/EffectsAndAnnotations/TripletFeel.png
index c2458f0d3..e03ecdecc 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/TripletFeel.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/TripletFeel.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Tuplets.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Tuplets.png
index a99a06ca7..c6c509a1e 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Tuplets.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Tuplets.png differ
diff --git a/TestData/VisualTests/Features/EffectsAndAnnotations/Vibrato.png b/TestData/VisualTests/Features/EffectsAndAnnotations/Vibrato.png
index d31246d5c..6085fbe07 100644
Binary files a/TestData/VisualTests/Features/EffectsAndAnnotations/Vibrato.png and b/TestData/VisualTests/Features/EffectsAndAnnotations/Vibrato.png differ
diff --git a/TestData/VisualTests/Features/Layout/HorizontalLayout.png b/TestData/VisualTests/Features/Layout/HorizontalLayout.png
index 9016a3ec5..df8c870a7 100644
Binary files a/TestData/VisualTests/Features/Layout/HorizontalLayout.png and b/TestData/VisualTests/Features/Layout/HorizontalLayout.png differ
diff --git a/TestData/VisualTests/Features/Layout/HorizontalLayoutBar5To8.png b/TestData/VisualTests/Features/Layout/HorizontalLayoutBar5To8.png
index 5eb875cd2..a38509ccf 100644
Binary files a/TestData/VisualTests/Features/Layout/HorizontalLayoutBar5To8.png and b/TestData/VisualTests/Features/Layout/HorizontalLayoutBar5To8.png differ
diff --git a/TestData/VisualTests/Features/Layout/MultiTrack.png b/TestData/VisualTests/Features/Layout/MultiTrack.png
index 1ac43ce9d..2d49cbe84 100644
Binary files a/TestData/VisualTests/Features/Layout/MultiTrack.png and b/TestData/VisualTests/Features/Layout/MultiTrack.png differ
diff --git a/TestData/VisualTests/Features/Layout/PageLayout.png b/TestData/VisualTests/Features/Layout/PageLayout.png
index c6843ef70..58f6978f9 100644
Binary files a/TestData/VisualTests/Features/Layout/PageLayout.png and b/TestData/VisualTests/Features/Layout/PageLayout.png differ
diff --git a/TestData/VisualTests/Features/Layout/PageLayout5BarsPerRow.png b/TestData/VisualTests/Features/Layout/PageLayout5BarsPerRow.png
index 46c8f260d..e294ef189 100644
Binary files a/TestData/VisualTests/Features/Layout/PageLayout5BarsPerRow.png and b/TestData/VisualTests/Features/Layout/PageLayout5BarsPerRow.png differ
diff --git a/TestData/VisualTests/Features/Layout/PageLayoutBar5To8.png b/TestData/VisualTests/Features/Layout/PageLayoutBar5To8.png
index b5f26edb4..cdb09c090 100644
Binary files a/TestData/VisualTests/Features/Layout/PageLayoutBar5To8.png and b/TestData/VisualTests/Features/Layout/PageLayoutBar5To8.png differ
diff --git a/TestData/VisualTests/Features/MusicNotation/Accidentals.png b/TestData/VisualTests/Features/MusicNotation/Accidentals.png
index 6db5f974c..c1541ceeb 100644
Binary files a/TestData/VisualTests/Features/MusicNotation/Accidentals.png and b/TestData/VisualTests/Features/MusicNotation/Accidentals.png differ
diff --git a/TestData/VisualTests/Features/MusicNotation/NotesRestsBeams.png b/TestData/VisualTests/Features/MusicNotation/NotesRestsBeams.png
index b100c01b6..020031ea0 100644
Binary files a/TestData/VisualTests/Features/MusicNotation/NotesRestsBeams.png and b/TestData/VisualTests/Features/MusicNotation/NotesRestsBeams.png differ
diff --git a/TestData/VisualTests/Features/SpecialNotes/DeadNotes.png b/TestData/VisualTests/Features/SpecialNotes/DeadNotes.png
index 0f9b4fa22..907fc0036 100644
Binary files a/TestData/VisualTests/Features/SpecialNotes/DeadNotes.png and b/TestData/VisualTests/Features/SpecialNotes/DeadNotes.png differ
diff --git a/TestData/VisualTests/Features/SpecialNotes/GhostNotes.png b/TestData/VisualTests/Features/SpecialNotes/GhostNotes.png
index 1358b8542..3e934145e 100644
Binary files a/TestData/VisualTests/Features/SpecialNotes/GhostNotes.png and b/TestData/VisualTests/Features/SpecialNotes/GhostNotes.png differ
diff --git a/TestData/VisualTests/Features/SpecialNotes/GraceNotes.png b/TestData/VisualTests/Features/SpecialNotes/GraceNotes.png
index 15b54c227..bb6bb0cc5 100644
Binary files a/TestData/VisualTests/Features/SpecialNotes/GraceNotes.png and b/TestData/VisualTests/Features/SpecialNotes/GraceNotes.png differ
diff --git a/TestData/VisualTests/Features/SpecialNotes/TiedNotes.png b/TestData/VisualTests/Features/SpecialNotes/TiedNotes.png
index 4e89901b9..1c1d11d61 100644
Binary files a/TestData/VisualTests/Features/SpecialNotes/TiedNotes.png and b/TestData/VisualTests/Features/SpecialNotes/TiedNotes.png differ
diff --git a/TestData/VisualTests/Features/SpecialTracks/DrumTabs.png b/TestData/VisualTests/Features/SpecialTracks/DrumTabs.png
index e561a3a40..0075e64e9 100644
Binary files a/TestData/VisualTests/Features/SpecialTracks/DrumTabs.png and b/TestData/VisualTests/Features/SpecialTracks/DrumTabs.png differ
diff --git a/TestData/VisualTests/Features/SpecialTracks/GrandStaff.png b/TestData/VisualTests/Features/SpecialTracks/GrandStaff.png
index 937b908a8..968c10863 100644
Binary files a/TestData/VisualTests/Features/SpecialTracks/GrandStaff.png and b/TestData/VisualTests/Features/SpecialTracks/GrandStaff.png differ