MNX Document Model
Loading...
Searching...
No Matches
Part.h
1/*
2 * Copyright (C) 2025, Robert Patterson
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22#pragma once
23
24#include "BaseTypes.h"
25#include "Sequence.h"
26
27namespace mnx {
28
33namespace part {
34
40{
41public:
43 Beam(const std::shared_ptr<json>& root, json_pointer pointer)
45 {
46 }
47
51 Beam(Base& parent, std::string_view key)
53 {
54 create_events();
55 }
56
60
61 inline static constexpr std::string_view JsonSchemaTypeName = "beam";
62};
63
68class Clef : public Object
69{
70public:
78
80 Clef(const std::shared_ptr<json>& root, json_pointer pointer)
82 {
83 }
84
91 Clef(Base& parent, std::string_view key, ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment = OttavaAmountOrZero::NoTransposition)
92 : Object(parent, key)
93 {
94 set_sign(clefSign);
95 set_staffPosition(staffPosition);
96 set_or_clear_octave(octaveAdjustment);
97 }
98
100 operator Required() const { return { sign(), staffPosition(), octave() }; }
101
103 static Required make(ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment = OttavaAmountOrZero::NoTransposition)
104 { return { clefSign, staffPosition, octaveAdjustment }; }
105
106 MNX_OPTIONAL_PROPERTY(std::string, color);
107 MNX_OPTIONAL_PROPERTY(std::string, glyph);
109 MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(bool, showOctave, true);
111 MNX_REQUIRED_PROPERTY(int, staffPosition);
112};
113
118class Dynamic : public ContentObject
119{
120public:
122 struct Required
123 {
124 std::string value;
126 };
127
129 Dynamic(const std::shared_ptr<json>& root, json_pointer pointer)
131 {
132 }
133
139 Dynamic(Base& parent, std::string_view key, const std::string& value, const FractionValue& position)
140 : ContentObject(parent, key)
141 {
142 set_value(value);
143 create_position(position);
144 }
145
147 operator Required() const { return { value(), position().fraction() }; }
148
150 static Required make(const std::string& value, const FractionValue& position) { return { value, position }; }
151
152 MNX_OPTIONAL_PROPERTY(std::string, glyph);
154 RhythmicPosition, position,
155 (const FractionValue&, position));
157 MNX_REQUIRED_PROPERTY(std::string, value);
158 MNX_OPTIONAL_PROPERTY(std::string, voice);
159};
160
166{
167public:
176
178 Ottava(const std::shared_ptr<json>& root, json_pointer pointer)
180 {
181 }
182
190 Ottava(Base& parent, std::string_view key, OttavaAmount value, const FractionValue& position, const std::string& endMeasureId, const FractionValue& endPosition)
192 {
193 create_position(position);
194 create_end(endMeasureId, endPosition);
195 set_value(value);
196 }
197
199 operator Required() const
200 {
201 return { value(), position().fraction(), end().measure(), end().position().fraction() };
202 }
203
205 static Required make(OttavaAmount value, const FractionValue& position, const std::string& endMeasureId, const FractionValue& endPosition)
206 { return { value, position, endMeasureId, endPosition }; }
207
209 (const std::string&, measureId), (const FractionValue&, position));
212 (const FractionValue&, position));
215 MNX_OPTIONAL_PROPERTY(std::string, voice);
216};
217
223{
224public:
226 struct Required
227 {
229 };
230
232 KitComponent(const std::shared_ptr<json>& root, json_pointer pointer)
234 {
235 }
236
241 KitComponent(Base& parent, std::string_view key, int staffPosition)
243 {
244 set_staffPosition(staffPosition);
245 }
246
248 operator Required() const { return { staffPosition() }; }
249
251 static Required make(int staffPosition) { return { staffPosition }; }
252
253 MNX_OPTIONAL_PROPERTY(std::string, name);
254 MNX_OPTIONAL_PROPERTY(std::string, sound);
255 MNX_REQUIRED_PROPERTY(int, staffPosition);
256};
257
263{
264public:
270
272 PartTransposition(const std::shared_ptr<json>& root, json_pointer pointer)
274 {
275 }
276
281 PartTransposition(Base& parent, std::string_view key, const Interval::Required& interval)
282 : Object(parent, key)
283 {
284 create_interval(interval.staffDistance, interval.halfSteps);
285 }
286
288 operator Required() const { return { interval() }; }
289
291 static Required make(const Interval::Required& interval) { return { interval }; }
292
294 (int, staffDistance), (int, halfSteps));
295 MNX_OPTIONAL_PROPERTY(int, keyFifthsFlipAt);
296 MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(bool, prefersWrittenPitches, false);
298
302};
303
309{
310public:
318
320 PositionedClef(const std::shared_ptr<json>& root, json_pointer pointer)
322 {
323 }
324
331 PositionedClef(Base& parent, std::string_view key, ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment = OttavaAmountOrZero::NoTransposition)
333 {
334 create_clef(clefSign, staffPosition, octaveAdjustment);
335 }
336
338 operator Required() const { return { clef().sign(), clef().staffPosition(), clef().octave() }; }
339
341 static Required make(ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment = OttavaAmountOrZero::NoTransposition)
342 { return { clefSign, staffPosition, octaveAdjustment }; }
343
345 (ClefSign, clefSign), (int, staffPosition), (OttavaAmountOrZero, octaveAdjustment));
347 (const FractionValue&, position));
349};
350
356{
357public:
358 using ArrayElementObject::ArrayElementObject;
359
363 Measure(Base& parent, std::string_view key)
365 {
366 // required children
367 create_sequences();
368 }
369
375
378 [[nodiscard]] mnx::global::Measure getGlobalMeasure() const;
379
382 [[nodiscard]] std::optional<TimeSignature> calcCurrentTime() const;
383
384 inline static constexpr std::string_view JsonSchemaTypeName = "part-measure";
385};
386
387} // namespace part
388
394{
395public:
396 using ArrayElementObject::ArrayElementObject;
397
401 Part(Base& parent, std::string_view key)
403 {
404 // required children
405 create_measures();
406 }
407
410 MNX_OPTIONAL_PROPERTY(std::string, name);
411 MNX_OPTIONAL_PROPERTY(std::string, shortName);
412 MNX_OPTIONAL_PROPERTY(std::string, smuflFont);
415 (const Interval::Required&, interval));
416
417 inline static constexpr std::string_view JsonSchemaTypeName = "measure-global";
418};
419
420} // namespace mnx
Represents an MNX object that is included as an array element.
Definition BaseTypes.h:664
Represents an MNX array, encapsulating property access.
Definition BaseTypes.h:499
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
Base class for objects that are elements of content arrays.
Definition BaseTypes.h:685
Represents an MNX dictionary, where each key is a user-defined string.
Definition BaseTypes.h:856
Represents a musical chromatic interval.
Definition CommonClasses.h:518
Represents a system on a page in a score.
Definition CommonClasses.h:474
Represents an MNX object, encapsulating property access.
Definition BaseTypes.h:412
Represents a single part in an MNX document.
Definition Part.h:394
MNX_OPTIONAL_CHILD(part::PartTransposition, transposition,(const Interval::Required &, interval))
the instrument transposition for the part
MNX_OPTIONAL_PROPERTY(std::string, name)
Specifies the user-facing full name of this part.
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(int, staves, 1)
The number of staves in this part.
MNX_REQUIRED_CHILD(Array< part::Measure >, measures)
Contains all the musical data for this part.
static constexpr std::string_view JsonSchemaTypeName
required for mapping
Definition Part.h:417
MNX_OPTIONAL_PROPERTY(std::string, smuflFont)
Name of SMuFL-font for notation elements in the part (can be overridden by children)
MNX_OPTIONAL_CHILD(Dictionary< part::KitComponent >, kit)
The definition of a kit of (usually percussion) instruments that are used by the part.
Part(Base &parent, std::string_view key)
Creates a new Part class as a child of a JSON element.
Definition Part.h:401
MNX_OPTIONAL_PROPERTY(std::string, shortName)
Specifies the user-facing abbreviated name of this part.
Represents a system on a page in a score.
Definition CommonClasses.h:432
Represents a single global measure instance within an MNX document.
Definition Global.h:324
Contains information about each level of bea.
Definition Part.h:40
static constexpr std::string_view JsonSchemaTypeName
required for mapping
Definition Part.h:61
Beam(Base &parent, std::string_view key)
Creates a new Beam class as a child of a JSON element.
Definition Part.h:51
MNX_OPTIONAL_CHILD(Array< Beam >, beams)
the beams that comprise the next beam level (may be omitted)
MNX_REQUIRED_CHILD(Array< std::string >, events)
the events that comprise this beam level
Beam(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Beam objects.
Definition Part.h:43
MNX_OPTIONAL_PROPERTY(BeamHookDirection, direction)
the forced direction of a beam hook (if this beam contains one event).
Represents a visible clef in the measure.
Definition Part.h:69
MNX_OPTIONAL_PROPERTY(std::string, color)
color to use when rendering the ending
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(bool, showOctave, true)
if octave is non-zero, this value determines whether the octave should be displayed on the clef
MNX_REQUIRED_PROPERTY(ClefSign, sign)
the clef sign
Clef(Base &parent, std::string_view key, ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment=OttavaAmountOrZero::NoTransposition)
Creates a new Clef class as a child of a JSON element.
Definition Part.h:91
MNX_OPTIONAL_PROPERTY(std::string, glyph)
the specific SMuFL glyph to use for rendering the clef
MNX_REQUIRED_PROPERTY(int, staffPosition)
staff position offset from center of staff (in half-spaces)
Clef(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Clef instances.
Definition Part.h:80
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(OttavaAmountOrZero, octave, OttavaAmountOrZero::NoTransposition)
the number of octaves by which the clef transposes
static Required make(ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment=OttavaAmountOrZero::NoTransposition)
Create a Required instance for Clef.
Definition Part.h:103
Represents a dynamic positioned with the next event in the sequence.
Definition Part.h:119
MNX_REQUIRED_PROPERTY(std::string, value)
The value of the dynamic. Currently the MNX spec allows any string here.
MNX_OPTIONAL_PROPERTY(std::string, glyph)
The SMuFL glyph name (if any)
Dynamic(Base &parent, std::string_view key, const std::string &value, const FractionValue &position)
Creates a new Space class as a child of a JSON element.
Definition Part.h:139
MNX_OPTIONAL_PROPERTY(std::string, voice)
Optionally specify the voice this dynamic applies to.
Dynamic(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Space objects.
Definition Part.h:129
MNX_REQUIRED_CHILD(RhythmicPosition, position,(const FractionValue &, position))
The rhythmic position of the dynamic within the measure.
static Required make(const std::string &value, const FractionValue &position)
Create a Required instance for Dynamic.
Definition Part.h:150
MNX_OPTIONAL_PROPERTY(int, staff)
The staff (within the part) this dynamic applies to.
Describes a single instrument of a drum kit associated with the part.
Definition Part.h:223
MNX_OPTIONAL_PROPERTY(std::string, name)
Human-readable name of the kit component.
static Required make(int staffPosition)
Create a Required instance for KitComponent.
Definition Part.h:251
MNX_OPTIONAL_PROPERTY(std::string, sound)
The sound ID in global.sounds.
MNX_REQUIRED_PROPERTY(int, staffPosition)
The staff position of the kit component, where 0 is the middle line.
KitComponent(Base &parent, std::string_view key, int staffPosition)
Creates a new Clef class as a child of a JSON element.
Definition Part.h:241
KitComponent(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Clef instances.
Definition Part.h:232
Represents a single measure in a part in an MNX document. It contains the majority of the musical inf...
Definition Part.h:356
MNX_OPTIONAL_CHILD(Array< PositionedClef >, clefs)
the clef changes in this bar
Measure(Base &parent, std::string_view key)
Creates a new Measure class as a child of a JSON element.
Definition Part.h:363
MNX_OPTIONAL_CHILD(Array< Dynamic >, dynamics)
the dynamics in this measure
MNX_OPTIONAL_CHILD(Array< Ottava >, ottavas)
the ottavas in this measure
static constexpr std::string_view JsonSchemaTypeName
required for mapping
Definition Part.h:384
MNX_REQUIRED_CHILD(Array< Sequence >, sequences)
sequences that contain all the musical details in each measure
std::optional< TimeSignature > calcCurrentTime() const
Caculates the time signature at this measure.
Definition Implementations.cpp:605
MNX_OPTIONAL_CHILD(Array< Beam >, beams)
the beams in this measure
mnx::global::Measure getGlobalMeasure() const
Returns the global measure for this part measure.
Definition Implementations.cpp:595
Represents an ottava starting with the next event in the sequence.
Definition Part.h:166
static Required make(OttavaAmount value, const FractionValue &position, const std::string &endMeasureId, const FractionValue &endPosition)
Create a Required instance for Ottava.
Definition Part.h:205
MNX_OPTIONAL_PROPERTY(std::string, voice)
Optionally specify the voice this ottava applies to.
Ottava(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Space objects.
Definition Part.h:178
MNX_REQUIRED_CHILD(MeasureRhythmicPosition, end,(const std::string &, measureId),(const FractionValue &, position))
MNX_REQUIRED_PROPERTY(OttavaAmount, value)
The type of ottava (amount of displacement, in octaves)
MNX_REQUIRED_CHILD(RhythmicPosition, position,(const FractionValue &, position))
The start position of the ottava.
Ottava(Base &parent, std::string_view key, OttavaAmount value, const FractionValue &position, const std::string &endMeasureId, const FractionValue &endPosition)
Creates a new Space class as a child of a JSON element.
Definition Part.h:190
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(int, staff, 1)
The staff (within the part) this ottava applies to.
Describes a part's instrument transposition.
Definition Part.h:263
KeySignature::Required calcTransposedKey(const KeySignature::Required &concertKey) const
Calculates and returns the transposed keyFifths value for the input key.
Definition Implementations.cpp:658
MNX_OPTIONAL_PROPERTY(int, keyFifthsFlipAt)
the number of sharps (positive) or flats (negative) at which to simplify the key signature
static Required make(const Interval::Required &interval)
Create a Required instance for PartTransposition.
Definition Part.h:291
MNX_REQUIRED_CHILD(Interval, interval,(int, staffDistance),(int, halfSteps))
the transposition interval
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(bool, prefersWrittenPitches, false)
concert-pitch score. (Examples could be piccolo, double base, glockenspiel, etc.)
PartTransposition(Base &parent, std::string_view key, const Interval::Required &interval)
Creates a new Clef class as a child of a JSON element.
Definition Part.h:281
PartTransposition(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing Clef instances.
Definition Part.h:272
Represents a positioned clef for the measure.
Definition Part.h:309
PositionedClef(Base &parent, std::string_view key, ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment=OttavaAmountOrZero::NoTransposition)
Creates a new PositionedClef class as a child of a JSON element.
Definition Part.h:331
MNX_OPTIONAL_PROPERTY_WITH_DEFAULT(int, staff, 1)
the staff number (for multistaff parts)
MNX_REQUIRED_CHILD(Clef, clef,(ClefSign, clefSign),(int, staffPosition),(OttavaAmountOrZero, octaveAdjustment))
the beats per minute of this tempo marking
PositionedClef(const std::shared_ptr< json > &root, json_pointer pointer)
Constructor for existing PositionedClef instances.
Definition Part.h:320
static Required make(ClefSign clefSign, int staffPosition, OttavaAmountOrZero octaveAdjustment=OttavaAmountOrZero::NoTransposition)
Create a Required instance for PositionedClef.
Definition Part.h:341
MNX_OPTIONAL_CHILD(RhythmicPosition, position,(const FractionValue &, position))
location within the measure of the tempo marking
object model for MNX format
ClefSign
The values available in a clef sign object.
Definition Enumerations.h:94
OttavaAmount
Valid values for ottava amount.
Definition Enumerations.h:223
json::json_pointer json_pointer
JSON pointer class for MNX.
Definition BaseTypes.h:68
OttavaAmountOrZero
Valid values for octave displacment amount, including zero for no transposition.
Definition Enumerations.h:242
@ NoTransposition
No transposition.
BeamHookDirection
The types of jumps.
Definition Enumerations.h:71
Represents a detached arithmetic fraction with normalization.
Definition CommonClasses.h:59
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
initializer class for Clef
Definition Part.h:73
ClefSign clefSign
the type of clef symbol
Definition Part.h:74
OttavaAmountOrZero octaveAdjustment
octave adjustment (NoTransposition when unset)
Definition Part.h:76
int staffPosition
staff position offset from center of staff
Definition Part.h:75
initializer class for Dynamic
Definition Part.h:123
std::string value
the value of the dynamic
Definition Part.h:124
FractionValue position
the position within the measure
Definition Part.h:125
initializer class for KitComponent
Definition Part.h:227
int staffPosition
the staff position of the kit component
Definition Part.h:228
initializer class for Ottava
Definition Part.h:170
FractionValue position
the start position of the ottava
Definition Part.h:172
std::string endMeasureId
the global id of the end measure of the ottava
Definition Part.h:173
FractionValue endPosition
the position within the end measure
Definition Part.h:174
OttavaAmount value
the value (type) of ottava
Definition Part.h:171
initializer class for PartTransposition
Definition Part.h:267
Interval::Required interval
the transposition interval for the part
Definition Part.h:268
initializer class for PositionedClef
Definition Part.h:313
ClefSign clefSign
the type of clef symbol
Definition Part.h:314
int staffPosition
staff position offset from center of staff
Definition Part.h:315
OttavaAmountOrZero octaveAdjustment
the octave adjustment
Definition Part.h:316