Пример #1
0
        private void PerformOnBeamGroups(IEnumerable <BeamGroup> beamGroups, ScoreRendererBase renderer)
        {
            foreach (var beamGroup in beamGroups)
            {
                Note previousNote = null;
                foreach (var member in beamGroup.Members)
                {
                    var currentNote = member as Note;
                    if (currentNote == null)
                    {
                        continue;
                    }

                    var beamPen = renderer.CreatePenFromDefaults(currentNote, "beamThickness", s => s.DefaultBeamThickness);
                    beamPen.Color = currentNote.CoalesceColor(renderer);
                    var beamSpacing = renderer.GetEngravingDefault("beamSpacing") ?? beamPen.Thickness * 0.6;

                    var beamNumber = 1;
                    foreach (var beamType in currentNote.BeamList)
                    {
                        var beamOffset = (beamPen.Thickness + beamSpacing) * (beamNumber - 1) * (currentNote.StemDirection == VerticalDirection.Up ? 1 : -1);

                        var stemEnd = beamGroup.Start.TranslateHorizontallyAndMaintainAngle(beamGroup.Angle, currentNote.StemEndLocation.X - beamGroup.Start.X);
                        currentNote.StemStartLocation = stemEnd;
                        if (beamType == NoteBeamType.ForwardHook || beamType == NoteBeamType.BackwardHook)
                        {
                            var hookLength = beamType == NoteBeamType.ForwardHook ? 6 : -6;
                            var hookEnd    = stemEnd.TranslateByAngleOld(beamGroup.Angle, hookLength);
                            renderer.DrawLine(stemEnd.Translate(0, beamOffset), hookEnd.Translate(0, beamOffset),
                                              beamPen, beamGroup);
                        }
                        else if (previousNote != null && beamType != NoteBeamType.Single && previousNote.BeamList.Count >= beamNumber)
                        {
                            var stemEnd1 = beamGroup.Start.TranslateHorizontallyAndMaintainAngle(beamGroup.Angle, previousNote.StemEndLocation.X - beamGroup.Start.X);
                            renderer.DrawLine(stemEnd1.Translate(0, beamOffset), stemEnd.Translate(0, beamOffset),
                                              beamPen, beamGroup);
                        }
                        beamNumber++;
                    }

                    previousNote = currentNote;
                }
            }
        }