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;
152 return double(m_num) / double(m_den);
166 m_num = m_num * rhs.m_den + rhs.m_num * m_den;
167 m_den = m_den * rhs.m_den;
183 m_num = m_num * rhs.m_den - rhs.m_num * m_den;
184 m_den = m_den * rhs.m_den;
199 m_num = m_num * rhs.m_num;
200 m_den = m_den * rhs.m_den;
217 if (rhs.m_num == 0) {
218 throw std::invalid_argument(
"Division by zero FractionValue.");
220 m_num = m_num * rhs.m_den;
221 m_den = m_den * rhs.m_num;
231 const NumType g = std::gcd(m_num, m_den);
281 if (targetDenominator == 0) {
288 m_den = targetDenominator;
295 const NumType g = std::gcd(m_num, m_den);
296 const NumType denRed = m_den / g;
297 const NumType numRed = m_num / g;
302 if (targetDenominator % denRed != 0) {
306 const NumType factor = targetDenominator / denRed;
309 m_num = numRed * factor;
310 m_den = targetDenominator;
317#ifndef DOXYGEN_SHOULD_IGNORE_THIS
323[[nodiscard]]
constexpr FractionValue operator+(FractionValue lhs,
const FractionValue& rhs)
329[[nodiscard]]
constexpr FractionValue operator-(FractionValue lhs,
const FractionValue& rhs)
335[[nodiscard]]
constexpr FractionValue operator*(FractionValue lhs,
const FractionValue& rhs)
341[[nodiscard]]
constexpr FractionValue operator/(FractionValue lhs,
const FractionValue& rhs)
351[[nodiscard]]
constexpr bool operator==(
const FractionValue& a,
const FractionValue& b)
353 return a.numerator() * b.denominator() == b.numerator() * a.denominator();
356[[nodiscard]]
constexpr bool operator!=(
const FractionValue& a,
const FractionValue& b)
361[[nodiscard]]
constexpr bool operator<(
const FractionValue& a,
const FractionValue& b)
363 return a.numerator() * b.denominator() < b.numerator() * a.denominator();
366[[nodiscard]]
constexpr bool operator<=(
const FractionValue& a,
const FractionValue& b)
371[[nodiscard]]
constexpr bool operator>(
const FractionValue& a,
const FractionValue& b)
376[[nodiscard]]
constexpr bool operator>=(
const FractionValue& a,
const FractionValue& b)
391 static constexpr size_t NUMERATOR_INDEX = 0;
392 static constexpr size_t DENOMINATOR_INDEX = 1;
400 throw std::invalid_argument(
"mnx::Fraction must have exactly 2 elements.");
453 create_fraction(position);
457 operator Required()
const {
return { fraction() }; }
497 set_measure(measureId);
498 create_position(position);
502 operator Required()
const {
return { measure(), position().fraction() }; }
541 set_halfSteps(halfSteps);
542 set_staffDistance(staffDistance);
546 operator Required()
const {
return { staffDistance(), halfSteps() }; }
549 static Required make(
int staffDistance,
int halfSteps) {
return { staffDistance, halfSteps }; }
629 operator Required()
const {
return { base(), dots() }; }
673 create_duration(noteValue.
base, noteValue.
dots);
677 operator Required()
const {
return { multiple(), duration() }; }
684 {
return multiple() * duration(); }
724 operator Required()
const {
return { count(), unit() }; }
Represents an MNX array, encapsulating property access.
Definition BaseTypes.h:499
size_t size() const
Get the size of the array.
Definition BaseTypes.h:548
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:597
Base class wrapper for all MNX JSON nodes.
Definition BaseTypes.h:198
json_pointer pointer() const
Returns the json_pointer for this node.
Definition BaseTypes.h:260
T parent() const
Returns the parent object for this node.
Definition BaseTypes.h:246
const std::shared_ptr< json > & root() const
Returns the root.
Definition BaseTypes.h:280
Represents a fraction of a whole note, for measuring musical time.
Definition CommonClasses.h:386
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:408
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:396
Represents a musical chromatic interval.
Definition CommonClasses.h:518
static Required make(int staffDistance, int halfSteps)
Create a Required instance for Interval.
Definition CommonClasses.h:549
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:528
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:538
Represents a key signature.
Definition CommonClasses.h:560
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:569
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:584
static Required make(int fifths)
Create a Required instance for KeySignature.
Definition CommonClasses.h:578
Represents a system on a page in a score.
Definition CommonClasses.h:474
static Required make(const std::string &measureId, const FractionValue &position)
Create a Required instance for MeasureRhythmicPosition.
Definition CommonClasses.h:505
MeasureRhythmicPosition(Base &parent, std::string_view key, const std::string &measureId, const FractionValue &position)
Creates a new MeasureRhythmicPosition class as a child of a JSON element.
Definition CommonClasses.h:494
MeasureRhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:484
MNX_REQUIRED_PROPERTY(std::string, measure)
The id of the global measure of this MeasureRhythmicPosition.
MNX_REQUIRED_CHILD(RhythmicPosition, position,(const FractionValue &, position))
The metric position, where 1/4 is a quarter note.
Represents a quantity of symbolic note values=.
Definition CommonClasses.h:649
static Required make(unsigned count, const NoteValue::Required ¬eValue)
Create a Required instance for NoteValueQuantity.
Definition CommonClasses.h:680
MNX_REQUIRED_PROPERTY(unsigned, multiple)
quantity of duration units
MNX_REQUIRED_CHILD(NoteValue, duration,(NoteValueBase, base),(unsigned, dots))
duration unit
NoteValueQuantity(Base &parent, std::string_view key, unsigned count, const NoteValue::Required ¬eValue)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:669
NoteValueQuantity(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:659
Represents a symbolic note value (not necessarily a duration)
Definition CommonClasses.h:599
NoteValue(Base &parent, std::string_view key, NoteValueBase base, unsigned dots=0)
Creates a new Barline class as a child of a JSON element.
Definition CommonClasses.h:619
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:475
NoteValue(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:609
MNX_REQUIRED_PROPERTY(NoteValueBase, base)
the type ("base") of note
static Required make(NoteValueBase base, unsigned dots=0)
Create a Required instance for NoteValue.
Definition CommonClasses.h:632
Represents an MNX object, encapsulating property access.
Definition BaseTypes.h:412
Represents a system on a page in a score.
Definition CommonClasses.h:432
RhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:441
MNX_OPTIONAL_PROPERTY(unsigned, graceIndex)
MNX_REQUIRED_CHILD(Fraction, fraction,(const FractionValue &, value))
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:450
static Required make(const FractionValue &position)
Create a Required instance for RhythmicPosition.
Definition CommonClasses.h:460
Represents the tempo for a global measure.
Definition CommonClasses.h:696
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:706
static Required make(int count, TimeSignatureUnit unit)
Create a Required instance for TimeSignature.
Definition CommonClasses.h:727
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:716
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:68
TimeSignatureUnit
Valid units for the lower numbers of time signatures.
Definition Enumerations.h:317
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:279
constexpr FractionValue()=default
Default constructor initializes the value to 0/1.
constexpr void reduce()
Reduces the fraction to lowest terms using std::gcd.
Definition CommonClasses.h:229
constexpr FractionValue(NumType num, NumType den)
Constructs a fraction from a numerator and denominator.
Definition CommonClasses.h:101
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
constexpr FractionValue 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:163
constexpr FractionValue & operator-=(const FractionValue &rhs)
Subtracts another FractionValue from this one.
Definition CommonClasses.h:180
unsigned NumType
Unsigned integer type used for numerator and denominator.
Definition CommonClasses.h:61
constexpr double toDouble() const
Converts the fraction to floating point double.
Definition CommonClasses.h:151
constexpr FractionValue reduced() const
Returns a copy of the fraction reduced to lowest terms using std::gcd.
Definition CommonClasses.h:242
constexpr FractionValue & operator*=(const FractionValue &rhs)
Multiplies this fraction by another.
Definition CommonClasses.h:197
constexpr NumType numerator() const noexcept
Returns the numerator.
Definition CommonClasses.h:118
constexpr FractionValue & operator/=(const FractionValue &rhs)
Divides this fraction by another.
Definition CommonClasses.h:215
initializer class for Interval
Definition CommonClasses.h:522
int halfSteps
the number of 12-EDO chromatic halfsteps in the interval (negative is down)
Definition CommonClasses.h:524
int staffDistance
the number of diatonic steps in the interval (negative is down)
Definition CommonClasses.h:523
initializer class for KeySignature
Definition CommonClasses.h:564
int fifths
offset from signature with no accidentals
Definition CommonClasses.h:565
initializer class for MeasureRhythmicPosition
Definition CommonClasses.h:478
std::string measureId
the global measure id of the position
Definition CommonClasses.h:479
FractionValue position
the position within the measure
Definition CommonClasses.h:480
initializer class for NoteValueQuantity
Definition CommonClasses.h:653
unsigned count
The quantity of note values.
Definition CommonClasses.h:654
NoteValue::Required noteValue
the note value base to initialize
Definition CommonClasses.h:655
initializer class for NoteValue
Definition CommonClasses.h:603
NoteValueBase base
the note value base to initialize
Definition CommonClasses.h:604
unsigned dots
the number of dots to initialize
Definition CommonClasses.h:605
initializer class for RhythmicPosition
Definition CommonClasses.h:436
FractionValue position
position within a measure
Definition CommonClasses.h:437
initializer class for TimeSignature
Definition CommonClasses.h:700
int count
the number of beats (top number)
Definition CommonClasses.h:701
TimeSignatureUnit unit
the unit value (bottom number)
Definition CommonClasses.h:702