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; }
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)); }
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)); }