Example #1
0
ReducedFraction quantizeValue(const ReducedFraction &value,
                              const ReducedFraction &raster)
      {
      const auto valueReduced = value.reduced();
      const auto rasterReduced = raster.reduced();
      int valNum = valueReduced.numerator() * rasterReduced.denominator();
      const int rastNum = rasterReduced.numerator() * valueReduced.denominator();
      const int commonDen = valueReduced.denominator() * rasterReduced.denominator();
      valNum = ((valNum + rastNum / 2) / rastNum) * rastNum;
      return ReducedFraction(valNum, commonDen).reduced();
      }
ReducedFraction& ReducedFraction::operator/=(const ReducedFraction& val)
      {
      reduce();
      ReducedFraction value = val;
      value.reduce();

      checkMultiplicationOverflow(numerator_, val.denominator_);
      checkMultiplicationOverflow(denominator_, val.numerator_);
      numerator_ *= val.denominator_;
      denominator_  *= val.numerator_;
      return *this;
      }
ReducedFraction& ReducedFraction::operator-=(const ReducedFraction& val)
      {
      reduce();
      ReducedFraction value = val;
      value.reduce();

      const int tmp = lcm(denominator_, val.denominator_);
      numerator_ = fractionPart(tmp, numerator_, denominator_)
                  - fractionPart(tmp, val.numerator_, val.denominator_);
      denominator_ = tmp;
      return *this;
      }
ReducedFraction& ReducedFraction::operator+=(const ReducedFraction& val)
      {
      preventOverflow();
      ReducedFraction value = val;
      value.preventOverflow();

      const int tmp = lcm(denominator_, val.denominator_);
      numerator_ = fractionPart(tmp, numerator_, denominator_)
                  + fractionPart(tmp, val.numerator_, val.denominator_);
      denominator_ = tmp;
      return *this;
      }
ReducedFraction& ReducedFraction::operator/=(const ReducedFraction& val)
      {
      preventOverflow();
      ReducedFraction value = val;
      value.preventOverflow();

      Q_ASSERT_X(!isMultiplicationOverflow(numerator_, val.denominator_),
                 "ReducedFraction::operator/=", "Multiplication overflow");
      Q_ASSERT_X(!isMultiplicationOverflow(denominator_, val.numerator_),
                 "ReducedFraction::operator/=", "Multiplication overflow");

      numerator_ *= val.denominator_;
      denominator_  *= val.numerator_;
      return *this;
      }
Example #6
0
ReducedFraction findBarStart(const ReducedFraction &time, const TimeSigMap *sigmap)
      {
      int barIndex, beat, tick;
      sigmap->tickValues(time.ticks(), &barIndex, &beat, &tick);
      return ReducedFraction::fromTicks(sigmap->bar2tick(barIndex, 0));
      }
Example #7
0
ReducedFraction endOfBarForTick(const ReducedFraction &tick, const TimeSigMap *sigmap)
      {
      int bar, beat, tickInBar;
      sigmap->tickValues(tick.ticks(), &bar, &beat, &tickInBar);
      return ReducedFraction::fromTicks(sigmap->bar2tick(bar + 1, 0));
      }