private void DrawOrnaments(ScoreRendererBase renderer, Note element, double notePositionY) { foreach (Ornament ornament in element.Ornaments) { double yPositionShift = ornament.DefaultYPosition.HasValue ? renderer.TenthsToPixels(ornament.DefaultYPosition.Value) * -1 : (ornament.Placement == VerticalPlacement.Above ? -20 : 20); Mordent mordent = ornament as Mordent; if (mordent != null) { renderer.DrawString(renderer.Settings.CurrentFont.MordentShort, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX - 2, notePositionY + yPositionShift, element); renderer.DrawString(renderer.Settings.CurrentFont.Mordent, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX + 3.5, notePositionY + yPositionShift, element); } } }
private void DrawNote(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.IsGraceNote || element.IsCueNote) { renderer.DrawString(element.MusicalCharacter, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX + 1, notePositionY + 7, element); } else { renderer.DrawString(element.MusicalCharacter, MusicFontStyles.MusicFont, scoreService.CursorPositionX, notePositionY, element); } measurementService.LastNotePositionX = scoreService.CursorPositionX; element.TextBlockLocation = new Point(scoreService.CursorPositionX, notePositionY); }
public override void Render(Clef element, ScoreRendererBase renderer, FontProfile fontProfile) { if (!(fontProfile.IsSMuFLFont)) { var yPosition = element.OctaveChange > 0 ? scoreService.CurrentLinePositions[0] - renderer.LinespacesToPixels(2) : scoreService.CurrentLinePositions[4] + renderer.LinespacesToPixels(3.5); var octaveChangeText = GetOctaveChangeNumberForPolihymniaFont(element.OctaveChange); renderer.DrawString(octaveChangeText, MusicFontStyles.DirectionFont, element.TextBlockLocation.X + 6, yPosition, element); } //Don't draw clef if it's current clef: if (!WasSystemChanged && element.TypeOfClef == scoreService.CurrentClef.TypeOfClef && element.Pitch == scoreService.CurrentClef.Pitch && element.Line == scoreService.CurrentClef.Line) { return; } element.TextBlockLocation = new Point(scoreService.CursorPositionX, scoreService.CurrentLinePositions[4] - (element.Line - 1) * renderer.Settings.LineSpacing); scoreService.CurrentClef = element; if (element.TypeOfClef == ClefType.Percussion) { DrawPercussionClef(element, renderer); } else { renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.MusicFont, element.TextBlockLocation.X, element.TextBlockLocation.Y, element); } scoreService.CursorPositionX += 20; }
private void DrawLyrics(ScoreRendererBase renderer, Note element) { double versePositionY = scoreService.CurrentLinePositions[4] + 10; //Default value if default-y is not set foreach (Lyrics lyrics in element.Lyrics) { var textPosition = lyrics.DefaultYPosition.HasValue ? scoreService.CurrentLinePositions[0] - renderer.TenthsToPixels(lyrics.DefaultYPosition.Value) : versePositionY; StringBuilder sBuilder = new StringBuilder(); sBuilder.Append(lyrics.Text); //TODO: Dodać do kalkulacji wyliczoną szerokość stringa w poprzednim lyricu i odkomentować :) //A, i jeszcze wtedy wywalić warunek na middleDistance. //double middleDistanceBetweenTwoLyrics = (scoreService.CursorPositionX - renderer.State.LastNoteEndXPosition) / 2.0d; // double hyphenXPosition = scoreService.CursorPositionX - middleDistanceBetweenTwoLyrics; //if ((lyrics.Type == SyllableType.Middle || lyrics.Type == SyllableType.End) && middleDistanceBetweenTwoLyrics > 20) //{ // renderer.DrawString("-", FontStyles.LyricsFont, hyphenXPosition, textPositionY, element); //} //else if (lyrics.Type == SyllableType.Begin || lyrics.Type == SyllableType.Middle) { sBuilder.Append("-"); } renderer.DrawString(sBuilder.ToString(), MusicFontStyles.LyricsFont, scoreService.CursorPositionX, textPosition, lyrics); if (!lyrics.DefaultYPosition.HasValue) { versePositionY += 12; //Move down if default-y is not set } } }
private void DrawFermataSign(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.HasFermataSign) { double ferPos = notePositionY - renderer.Settings.TextBlockHeight; string fermataVersion = renderer.Settings.CurrentFont.FermataUp; renderer.DrawString(fermataVersion, MusicFontStyles.MusicFont, scoreService.CursorPositionX, ferPos, element); } }
private void DrawDots(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.NumberOfDots > 0) { scoreService.CursorPositionX += 16; } for (int i = 0; i < element.NumberOfDots; i++) { renderer.DrawString(renderer.Settings.CurrentFont.Dot, MusicFontStyles.MusicFont, scoreService.CursorPositionX, notePositionY, element); scoreService.CursorPositionX += 6; } }
public override void Render(Key element, ScoreRendererBase renderer) { scoreService.CurrentKey = element; double flatOrSharpPositionY = 0; bool jumpFourth = false; int jumpDirection = 1; int octaveShiftSharp = 0; //In G clef sharps (not flats) should be written an octave higher / W kluczu g krzyżyki (bemole nie) powinny być zapisywane o oktawę wyżej if (scoreService.CurrentClef.TypeOfClef == ClefType.GClef) { octaveShiftSharp = 1; } int octaveShiftFlat = 0; if (scoreService.CurrentClef.TypeOfClef == ClefType.FClef) { octaveShiftFlat = -1; } if (scoreService.CurrentKey.Fifths > 0) { flatOrSharpPositionY = scoreService.CurrentClef.TextBlockLocation.Y + Pitch.StepDistance(scoreService.CurrentClef, Pitch.FromStep(Step.F, scoreService.CurrentClef.Pitch.Octave + octaveShiftSharp)) * (renderer.Settings.LineSpacing / 2); jumpFourth = true; jumpDirection = 1; } else if (scoreService.CurrentKey.Fifths < 0) { flatOrSharpPositionY = scoreService.CurrentClef.TextBlockLocation.Y + Pitch.StepDistance(scoreService.CurrentClef, Pitch.FromStep(Step.B, scoreService.CurrentClef.Pitch.Octave + octaveShiftFlat)) * (renderer.Settings.LineSpacing / 2); jumpFourth = true; jumpDirection = -1; } for (int i = 0; i < Math.Abs(scoreService.CurrentKey.Fifths); i++) { renderer.DrawString(element.MusicalCharacter, MusicFontStyles.MusicFont, scoreService.CursorPositionX, flatOrSharpPositionY, element); if (jumpFourth) { flatOrSharpPositionY += 3 * 3 * jumpDirection; } else { flatOrSharpPositionY += 3 * 4 * jumpDirection; } jumpFourth = !jumpFourth; jumpDirection *= -1; scoreService.CursorPositionX += 8; } scoreService.CursorPositionX += 10; }
public override void Render(Direction element, ScoreRendererBase renderer) { //Performance directions / Wskazówki wykonawcze: double dirPositionY = 0; if (element.Placement == DirectionPlacementType.Custom) { dirPositionY = scoreService.CurrentStaffTop - renderer.TenthsToPixels(element.DefaultYPosition.Value); } else if (element.Placement == DirectionPlacementType.Above) { dirPositionY = 0; } else if (element.Placement == DirectionPlacementType.Below) { dirPositionY = 50; } var metronomeDirection = element as MetronomeDirection; if (metronomeDirection != null) { var note = new Note(metronomeDirection.Tempo.BeatUnit); renderer.DrawString(note.MusicalCharacter, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX, dirPositionY - 8, element); if (metronomeDirection.Tempo.BeatUnit.Denominator > 1) { renderer.DrawLine(scoreService.CursorPositionX + 10, dirPositionY + 9, scoreService.CursorPositionX + 10, dirPositionY - 2, metronomeDirection); if (metronomeDirection.Tempo.BeatUnit.Denominator > 4) { renderer.DrawString(note.NoteFlagCharacter, MusicFontStyles.GraceNoteFont, new Point(scoreService.CursorPositionX + 6, dirPositionY - 24), element); } } renderer.DrawString($" = {metronomeDirection.Tempo.BeatsPerMinute}", MusicFontStyles.DirectionFont, scoreService.CursorPositionX + 12, dirPositionY, element); return; } renderer.DrawString(element.Text, MusicFontStyles.DirectionFont, scoreService.CursorPositionX, dirPositionY, element); }
private void DrawAccidentals(ScoreRendererBase renderer, Note element, double notePositionY, int numberOfSingleAccidentals, int numberOfDoubleAccidentals) { if (element.Alter - scoreService.CurrentKey.StepToAlter(element.Step) - alterationService.Get(element.Step) > 0) { alterationService.Set(element.Step, element.Alter - scoreService.CurrentKey.StepToAlter(element.Step)); double accPlacement = scoreService.CursorPositionX - 9 * numberOfSingleAccidentals - 9 * numberOfDoubleAccidentals; for (int i = 0; i < numberOfSingleAccidentals; i++) { renderer.DrawString(renderer.Settings.CurrentFont.Sharp, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } for (int i = 0; i < numberOfDoubleAccidentals; i++) { renderer.DrawString(renderer.Settings.CurrentFont.DoubleSharp, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } } else if (element.Alter - scoreService.CurrentKey.StepToAlter(element.Step) - alterationService.Get(element.Step) < 0) { alterationService.Set(element.Step, element.Alter - scoreService.CurrentKey.StepToAlter(element.Step)); double accPlacement = scoreService.CursorPositionX - 9 * numberOfSingleAccidentals - 9 * numberOfDoubleAccidentals; for (int i = 0; i < numberOfSingleAccidentals; i++) { renderer.DrawString(renderer.Settings.CurrentFont.Flat, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } for (int i = 0; i < numberOfDoubleAccidentals; i++) { renderer.DrawString(renderer.Settings.CurrentFont.DoubleFlat, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } } if (element.HasNatural == true) { renderer.DrawString(renderer.Settings.CurrentFont.Natural, MusicFontStyles.MusicFont, scoreService.CursorPositionX - 9, notePositionY, element); } }
public override void Render(Clef element, ScoreRendererBase renderer) { if (element.OctaveChange > 0) { renderer.DrawString((8 * element.OctaveChange).ToString(), MusicFontStyles.DirectionFont, element.TextBlockLocation.X + 6, element.TextBlockLocation.Y, element); } if (element.OctaveChange < 0) { renderer.DrawString((8 * element.OctaveChange * -1).ToString(), MusicFontStyles.DirectionFont, element.TextBlockLocation.X + 6, element.TextBlockLocation.Y + 42, element); } //Don't draw clef if it's current clef: if (!WasSystemChanged && element.Pitch == scoreService.CurrentClef.Pitch && element.Line == scoreService.CurrentClef.Line) { return; } element.TextBlockLocation = new Primitives.Point(scoreService.CursorPositionX, scoreService.CurrentLinePositions[4] - 24.4f - (element.Line - 1) * renderer.Settings.LineSpacing); scoreService.CurrentClef = element; renderer.DrawString(element.MusicalCharacter, MusicFontStyles.MusicFont, element.TextBlockLocation.X, element.TextBlockLocation.Y, element); scoreService.CursorPositionX += 20; }
public override void Render(TimeSignature element, ScoreRendererBase renderer) { double timeSignaturePositionY = (scoreService.CurrentLinePositions[0] - 11); if (element.SignatureType == TimeSignatureType.Common) { renderer.DrawString(renderer.Settings.CurrentFont.CommonTime, MusicFontStyles.MusicFont, scoreService.CursorPositionX, timeSignaturePositionY, element); } else if (element.SignatureType == TimeSignatureType.Cut) { renderer.DrawString(renderer.Settings.CurrentFont.CutTime, MusicFontStyles.MusicFont, scoreService.CursorPositionX, timeSignaturePositionY, element); } else { renderer.DrawString(Convert.ToString(element.NumberOfBeats), MusicFontStyles.TimeSignatureFont, scoreService.CursorPositionX, timeSignaturePositionY + 9, element); renderer.DrawString(Convert.ToString(element.TypeOfBeats), MusicFontStyles.TimeSignatureFont, scoreService.CursorPositionX, timeSignaturePositionY + 21, element); } scoreService.CursorPositionX += 20; }
/// <summary> /// Renders time signature symbol with specific score renderer /// </summary> /// <param name="element"></param> /// <param name="renderer"></param> public override void Render(TimeSignature element, ScoreRendererBase renderer, FontProfile fontProfile) { var topLinePosition = scoreService.CurrentLinePositions[0]; if (element.Measure.Elements.FirstOrDefault() == element) { scoreService.CursorPositionX += renderer.LinespacesToPixels(1); //Żeby był lekki margines między kreską taktową a symbolem. Być może ta linijka będzie do usunięcia } if (element.SignatureType != TimeSignatureType.Numbers) { renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.MusicFont, scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(2), element); element.TextBlockLocation = new Primitives.Point(scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(2)); } else { if (renderer.IsSMuFLFont) { renderer.DrawString(fontProfile.MusicFont.BuildTimeSignature(element.NumberOfBeats), MusicFontStyles.MusicFont, scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(1), element); renderer.DrawString(fontProfile.MusicFont.BuildTimeSignature(element.TypeOfBeats), MusicFontStyles.MusicFont, scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(3), element); element.TextBlockLocation = new Primitives.Point(scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(3)); } else { renderer.DrawString(Convert.ToString(element.NumberOfBeats), MusicFontStyles.TimeSignatureFont, scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(2), element); renderer.DrawString(Convert.ToString(element.TypeOfBeats), MusicFontStyles.TimeSignatureFont, scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(4), element); element.TextBlockLocation = new Primitives.Point(scoreService.CursorPositionX, topLinePosition + renderer.LinespacesToPixels(4)); } } scoreService.CursorPositionX += 20; }
private void DrawArticulation(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.Articulation != ArticulationType.None) { double articulationPosition = notePositionY + 10; if (element.ArticulationPlacement == VerticalPlacement.Above) { articulationPosition = notePositionY - 10; } else if (element.ArticulationPlacement == VerticalPlacement.Below) { articulationPosition = notePositionY + 10; } if (element.Articulation == ArticulationType.Staccato) { renderer.DrawString(renderer.Settings.CurrentFont.Dot, MusicFontStyles.MusicFont, scoreService.CursorPositionX + 6, articulationPosition, element); } else if (element.Articulation == ArticulationType.Accent) { renderer.DrawString(">", MusicFontStyles.MiscArticulationFont, scoreService.CursorPositionX + 6, articulationPosition + 16, element); } } }
private void DrawTrills(ScoreRendererBase renderer, Note element, double notePositionY) { if (element.TrillMark != NoteTrillMark.None) { double trillPos = notePositionY - 1; if (element.TrillMark == NoteTrillMark.Above) { trillPos = notePositionY - 1; if (trillPos > scoreService.CurrentLinePositions[0] - renderer.Settings.TextBlockHeight) { trillPos = scoreService.CurrentLinePositions[0] - renderer.Settings.TextBlockHeight - 1.0f; } } else if (element.TrillMark == NoteTrillMark.Below) { trillPos = notePositionY + 10; } renderer.DrawString(renderer.Settings.CurrentFont.Trill, MusicFontStyles.MusicFont, scoreService.CursorPositionX + 6, trillPos, element); } }
private void DrawArticulation(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { if (element.Articulation != ArticulationType.None) { double articulationPosition = notePositionY + 10; if (element.ArticulationPlacement == VerticalPlacement.Above) { articulationPosition = notePositionY - 10; } else if (element.ArticulationPlacement == VerticalPlacement.Below) { articulationPosition = notePositionY + 10; } if (element.Articulation == ArticulationType.Staccato) { renderer.DrawCharacter(fontProfile.MusicFont.AugmentationDot, MusicFontStyles.MusicFont, scoreService.CursorPositionX - 1, articulationPosition, element); } else if (element.Articulation == ArticulationType.Accent) { renderer.DrawString(">", MusicFontStyles.DirectionFont, scoreService.CursorPositionX - 1, articulationPosition + 16, element); } } }
public override void Render(Barline element, ScoreRendererBase renderer) { var partGroup = element.Staff?.Part?.Group; var doNotDraw = partGroup != null && partGroup.GroupBarline == GroupBarlineType.Mensurstrich; var lightPen = new Pen(element.CoalesceColor(renderer), 1); var thickPen = new Pen(element.CoalesceColor(renderer), 3); if (measurementService.LastNoteInMeasureEndXPosition > scoreService.CursorPositionX) { scoreService.CursorPositionX = measurementService.LastNoteInMeasureEndXPosition; } double?measureWidth = GetCursorPositionForCurrentBarline(renderer); if (!renderer.Settings.IgnoreCustomElementPositions && measureWidth.HasValue && element.Location == HorizontalPlacement.Right) { scoreService.CursorPositionX = measureWidth.Value; } else if (element.RepeatSign == RepeatSignType.None) { //If measure width is not set, get barline location from the first staff: if (scoreService.CurrentStaff != scoreService.CurrentScore.FirstStaff) { var correspondingMeasure = scoreService.GetCorrespondingMeasure(scoreService.CurrentMeasure, scoreService.CurrentScore.FirstStaff); if (correspondingMeasure != null) { scoreService.CursorPositionX = correspondingMeasure.BarlineLocationX - 16; } } } if (element.RepeatSign == RepeatSignType.None) { if (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue) { scoreService.CursorPositionX += 16; } if (element.Location == HorizontalPlacement.Right) { measurementService.LastMeasurePositionX = scoreService.CursorPositionX; } if (!doNotDraw) { if (element.Style == BarlineStyle.LightHeavy) { renderer.DrawLine(new Point(scoreService.CursorPositionX - 6, scoreService.CurrentLinePositions[4]), new Point(scoreService.CursorPositionX - 6, scoreService.CurrentLinePositions[0]), lightPen, element); renderer.DrawLine(new Point(scoreService.CursorPositionX - 1.5, scoreService.CurrentLinePositions[4]), new Point(scoreService.CursorPositionX - 1.5, scoreService.CurrentLinePositions[0]), thickPen, element); } else { renderer.DrawLine(new Point(scoreService.CursorPositionX, scoreService.CurrentLinePositions[4]), new Point(scoreService.CursorPositionX, scoreService.CurrentLinePositions[0]), lightPen, element); } } scoreService.CurrentMeasure.BarlineLocationX = scoreService.CursorPositionX; scoreService.CurrentMeasure.Barline = element; if (!IsLastBarline(element) && (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue)) { scoreService.CursorPositionX += 6; } } else if (element.RepeatSign == RepeatSignType.Forward) { if (scoreService.CurrentStaff.Elements.IndexOf(element) > 0) { scoreService.CursorPositionX -= 8; //TODO: Temporary workaround!! } if (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue) { scoreService.CursorPositionX += 2; } if (element.Location == HorizontalPlacement.Right) { measurementService.LastMeasurePositionX = scoreService.CursorPositionX; } renderer.DrawString(renderer.Settings.CurrentFont.RepeatForward, MusicFontStyles.StaffFont, scoreService.CursorPositionX, scoreService.CurrentLinePositions[0] - 15.5f, element); if (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue) { scoreService.CursorPositionX += 20; } } else if (element.RepeatSign == RepeatSignType.Backward) { if (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue) { scoreService.CursorPositionX -= 2; } if (element.Location == HorizontalPlacement.Right) { measurementService.LastMeasurePositionX = scoreService.CursorPositionX; } renderer.DrawString(renderer.Settings.CurrentFont.RepeatBackward, MusicFontStyles.StaffFont, scoreService.CursorPositionX - 17.5, scoreService.CurrentLinePositions[0] - 15, element); if (renderer.Settings.IgnoreCustomElementPositions || !measureWidth.HasValue) { scoreService.CursorPositionX += 6; } } if (element.Location == HorizontalPlacement.Right) //Start new measure only if it's right barline { alterationService.Reset(); scoreService.BeginNewMeasure(); } }
/// <summary> /// Renders a rest with specific score renderer /// </summary> /// <param name="element"></param> /// <param name="renderer"></param> public override void Render(Rest element, ScoreRendererBase renderer, FontProfile fontProfile) { var isOnlyElementInMeasure = element.Measure?.Elements?.OfType <NoteOrRest>().Count() == 1; if (!renderer.Settings.IgnoreCustomElementPositions && element.DefaultXPosition.HasValue) //Jeśli ustalono default-x, to pozycjonuj wg default-x, a nie automatycznie { scoreService.CursorPositionX = measurementService.LastMeasurePositionX + element.DefaultXPosition.Value * renderer.Settings.CustomElementPositionRatio; } else if (isOnlyElementInMeasure && (element.Measure?.Width.HasValue ?? false)) { scoreService.CursorPositionX = measurementService.LastMeasurePositionX + (element.Measure.Width.Value / 2) * renderer.Settings.CustomElementPositionRatio; } if (scoreService.CurrentMeasure.FirstNoteInMeasureXPosition == 0) { scoreService.CurrentMeasure.FirstNoteInMeasureXPosition = scoreService.CursorPositionX; } //If it's second voice, rewind position to the beginning of measure (but only if default-x is not set or is ignored): if (element.Voice > scoreService.CurrentVoice && (renderer.Settings.IgnoreCustomElementPositions || !element.DefaultXPosition.HasValue)) { scoreService.CursorPositionX = scoreService.CurrentMeasure.FirstNoteInMeasureXPosition; measurementService.LastNoteInMeasureEndXPosition = measurementService.LastNoteEndXPosition; } scoreService.CurrentVoice = element.Voice; double restPositionY = scoreService.CurrentLinePositions[0] + (element.DefaultYPosition.HasValue ? renderer.TenthsToPixels(element.DefaultYPosition.Value) : renderer.LinespacesToPixels(2)); renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.MusicFont, scoreService.CursorPositionX, restPositionY, element); measurementService.LastNotePositionX = scoreService.CursorPositionX; element.TextBlockLocation = new Point(scoreService.CursorPositionX, restPositionY); //Draw number of measures for multimeasure rests / Rysuj ilość taktów dla pauz wielotaktowych: if (element.MultiMeasure > 1) { renderer.DrawString(Convert.ToString(element.MultiMeasure), MusicFontStyles.DirectionFont, scoreService.CursorPositionX + 6, restPositionY, element); } //Draw dots / Rysuj kropki: if (element.NumberOfDots > 0) { scoreService.CursorPositionX += 16; } for (int i = 0; i < element.NumberOfDots; i++) { renderer.DrawCharacter(fontProfile.MusicFont.AugmentationDot, MusicFontStyles.MusicFont, scoreService.CursorPositionX, restPositionY, element); scoreService.CursorPositionX += 6; } if (renderer.Settings.IgnoreCustomElementPositions || !element.DefaultXPosition.HasValue) //Pozycjonowanie automatyczne tylko, gdy nie określono default-x { if (element.Duration == RhythmicDuration.Whole) { scoreService.CursorPositionX += 48; } else if (element.Duration == RhythmicDuration.Half) { scoreService.CursorPositionX += 28; } else if (element.Duration == RhythmicDuration.Quarter) { scoreService.CursorPositionX += 17; } else if (element.Duration == RhythmicDuration.Eighth) { scoreService.CursorPositionX += 15; } else { scoreService.CursorPositionX += 14; } } measurementService.LastNoteEndXPosition = scoreService.CursorPositionX; }