mod accidental;
mod chord;
mod chord_tables;
mod duration;
mod interval;
mod note;
mod pitch;
mod rest;
pub use accidental::{Accidental, AccidentalDisplay, AccidentalDisplayType, Microtone};
pub use chord::{Chord, ChordQuality};
pub use duration::{Duration, DurationTuple, DurationType, GraceDuration, Tuplet, TupletFixer};
pub use interval::{
Interval, IntervalQuality, add, convert_diatonic_number_to_step, get_absolute_higher_note,
get_absolute_lower_note, get_written_higher_note, get_written_lower_note, notes_to_interval,
subtract,
};
pub use note::{
Articulation, ArticulationMark, Expression, ExpressionType, Lyric, Note, NoteHead,
NoteHeadType, StemDirection, Tie, TieType, Unpitched, Volume, is_composite_lyric_set,
};
pub use pitch::{Pitch, Step, update_accidental_display};
pub use rest::{FullMeasureRest, Rest};
use num::rational::Ratio;
use thiserror::Error;
pub type Fraction = Ratio<i64>;
#[derive(Debug, Error, Clone, PartialEq)]
pub enum ParseError {
#[error("invalid pitch string: {0}")]
InvalidPitch(String),
#[error("invalid step: {0}")]
InvalidStep(String),
#[error("invalid octave: {0}")]
InvalidOctave(String),
#[error("invalid accidental: {0}")]
InvalidAccidental(String),
#[error("invalid duration type: {0}")]
InvalidDurationType(String),
#[error("invalid interval: {0}")]
InvalidInterval(String),
#[error("invalid time signature: {0}")]
InvalidTimeSignature(String),
}