Beispiel #1
0
        /** Creates new Rational with the given numerator and denominator.
         * If denominator is zero (which doesn't make sense), this sets
         * numerator to zero and denominator to 1.
         */
        public Rational(int numerator, int denominator)
        {
            if (denominator == 0) {
            numerator = 0;
            denominator = 1;
              }

              _ratio = new IntRatio(numerator, denominator);
        }
Beispiel #2
0
        /** Set this ratio to this - r
         */
        public void sub(IntRatio r)
        {
            n = n * r.d - r.n * d;
            d = d * r.d;

            // simplify now to avoid overflow problems
            _simplified = false;
            simplify();
            // Must recalculate the double value.
            _gotDoubleValue = false;
        }
        /** Return the duration of this measure.  If this MeasureStartTimeSlice has
         * a following MeasureStartTimeSlice in the Staff, the duration is the start time
         * difference of this measure start and the following measure start.
         * If no following measure start, the duration of this measure is
         * the start time of the last event TimeSlice.  Note that this assumes
         * the last event TimeSlice has zero duration, but this is reasonable
         * since the last event TimeSlice usually just holds a bar line.
         */
        public Rational getDuration()
        {
            if (_duration != null)
            return _duration;

              if ((getIndex() + 1) >= getParentStaff().getMeasureStartCount()) {
            // This is the last measure start
            if (getTimeSliceCount() == 0)
              // No time slices, just set duration to zero
              _duration = new Rational(0, 1);
            else
              // DEBUG: This assumes the event time slices are ordered. Maybe check this.
              _duration = getTimeSlice(getTimeSliceCount() - 1).getStartTime();
              } else {
            // Compute the start time difference between the next measure and this
            // DEBUG: This assumes that the measure start time slices are ordered. Maybe check this.
            IntRatio result = new IntRatio
              (getParentStaff().getMeasureStart(getIndex() + 1).getStartTime());
            result.sub(getStartTime());
            _duration = new Rational(result);
              }

              return _duration;
        }
        public int getSymbolCount()
        {
            if (_symbolPositioner != null)
            return _symbolPositioner.getSymbolCount();

              // Create a new SymbolPositioner and add a position at each quarter note.
              _symbolPositioner = new SymbolPositioner();
              Rational quarter = new Rational(1, 4);
              for (IntRatio r = new IntRatio(0, 1);
               r.compareTo(getDuration()) < 0;
               r.add(quarter)) {
            _symbolPositioner.add(new Rational(r), 0);
              }

              // Go through the entire staff system and for every measure which
              //   has the same start time and duration as this, set its
              //   SymbolPositioner to the new one and call its addToSymbolPositioner
              StaffSystem system = getParentStaff().getParentSystem();
              for (int staffIndex = 0; staffIndex < system.getStaffCount(); ++staffIndex) {
            Staff staff = system.getStaff(staffIndex);
            for (int measureIndex = 0;
             measureIndex < staff.getMeasureStartCount();
             ++measureIndex) {
              MeasureStartTimeSlice measure = staff.getMeasureStart(measureIndex);
              if (measure.getStartTime().Equals(getStartTime()) &&
              measure.getDuration().Equals(getDuration())) {
            // This is an equivalent measure to this one in another
            //   staff (or it is this same measure.
            measure._symbolPositioner = _symbolPositioner;
            measure.addToSymbolPositioner();

            // There should not be any more measures in this staff
            //   with the same start time.
            break;
              }
            }
              }

              return _symbolPositioner.getSymbolCount();
        }
Beispiel #5
0
        /** Set this ratio to this + r
         */
        public void add(IntRatio r)
        {
            n = n * r.d + r.n * d;
            d = d * r.d;

            // simplify now to avoid overflow problems
            _simplified = false;
            simplify();
            // Must recalculate the double value.
            _gotDoubleValue = false;
        }
Beispiel #6
0
 /** Creates new IntRatio from the given IntRatio.
  */
 public IntRatio(IntRatio r)
 {
     n = r.n;
     d = r.d;
     // No need to simplify until necessary.
 }
Beispiel #7
0
        /** Set the value of this IntRatio to the given IntRatio.
         */
        public void set(IntRatio r)
        {
            n = r.n;
            d = r.d;

            // Must recalculate the double value.
            _gotDoubleValue = false;
            // No need to simplify until necessary.
            _simplified = false;
        }
Beispiel #8
0
 /** Creates new Rational with the numerator and denominator
  * from the given IntRatio.
  */
 public Rational(IntRatio r)
 {
     _ratio = new IntRatio(r);
 }
Beispiel #9
0
        /** Return the duration of this staff system.  This is the start time
         * difference between the first and last measure start time slices in the
         * first staff plus the duration of the last measure.  (It is assumed that all
         * staves in the staff system have the same duration.)
         * This is used to compute the screen hotspots of the measure starts.
         */
        public Rational getDuration()
        {
            if (_duration != null)
            return _duration;

              if (getStaffCount() == 0 || getStaff(0).getMeasureStartCount() == 0) {
            // There are no staffs or time slices!  This is unexpected.  Just return 0.
            // DEBUG:  maybe this should be handled more gracefully.
            _duration = new Rational(0, 1);
            return _duration;
              }
              Staff staff = getStaff(0);

              MeasureStartTimeSlice lastMeasureStart =
            staff.getMeasureStart(staff.getMeasureStartCount() - 1);

              IntRatio result = new IntRatio(lastMeasureStart.getStartTime());
              result.sub(getStartTime());
              result.add(lastMeasureStart.getDuration());

              _duration = new Rational(result);
              return _duration;
        }