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