private void DrawOrnaments(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { foreach (Ornament ornament in element.Ornaments) { double yPosition; if (ornament.DefaultYPosition.HasValue) { var yShift = renderer.TenthsToPixels(ornament.DefaultYPosition.Value); yPosition = scoreService.CurrentLinePositions[0] + yShift; } else { yPosition = notePositionY + (ornament.Placement == VerticalPlacement.Above ? -20 : 20); } yPosition = CorrectOrnamentYPositionToAvoidIntersection(renderer, ornament.Placement, renderer.LinespacesToPixels(1), yPosition, element, notePositionY); Mordent mordent = ornament as Mordent; if (mordent != null) { if (renderer.IsSMuFLFont) { renderer.DrawCharacter(mordent.GetCharacter(fontProfile.MusicFont), MusicFontStyles.MusicFont, scoreService.CursorPositionX - element.GetNoteheadWidthPx(renderer) / 2, yPosition, element); } else { renderer.DrawCharacter(fontProfile.MusicFont.MordentShort, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX, yPosition, element); renderer.DrawCharacter(fontProfile.MusicFont.Mordent, MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX + 5.5, yPosition, element); } } } }
private void DrawNote(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { if (element.IsGraceNote || element.IsCueNote) { renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.GraceNoteFont, scoreService.CursorPositionX + 1, notePositionY, element); } else { renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.MusicFont, scoreService.CursorPositionX, notePositionY, element); } measurementService.LastNotePositionX = scoreService.CursorPositionX; element.TextBlockLocation = new Point(scoreService.CursorPositionX, notePositionY); }
private void DrawRepeatSignAsText(ScoreRendererBase renderer, Barline element, double?measureWidth, double shiftX, FontProfile fontProfile) { var positionY = scoreService.CurrentLinePositions[renderer.IsSMuFLFont ? 4 : 2]; renderer.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), MusicFontStyles.StaffFont, scoreService.CursorPositionX + shiftX, positionY, element); }
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 DrawTrills(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { if (element.TrillMark != NoteTrillMark.None) { var placement = element.TrillMark == NoteTrillMark.Above ? VerticalPlacement.Above : VerticalPlacement.Below; double trillPos = CorrectOrnamentYPositionToAvoidIntersection(renderer, placement, renderer.LinespacesToPixels(2), notePositionY, element, notePositionY); renderer.DrawCharacter(fontProfile.MusicFont.Trill, MusicFontStyles.MusicFont, scoreService.CursorPositionX - 1, trillPos, element); } }
private void DrawAccidentals(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { int numberOfSingleAccidentals = Math.Abs(element.Alter) % 2; int numberOfDoubleAccidentals = Convert.ToInt32(Math.Floor((double)(Math.Abs(element.Alter) / 2))); 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 - 8 * numberOfSingleAccidentals - 6 * numberOfDoubleAccidentals; for (int i = 0; i < numberOfSingleAccidentals; i++) { renderer.DrawCharacter(fontProfile.MusicFont.Sharp, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } for (int i = 0; i < numberOfDoubleAccidentals; i++) { renderer.DrawCharacter(fontProfile.MusicFont.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 - 8 * numberOfSingleAccidentals - 6 * numberOfDoubleAccidentals; for (int i = 0; i < numberOfSingleAccidentals; i++) { renderer.DrawCharacter(fontProfile.MusicFont.Flat, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } for (int i = 0; i < numberOfDoubleAccidentals; i++) { renderer.DrawCharacter(fontProfile.MusicFont.DoubleFlat, MusicFontStyles.MusicFont, accPlacement, notePositionY, element); accPlacement += 9; } } if (element.HasNatural == true) { renderer.DrawCharacter(fontProfile.MusicFont.Natural, MusicFontStyles.MusicFont, scoreService.CursorPositionX - 10, notePositionY, element); } }
private void DrawDots(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { if (element.NumberOfDots > 0) { scoreService.CursorPositionX += 16; } for (int i = 0; i < element.NumberOfDots; i++) { renderer.DrawCharacter(fontProfile.MusicFont.AugmentationDot, MusicFontStyles.MusicFont, scoreService.CursorPositionX, notePositionY, element); scoreService.CursorPositionX += 6; } }
/// <summary> /// Renders a Direction using specific score renderer. /// </summary> /// <param name="element">Direction</param> /// <param name="renderer">Score renderer</param> public override void Render(Direction element, ScoreRendererBase renderer, FontProfile fontProfile) { //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.DrawCharacter(note.GetCharacter(fontProfile.MusicFont), 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.DrawCharacter(note.GetNoteFlagCharacter(fontProfile.MusicFont, false), 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 DrawFermataSign(ScoreRendererBase renderer, Note element, double notePositionY, FontProfile fontProfile) { if (element.HasFermataSign) { double ferPosY = scoreService.CurrentLinePositions[0] - renderer.LinespacesToPixels(2.5); while (ferPosY > notePositionY || ferPosY > element.StemEndLocation.Y) { ferPosY -= renderer.LinespacesToPixels(0.5); if (ferPosY < scoreService.CurrentLinePositions[0] - renderer.LinespacesToPixels(4)) { break; } } char fermataVersion = fontProfile.MusicFont.FermataUp; renderer.DrawCharacter(fermataVersion, MusicFontStyles.MusicFont, scoreService.CursorPositionX, ferPosY, element); } }
/// <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, 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); } } }
/// <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; }
public override void Render(Key element, ScoreRendererBase renderer, FontProfile fontProfile) { if (element.Fifths != 0 && 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 } 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 (!IsVirtualKey) { element.TextBlockLocation = new Primitives.Point(scoreService.CursorPositionX, scoreService.CurrentLinePositions[0]); } 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.DrawCharacter(element.GetCharacter(fontProfile.MusicFont), 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; }