31#include "Enumerations.h"
62 static_assert(std::is_integral<NumType>::value,
"FractionValue::NumType must be an integral type");
69 typename std::enable_if_t<std::is_signed<T>::value,
int> = 0>
70 constexpr void normalizeSign()
79 template<
typename T = NumType,
80 typename std::enable_if_t<!std::is_signed<T>::value,
int> = 0>
81 constexpr void normalizeSign() {}
102 : m_num(num), m_den(den)
105 throw std::invalid_argument(
"FractionValue: denominator must not be zero.");
129 return m_num / m_den;
139 result.m_num = m_num % m_den;
140 result.m_den = m_den;
161 m_num = m_num * rhs.m_den + rhs.m_num * m_den;
162 m_den = m_den * rhs.m_den;
178 m_num = m_num * rhs.m_den - rhs.m_num * m_den;
179 m_den = m_den * rhs.m_den;
194 m_num = m_num * rhs.m_num;
195 m_den = m_den * rhs.m_den;
212 if (rhs.m_num == 0) {
213 throw std::invalid_argument(
"Division by zero FractionValue.");
215 m_num = m_num * rhs.m_den;
216 m_den = m_den * rhs.m_num;
226 const NumType g = std::gcd(m_num, m_den);
266 if (targetDenominator == 0) {
273 m_den = targetDenominator;
280 const NumType g = std::gcd(m_num, m_den);
281 const NumType denRed = m_den / g;
282 const NumType numRed = m_num / g;
287 if (targetDenominator % denRed != 0) {
291 const NumType factor = targetDenominator / denRed;
294 m_num = numRed * factor;
295 m_den = targetDenominator;
302#ifndef DOXYGEN_SHOULD_IGNORE_THIS
308[[nodiscard]]
constexpr FractionValue operator+(FractionValue lhs,
const FractionValue& rhs)
314[[nodiscard]]
constexpr FractionValue operator-(FractionValue lhs,
const FractionValue& rhs)
320[[nodiscard]]
constexpr FractionValue operator*(FractionValue lhs,
const FractionValue& rhs)
326[[nodiscard]]
inline FractionValue operator/(FractionValue lhs,
const FractionValue& rhs)
336[[nodiscard]]
constexpr bool operator==(
const FractionValue& a,
const FractionValue& b)
338 return a.numerator() * b.denominator() == b.numerator() * a.denominator();
341[[nodiscard]]
constexpr bool operator!=(
const FractionValue& a,
const FractionValue& b)
346[[nodiscard]]
constexpr bool operator<(
const FractionValue& a,
const FractionValue& b)
348 return a.numerator() * b.denominator() < b.numerator() * a.denominator();
351[[nodiscard]]
constexpr bool operator<=(
const FractionValue& a,
const FractionValue& b)
356[[nodiscard]]
constexpr bool operator>(
const FractionValue& a,
const FractionValue& b)
361[[nodiscard]]
constexpr bool operator>=(
const FractionValue& a,
const FractionValue& b)
376 static constexpr size_t NUMERATOR_INDEX = 0;
377 static constexpr size_t DENOMINATOR_INDEX = 1;
385 throw std::invalid_argument(
"mnx::Fraction must have exactly 2 elements.");
432 create_fraction(position);
461 set_measure(measureId);
462 create_position(position);
490 set_halfSteps(halfSteps);
491 set_staffDistance(staffDistance);
556 set_base(noteValue.
base);
557 if (noteValue.
dots) {
558 set_dots(noteValue.
dots);
594 create_duration(noteValue);
603 {
return multiple() * duration(); }
Represents an MNX array, encapsulating property access.
Definition BaseTypes.h:493
size_t size() const
Get the size of the array.
Definition BaseTypes.h:536
std::enable_if_t<!std::is_base_of_v< Base, U >, void > push_back(const U &value)
Append a new value to the array. (Available only for primitive types)
Definition BaseTypes.h:575
Base class wrapper for all MNX JSON nodes.
Definition BaseTypes.h:212
json_pointer pointer() const
Returns the json_pointer for this node.
Definition BaseTypes.h:274
T parent() const
Returns the parent object for this node.
Definition BaseTypes.h:260
const std::shared_ptr< json > & root() const
Returns the root.
Definition BaseTypes.h:294
Represents a fraction of a whole note, for measuring musical time.
Definition CommonClasses.h:371
MNX_ARRAY_ELEMENT_PROPERTY(NumType, denominator, DENOMINATOR_INDEX)
the denominator of the fraction
Fraction(Base &parent, std::string_view key, const FractionValue &value)
Creates a new Array class as a child of a JSON element.
Definition CommonClasses.h:393
MNX_ARRAY_ELEMENT_PROPERTY(NumType, numerator, NUMERATOR_INDEX)
the numerator of the fraction
Fraction(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor to wrap a Fraction instance around existing JSON.
Definition CommonClasses.h:381
Represents a musical chromatic interval.
Definition CommonClasses.h:474
MNX_REQUIRED_PROPERTY(int, halfSteps)
the number of 12-EDO chromatic halfsteps in the interval (negative is down)
Interval(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:477
MNX_REQUIRED_PROPERTY(int, staffDistance)
the number of diatonic steps in the interval (negative is down)
Interval(Base &parent, std::string_view key, int staffDistance, int halfSteps)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:487
Represents a key signature.
Definition CommonClasses.h:503
MNX_OPTIONAL_PROPERTY(std::string, color)
color to use when rendering the key signature
KeySignature(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing KeySignature objects.
Definition CommonClasses.h:506
MNX_REQUIRED_PROPERTY(int, fifths)
offset from signature with no accidentals
KeySignature(Base &parent, std::string_view key, int fifths)
Creates a new KeySignature class as a child of a JSON element.
Definition CommonClasses.h:515
Represents a system on a page in a score.
Definition CommonClasses.h:445
MeasureRhythmicPosition(Base &parent, std::string_view key, int measureId, const FractionValue &position)
Creates a new MeasureRhythmicPosition class as a child of a JSON element.
Definition CommonClasses.h:458
MNX_REQUIRED_PROPERTY(int, measure)
The measure id of the measure of this MeasureRhythmicPosition.
MeasureRhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:448
MNX_REQUIRED_CHILD(RhythmicPosition, position)
The metric position, where 1/4 is a quarter note.
Represents a quantity of symbolic note values=.
Definition CommonClasses.h:577
MNX_REQUIRED_CHILD(NoteValue, duration)
duration unit
MNX_REQUIRED_PROPERTY(unsigned, multiple)
quantity of duration units
NoteValueQuantity(Base &parent, std::string_view key, unsigned count, const NoteValue::Initializer ¬eValue)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:590
NoteValueQuantity(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:580
initializer class for NoteValue
Definition CommonClasses.h:534
Initializer(NoteValueBase inBase, unsigned inDots=0)
constructor
Definition CommonClasses.h:540
unsigned dots
the number of dots to initialize
Definition CommonClasses.h:537
NoteValueBase base
the note value base to initialize
Definition CommonClasses.h:536
Represents a symbolic note value (not necessarily a duration)
Definition CommonClasses.h:530
NoteValue(Base &parent, std::string_view key, const Initializer ¬eValue)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:553
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(unsigned, dots, 0)
the number of dots
unsigned calcNumberOfFlags() const
Calculates the number of flags or beams required by this note value.
Definition Implementations.cpp:198
NoteValue(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:544
MNX_REQUIRED_PROPERTY(NoteValueBase, base)
the type ("base") of note
Represents an MNX object, encapsulating property access.
Definition BaseTypes.h:426
Represents a system on a page in a score.
Definition CommonClasses.h:417
RhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:420
MNX_OPTIONAL_PROPERTY(unsigned, graceIndex)
(0 is the primary, and then count to the left.)
MNX_REQUIRED_CHILD(Fraction, fraction)
The metric position, where 1/4 is a quarter note.
RhythmicPosition(Base &parent, std::string_view key, const FractionValue &position)
Creates a new RhythmicPosition class as a child of a JSON element.
Definition CommonClasses.h:429
Represents the tempo for a global measure.
Definition CommonClasses.h:611
MNX_REQUIRED_PROPERTY(TimeSignatureUnit, unit)
the unit value (bottom number)
TimeSignature(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:614
TimeSignature(Base &parent, std::string_view key, int count, TimeSignatureUnit unit)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:624
MNX_REQUIRED_PROPERTY(int, count)
the number of beats (top number)
object model for MNX format
json::json_pointer json_pointer
JSON pointer class for MNX.
Definition BaseTypes.h:198
TimeSignatureUnit
Valid units for the lower numbers of time signatures.
Definition Enumerations.h:287
NoteValueBase
The note values allowed in MNX.
Definition Enumerations.h:198
Represents a detached arithmetic fraction with normalization.
Definition CommonClasses.h:59
constexpr NumType denominator() const noexcept
Returns the denominator.
Definition CommonClasses.h:121
constexpr bool expressWithDenominator(NumType targetDenominator)
Attempts to express this fraction with the given denominator.
Definition CommonClasses.h:264
constexpr FractionValue()=default
Default constructor initializes the value to 0/1.
FractionValue & operator/=(const FractionValue &rhs)
Divides this fraction by another.
Definition CommonClasses.h:210
constexpr void reduce()
Reduces the fraction to lowest terms using std::gcd.
Definition CommonClasses.h:224
constexpr NumType quotient() const
Returns the integer (whole number) part of the fraction.
Definition CommonClasses.h:127
constexpr FractionValue(NumType value)
Constructs a Fraction object from an integer.
Definition CommonClasses.h:115
static constexpr FractionValue max() noexcept
Constructs the max fractional value.
Definition CommonClasses.h:145
FractionValue constexpr remainder() const
Returns the fractional part of the fraction.
Definition CommonClasses.h:136
constexpr FractionValue & operator+=(const FractionValue &rhs)
Adds another FractionValue to this one.
Definition CommonClasses.h:158
constexpr FractionValue & operator-=(const FractionValue &rhs)
Subtracts another FractionValue from this one.
Definition CommonClasses.h:175
unsigned NumType
Unsigned integer type used for numerator and denominator.
Definition CommonClasses.h:61
FractionValue(NumType num, NumType den)
Constructs a fraction from a numerator and denominator.
Definition CommonClasses.h:101
constexpr FractionValue & operator*=(const FractionValue &rhs)
Multiplies this fraction by another.
Definition CommonClasses.h:192
constexpr NumType numerator() const noexcept
Returns the numerator.
Definition CommonClasses.h:118