Beispiel #1
0
        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.
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 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;
 }