31#include "Enumerations.h"
77 static_assert(std::is_integral<NumType>::value,
"FractionValue::NumType must be an integral type");
84 typename std::enable_if_t<std::is_signed<T>::value,
int> = 0>
85 constexpr void normalizeSign()
94 template<
typename T = NumType,
95 typename std::enable_if_t<!std::is_signed<T>::value,
int> = 0>
96 constexpr void normalizeSign() {}
117 : m_num(num), m_den(den)
120 throw std::invalid_argument(
"FractionValue: denominator must not be zero.");
144 return m_num / m_den;
154 result.m_num = m_num % m_den;
155 result.m_den = m_den;
167 return double(m_num) / double(m_den);
181 m_num = m_num * rhs.m_den + rhs.m_num * m_den;
182 m_den = m_den * rhs.m_den;
198 m_num = m_num * rhs.m_den - rhs.m_num * m_den;
199 m_den = m_den * rhs.m_den;
214 m_num = m_num * rhs.m_num;
215 m_den = m_den * rhs.m_den;
232 if (rhs.m_num == 0) {
233 throw std::invalid_argument(
"Division by zero FractionValue.");
235 m_num = m_num * rhs.m_den;
236 m_den = m_den * rhs.m_num;
246 const NumType g = std::gcd(m_num, m_den);
296 if (targetDenominator == 0) {
303 m_den = targetDenominator;
310 const NumType g = std::gcd(m_num, m_den);
311 const NumType denRed = m_den / g;
312 const NumType numRed = m_num / g;
317 if (targetDenominator % denRed != 0) {
321 const NumType factor = targetDenominator / denRed;
324 m_num = numRed * factor;
325 m_den = targetDenominator;
332#ifndef DOXYGEN_SHOULD_IGNORE_THIS
338[[nodiscard]]
constexpr FractionValue operator+(FractionValue lhs,
const FractionValue& rhs)
344[[nodiscard]]
constexpr FractionValue operator-(FractionValue lhs,
const FractionValue& rhs)
350[[nodiscard]]
constexpr FractionValue operator*(FractionValue lhs,
const FractionValue& rhs)
356[[nodiscard]]
constexpr FractionValue operator/(FractionValue lhs,
const FractionValue& rhs)
366[[nodiscard]]
constexpr bool operator==(
const FractionValue& a,
const FractionValue& b)
368 return a.numerator() * b.denominator() == b.numerator() * a.denominator();
371[[nodiscard]]
constexpr bool operator!=(
const FractionValue& a,
const FractionValue& b)
376[[nodiscard]]
constexpr bool operator<(
const FractionValue& a,
const FractionValue& b)
378 return a.numerator() * b.denominator() < b.numerator() * a.denominator();
381[[nodiscard]]
constexpr bool operator<=(
const FractionValue& a,
const FractionValue& b)
386[[nodiscard]]
constexpr bool operator>(
const FractionValue& a,
const FractionValue& b)
391[[nodiscard]]
constexpr bool operator>=(
const FractionValue& a,
const FractionValue& b)
406 static constexpr size_t NUMERATOR_INDEX = 0;
407 static constexpr size_t DENOMINATOR_INDEX = 1;
415 throw std::invalid_argument(
"mnx::Fraction must have exactly 2 elements.");
467 IdPair(
Base&
parent, std::string_view key,
const std::string& startId,
const std::string& endId)
475 operator Required()
const {
return { start(), end() }; }
478 static Required make(
const std::string& startId,
const std::string& endId) {
return { startId, endId }; }
510 create_fraction(position);
518 create_fraction(position);
522 operator Required()
const {
return { fraction() }; }
536 bool rhsIncludesTrailingGrace =
false);
573 set_measure(measureId);
574 create_position(position);
583 set_measure(measureId);
584 create_position(position);
588 operator Required()
const {
return { measure(), position().fraction() }; }
627 set_halfSteps(halfSteps);
628 set_staffDistance(staffDistance);
632 operator Required()
const {
return { staffDistance(), halfSteps() }; }
635 static Required make(
int staffDistance,
int halfSteps) {
return { staffDistance, halfSteps }; }
715 operator Required()
const {
return { base(), dots() }; }
759 create_duration(noteValue.
base, noteValue.
dots);
763 operator Required()
const {
return { multiple(), duration() }; }
770 {
return multiple() * duration(); }
810 operator Required()
const {
return { count(), unit() }; }
Represents an MNX array, encapsulating property access.
Definition BaseTypes.h:506
size_t size() const
Get the size of the array.
Definition BaseTypes.h:559
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:608
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:283
Defines a fermata.
Definition CommonClasses.h:40
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(FermataDuration, duration, FermataDuration::Auto)
subjective playback duration of the fermata
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(FermataSymbol, symbol, FermataSymbol::Normal)
the style of symbol for the fermata
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(Orientation, orient, Orientation::Auto)
vertical placement of the fermata
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(MarkingUpDownAuto, pointing, MarkingUpDownAuto::Auto)
direction of the fermata symbol
Represents a fraction of a whole note, for measuring musical time.
Definition CommonClasses.h:401
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:423
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:411
Represents a start and end id pair.
Definition CommonClasses.h:447
IdPair(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing id pairs.
Definition CommonClasses.h:457
MNX_REQUIRED_PROPERTY(std::string, end)
the end id of the pair
MNX_REQUIRED_PROPERTY(std::string, start)
the start id of the pair
static Required make(const std::string &startId, const std::string &endId)
Create a Required instance for IdPair.
Definition CommonClasses.h:478
IdPair(Base &parent, std::string_view key, const std::string &startId, const std::string &endId)
Creates a new IdPair class as a child of a JSON element.
Definition CommonClasses.h:467
Represents a musical chromatic interval.
Definition CommonClasses.h:604
static Required make(int staffDistance, int halfSteps)
Create a Required instance for Interval.
Definition CommonClasses.h:635
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:614
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:624
Represents a key signature.
Definition CommonClasses.h:646
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:655
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:670
static Required make(int fifths)
Create a Required instance for KeySignature.
Definition CommonClasses.h:664
Represents a system on a page in a score.
Definition CommonClasses.h:550
static Required make(const std::string &measureId, const FractionValue &position)
Create a Required instance for MeasureRhythmicPosition.
Definition CommonClasses.h:591
MeasureRhythmicPosition(const std::string &measureId, const FractionValue &position)
Creates a stand-alone MeasureRhythmicPosition class unattached to any json document.
Definition CommonClasses.h:580
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:570
MeasureRhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:560
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:735
static Required make(unsigned count, const NoteValue::Required ¬eValue)
Create a Required instance for NoteValueQuantity.
Definition CommonClasses.h:766
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:755
NoteValueQuantity(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:745
Represents a symbolic note value (not necessarily a duration)
Definition CommonClasses.h:685
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:705
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:451
NoteValue(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing NoteValue instances.
Definition CommonClasses.h:695
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:718
Represents an MNX object, encapsulating property access.
Definition BaseTypes.h:415
Object()
Constructor fresh document or detached instance.
Definition BaseTypes.h:418
Represents a system on a page in a score.
Definition CommonClasses.h:489
RhythmicPosition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing rhythmic position instances.
Definition CommonClasses.h:498
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:507
static int compare(const RhythmicPosition &lhs, const RhythmicPosition &rhs, bool rhsIncludesTrailingGrace=false)
Compare two rhythmic positions within the same measure.
Definition Implementations.cpp:516
static Required make(const FractionValue &position)
Create a Required instance for RhythmicPosition.
Definition CommonClasses.h:525
RhythmicPosition(const FractionValue &position)
Creates a stand-alone RhythmicPosition instance unattached to any JSON document.
Definition CommonClasses.h:515
Represents the tempo for a global measure.
Definition CommonClasses.h:782
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:792
static Required make(int count, TimeSignatureUnit unit)
Create a Required instance for TimeSignature.
Definition CommonClasses.h:813
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:802
MNX_REQUIRED_PROPERTY(int, count)
the number of beats (top number)
object model for MNX format
MarkingUpDownAuto
Specifies up or down or auto for a marking symbol.
Definition Enumerations.h:232
@ Auto
determined by consuming property
FermataSymbol
Specifies the symbol style for the fermat.
Definition Enumerations.h:120
@ Normal
standard curved fermata symbol with single dot (the default)
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:390
FermataDuration
Specifies the subjective playback duration of a fermata.
Definition Enumerations.h:105
@ Auto
unspecified (the default)
NoteValueBase
The note values allowed in MNX.
Definition Enumerations.h:260
Orientation
Specifies the vertical visual orientation of a glyph with respect to its corresponding notation.
Definition Enumerations.h:285
@ Auto
the default value determined by implementation
Represents a detached arithmetic fraction with normalization.
Definition CommonClasses.h:74
constexpr NumType denominator() const noexcept
Returns the denominator.
Definition CommonClasses.h:136
constexpr bool expressWithDenominator(NumType targetDenominator)
Attempts to express this fraction with the given denominator.
Definition CommonClasses.h:294
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:244
constexpr FractionValue(NumType num, NumType den)
Constructs a fraction from a numerator and denominator.
Definition CommonClasses.h:116
constexpr NumType quotient() const
Returns the integer (whole number) part of the fraction.
Definition CommonClasses.h:142
constexpr FractionValue(NumType value)
Constructs a Fraction object from an integer.
Definition CommonClasses.h:130
static constexpr FractionValue max() noexcept
Constructs the max fractional value.
Definition CommonClasses.h:160
constexpr FractionValue remainder() const
Returns the fractional part of the fraction.
Definition CommonClasses.h:151
constexpr FractionValue & operator+=(const FractionValue &rhs)
Adds another FractionValue to this one.
Definition CommonClasses.h:178
constexpr FractionValue & operator-=(const FractionValue &rhs)
Subtracts another FractionValue from this one.
Definition CommonClasses.h:195
unsigned NumType
Unsigned integer type used for numerator and denominator.
Definition CommonClasses.h:76
constexpr double toDouble() const
Converts the fraction to floating point double.
Definition CommonClasses.h:166
constexpr FractionValue reduced() const
Returns a copy of the fraction reduced to lowest terms using std::gcd.
Definition CommonClasses.h:257
constexpr FractionValue & operator*=(const FractionValue &rhs)
Multiplies this fraction by another.
Definition CommonClasses.h:212
constexpr NumType numerator() const noexcept
Returns the numerator.
Definition CommonClasses.h:133
constexpr FractionValue & operator/=(const FractionValue &rhs)
Divides this fraction by another.
Definition CommonClasses.h:230
initializer class for IdPair
Definition CommonClasses.h:451
std::string startId
the start id of the pair
Definition CommonClasses.h:452
std::string endId
the end id of the pair
Definition CommonClasses.h:453
initializer class for Interval
Definition CommonClasses.h:608
int halfSteps
the number of 12-EDO chromatic halfsteps in the interval (negative is down)
Definition CommonClasses.h:610
int staffDistance
the number of diatonic steps in the interval (negative is down)
Definition CommonClasses.h:609
initializer class for KeySignature
Definition CommonClasses.h:650
int fifths
offset from signature with no accidentals
Definition CommonClasses.h:651
initializer class for MeasureRhythmicPosition
Definition CommonClasses.h:554
std::string measureId
the global measure id of the position
Definition CommonClasses.h:555
FractionValue position
the position within the measure
Definition CommonClasses.h:556
initializer class for NoteValueQuantity
Definition CommonClasses.h:739
unsigned count
The quantity of note values.
Definition CommonClasses.h:740
NoteValue::Required noteValue
the note value base to initialize
Definition CommonClasses.h:741
initializer class for NoteValue
Definition CommonClasses.h:689
NoteValueBase base
the note value base to initialize
Definition CommonClasses.h:690
unsigned dots
the number of dots to initialize
Definition CommonClasses.h:691
initializer class for RhythmicPosition
Definition CommonClasses.h:493
FractionValue position
position within a measure
Definition CommonClasses.h:494
initializer class for TimeSignature
Definition CommonClasses.h:786
int count
the number of beats (top number)
Definition CommonClasses.h:787
TimeSignatureUnit unit
the unit value (bottom number)
Definition CommonClasses.h:788