/** 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); }
/** 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(); }
/** 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; }
/** Creates new IntRatio from the given IntRatio. */ public IntRatio(IntRatio r) { n = r.n; d = r.d; // No need to simplify until necessary. }
/** 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; }
/** Creates new Rational with the numerator and denominator * from the given IntRatio. */ public Rational(IntRatio r) { _ratio = new IntRatio(r); }
/** 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; }