public override void Render(PrintSuggestion element, ScoreRendererBase renderer) { if (element.IsSystemBreak && renderer.Settings.RenderingMode != ScoreRenderingModes.Panorama) { renderer.BreakSystem(renderer.TenthsToPixels(element.SystemDistance ?? scoreService.CurrentScore.DefaultPageSettings.DefaultSystemDistance ?? 0), element.IsPageBreak); MusicalSymbolRenderStrategyBase strategy = new ClefRenderStrategy(scoreService) { WasSystemChanged = true }; strategy.Render(scoreService.CurrentClef, renderer); strategy = new KeyRenderStrategy(scoreService); strategy.Render(scoreService.CurrentKey, renderer); //Time signature is not rendered in new line. //Render measure number: renderer.DrawString((scoreService.CurrentMeasureNo).ToString(), MusicFontStyles.LyricsFont, new Primitives.Point(0, scoreService.CurrentLinePositions[0] - 25), scoreService.CurrentStaff); } //Issue #44: Jeśli jesteśmy w trybie panoramy, to trzeba uzupełnić line positions dla pozostałych systemów: if (renderer.Settings.RenderingMode == ScoreRenderingModes.Panorama) { var firstSystem = scoreService.Systems.First(); foreach (var system in scoreService.Systems) { system.BuildStaffFragments(firstSystem.LinePositions.ToDictionary(p => scoreService.CurrentScore.Staves[p.Key - 1], p => p.Value)); } } }
public void PerformOnScore(Score score, ScoreRendererBase renderer) { #if DemoVersion foreach (var location in new[] { new Point(0, 0), new Point(renderer.ScoreInformation.Systems.Max(s => s.Width) - 30, 0) }) { renderer.DrawString("DEMO", MusicFontStyles.LyricsFont, location, Color.Red, MusicalSymbol.Null); } #endif }
public static void TupletMark(IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, NoteOrRest element, int beamLoop) { if (measurementService.TupletState == null) { throw new Exception("DrawTupletMark was called but no tuplet is currently open in staff."); } Staff staff = scoreService.CurrentStaff; NoteOrRest firstElementInTuplet = staff.Peek <NoteOrRest>(element, PeekType.BeginningOfTuplet); int index = staff.Elements.IndexOf(firstElementInTuplet); List <MusicalSymbol> elementsUnderTuplet = staff.Elements.GetRange(index, staff.Elements.IndexOf(element) - index); var elementsUnderTupletForAverageStemLength = elementsUnderTuplet.OfType <Note>().Where(n => MusicalSymbol.DirectionToPlacement(n.StemDirection) == measurementService.TupletState.TupletPlacement).ToList(); double averageStemLength = elementsUnderTupletForAverageStemLength.Count == 0 ? 0 : elementsUnderTupletForAverageStemLength.Average(n => n.ActualStemLength); averageStemLength += 10; //Add space int placementMod = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? -1 : 1; double tupletBracketStartXPosition = firstElementInTuplet.TextBlockLocation.X + 6; double tupletBracketStartYPosition = firstElementInTuplet.TextBlockLocation.Y + 25 + averageStemLength * placementMod; double tupletBracketEndXPosition = element.TextBlockLocation.X + 12; double tupletBracketEndYPosition = element.TextBlockLocation.Y + 25 + averageStemLength * placementMod; if (measurementService.TupletState.AreSingleBeamsPresentUnderTuplet) //Draw tuplet bracket { renderer.DrawLine(new Point(tupletBracketStartXPosition, tupletBracketStartYPosition), new Point(tupletBracketEndXPosition, tupletBracketEndYPosition), element); renderer.DrawLine(new Point(tupletBracketStartXPosition, tupletBracketStartYPosition), new Point(tupletBracketStartXPosition, firstElementInTuplet.TextBlockLocation.Y + 25 + (averageStemLength - 4) * placementMod), element); renderer.DrawLine(new Point(tupletBracketEndXPosition, tupletBracketEndYPosition), new Point(tupletBracketEndXPosition, element.TextBlockLocation.Y + 25 + (averageStemLength - 4) * placementMod), element); } double numberOfNotesYTranslation = 0; if (measurementService.TupletState.TupletPlacement == VerticalPlacement.Above) { numberOfNotesYTranslation -= 18; //If text should appear above the tuplet, move a bit to up } //If bracket is not drawn, move up or down to fill space if (!measurementService.TupletState.AreSingleBeamsPresentUnderTuplet) { numberOfNotesYTranslation += 10 * (measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? 1 : -1); } var allElementsUnderTuplet = elementsUnderTuplet.OfType <NoteOrRest>().ToList(); allElementsUnderTuplet.Add(element); var tupletNumber = CalculateTupletNumber(allElementsUnderTuplet); renderer.DrawString(Convert.ToString(tupletNumber), MusicFontStyles.LyricsFont, new Point(tupletBracketStartXPosition + (tupletBracketEndXPosition - tupletBracketStartXPosition) / 2 - 6, tupletBracketStartYPosition + (tupletBracketEndYPosition - tupletBracketStartYPosition) / 2 + numberOfNotesYTranslation), element); }
/// <summary> /// Draws tuplet mark /// </summary> /// <param name="measurementService"></param> /// <param name="scoreService"></param> /// <param name="renderer"></param> /// <param name="element"></param> public static void TupletMark(IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, NoteOrRest element) { if (measurementService.TupletState == null) { throw new Exception("DrawTupletMark was called but no tuplet is currently open in staff."); } var tupletBracketPen = renderer.CreatePenFromDefaults(element, "tupletBracketThickness", s => s.DefaultTupletBracketThickness); Staff staff = scoreService.CurrentStaff; NoteOrRest firstElementInTuplet = staff.Peek <NoteOrRest>(element, PeekType.BeginningOfTuplet); int index = staff.Elements.IndexOf(firstElementInTuplet); List <MusicalSymbol> elementsUnderTuplet = staff.Elements.GetRange(index, staff.Elements.IndexOf(element) - index + 1); var noteGroupBounds = elementsUnderTuplet.OfType <Note>().GetBounds(renderer); if (IsDebugMode) { DrawNoteGroupOutline(renderer, noteGroupBounds, element); } var boundsOnOneSide = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? new Tuple <Point, Point>(noteGroupBounds.NW, noteGroupBounds.NE) : new Tuple <Point, Point>(noteGroupBounds.SW, noteGroupBounds.SE); int placementMod = measurementService.TupletState.TupletPlacement == VerticalPlacement.Above ? -1 : 1; var bracketDefinition = new TupletBracketDefinition( boundsOnOneSide.Item1.X, boundsOnOneSide.Item1.Y + renderer.LinespacesToPixels(2) * placementMod, boundsOnOneSide.Item2.X, boundsOnOneSide.Item2.Y + renderer.LinespacesToPixels(2) * placementMod); if (measurementService.TupletState.AreSingleBeamsPresentUnderTuplet) //Draw tuplet bracket { renderer.DrawLine(bracketDefinition.StartPoint, bracketDefinition.Point25, tupletBracketPen, element); renderer.DrawLine(bracketDefinition.Point75, bracketDefinition.EndPoint, tupletBracketPen, element); renderer.DrawLine(bracketDefinition.StartPoint, bracketDefinition.StartPoint.Translate(0, renderer.LinespacesToPixels(-1) * placementMod), tupletBracketPen, element); renderer.DrawLine(bracketDefinition.EndPoint, bracketDefinition.EndPoint.Translate(0, renderer.LinespacesToPixels(-1) * placementMod), tupletBracketPen, element); } var tupletNumber = CalculateTupletNumber(elementsUnderTuplet.OfType <NoteOrRest>()); var textToWrite = renderer.Settings.MusicFontProfile.MusicFont.BuildTupletNumber(tupletNumber); var fontStyle = renderer.IsSMuFLFont ? MusicFontStyles.MusicFont : MusicFontStyles.LyricsFont; var textSize = renderer.CanMeasureString ? renderer.MeasureString(fontStyle, textToWrite) : new Size(); var textPosition = renderer.CanMeasureString ? bracketDefinition.MidPoint.Translate(textSize.Width / -2, textSize.Height / 2) : bracketDefinition.MidPoint.Translate(-3.7, 4.7); renderer.DrawString(textToWrite, fontStyle, textPosition, element); }
public static void Flag(IBeamingService beamingService, IMeasurementService measurementService, IScoreService scoreService, ScoreRendererBase renderer, Note element, int beamSpaceDirection, int beamNumber, int beamOffset) { //Rysuj chorągiewkę tylko najniższego dźwięku w akordzie //Draw a hook only of the lowest element in a chord double xPos = beamingService.CurrentStemPositionX - 4; if (element.StemDirection == VerticalDirection.Down) { if (element.IsGraceNote || element.IsCueNote) { renderer.DrawString(element.NoteFlagCharacterRev, MusicFontStyles.GraceNoteFont, new Point(xPos, beamingService.CurrentStemEndPositionY + 11), element); } else { renderer.DrawString(element.NoteFlagCharacterRev, MusicFontStyles.MusicFont, new Point(xPos, beamingService.CurrentStemEndPositionY + 7), element); } } else { if (element.IsGraceNote || element.IsCueNote) { renderer.DrawString(element.NoteFlagCharacter, MusicFontStyles.GraceNoteFont, new Point(xPos + 0.5, beamingService.CurrentStemEndPositionY + 6), element); } else { renderer.DrawString(element.NoteFlagCharacter, MusicFontStyles.MusicFont, new Point(xPos, beamingService.CurrentStemEndPositionY - 1), element); } } if (measurementService.TupletState != null) { measurementService.TupletState.AreSingleBeamsPresentUnderTuplet = true; if (element.Tuplet == TupletType.Stop) { TupletMark(measurementService, scoreService, renderer, element, beamNumber); measurementService.TupletState = null; } } }