private void MoveStemTips() { float staffOriginY = Chords[0].Voice.Staff.Metrics.OriginY; QuaverBeam quaverBeam = null; foreach (Beam beam in Beams) { quaverBeam = beam as QuaverBeam; if (quaverBeam != null) { break; } } Debug.Assert(quaverBeam != null); float tanAlpha = (quaverBeam.RightTopY - quaverBeam.LeftTopY) / (quaverBeam.RightX - quaverBeam.LeftX); foreach (ChordSymbol chord in Chords) { ChordMetrics chordMetrics = ((ChordMetrics)chord.Metrics); StemMetrics stemMetrics = chordMetrics.StemMetrics; // a clone Debug.Assert(chord.Stem.Direction == _stemDirection); // just to be sure. float stemTipDeltaY = ((stemMetrics.OriginX - this._left) * tanAlpha); float stemTipY = quaverBeam.LeftTopY + stemTipDeltaY; chordMetrics.MoveOuterStemTip(stemTipY, _stemDirection); // dont just move the clone! Moves the auxilliaries too. } }
private Beam NewBeam(DurationClass durationClass, float leftX, float rightX, bool isStub) { Beam newBeam = null; switch (durationClass) { case DurationClass.fiveFlags: if (isStub) { newBeam = new FiveFlagsBeamStub(leftX, rightX); } else { newBeam = new FiveFlagsBeam(leftX, rightX); } break; case DurationClass.fourFlags: if (isStub) { newBeam = new FourFlagsBeamStub(leftX, rightX); } else { newBeam = new FourFlagsBeam(leftX, rightX); } break; case DurationClass.threeFlags: if (isStub) { newBeam = new ThreeFlagsBeamStub(leftX, rightX); } else { newBeam = new ThreeFlagsBeam(leftX, rightX); } break; case DurationClass.semiquaver: if (isStub) { newBeam = new SemiquaverBeamStub(leftX, rightX); } else { newBeam = new SemiquaverBeam(leftX, rightX); } break; case DurationClass.quaver: newBeam = new QuaverBeam(leftX, rightX); break; default: Debug.Assert(false, "Illegal beam duration class"); break; } return(newBeam); }
/// <summary> /// Returns a list of HLine representing the outer edge of the outer (=quaver) beam. /// </summary> /// <returns></returns> public List <HLine> OuterEdge() { QuaverBeam qBeam = null; foreach (Beam beam in Beams) { qBeam = beam as QuaverBeam; if (qBeam != null) { break; } } Debug.Assert(qBeam != null); float heightDiff = qBeam.LeftTopY - qBeam.RightTopY; // N.B. old bug. This value should be positive! float stepHeight = (_beamThickness * 0.2F); int nSteps = (int)(heightDiff / stepHeight); if (nSteps < 0) { nSteps *= -1; } stepHeight = heightDiff / nSteps; float stepWidth = (_right - _left) / nSteps; float left = _left; float top = 0F; if (_stemDirection == VerticalDir.up) { top = qBeam.LeftTopY; } else { top = qBeam.LeftTopY + _beamThickness; } float tanAlpha = stepHeight / stepWidth; List <HLine> outerEdge = new List <HLine>(); for (int i = 0; i < nSteps; i++) { outerEdge.Add(new HLine(left, left + stepWidth, top)); left += stepWidth; top -= (stepWidth * tanAlpha); } return(outerEdge); }
private Beam NewBeam(DurationClass durationClass, float leftX, float rightX, bool isStub) { Beam newBeam = null; switch(durationClass) { case DurationClass.fiveFlags: if(isStub) newBeam = new FiveFlagsBeamStub(leftX, rightX); else newBeam = new FiveFlagsBeam(leftX, rightX); break; case DurationClass.fourFlags: if(isStub) newBeam = new FourFlagsBeamStub(leftX, rightX); else newBeam = new FourFlagsBeam(leftX, rightX); break; case DurationClass.threeFlags: if(isStub) newBeam = new ThreeFlagsBeamStub(leftX, rightX); else newBeam = new ThreeFlagsBeam(leftX, rightX); break; case DurationClass.semiquaver: if(isStub) newBeam = new SemiquaverBeamStub(leftX, rightX); else newBeam = new SemiquaverBeam(leftX, rightX); break; case DurationClass.quaver: newBeam = new QuaverBeam(leftX, rightX); break; default: Debug.Assert(false, "Illegal beam duration class"); break; } return newBeam; }