Skip to main content

acorde_core/
lib.rs

1//! Platform-agnostic music score data model and command engine (undo/redo), with zero I/O
2//! and zero rendering. Pairs with [`acorde-io`](https://docs.rs/acorde-io) for MusicXML/MIDI/ABC
3//! parsing and [`acorde-layout`](https://docs.rs/acorde-layout) for logical score layout.
4
5pub mod model;
6
7pub use model::arrange::{
8    AccordionAnalysis, AccordionBassMode, AccordionDroneOptions, AccordionDroneResult,
9    AccordionInversion, AccordionLossPolicy, AccordionMelodicVoice, AccordionPattern,
10    AccordionReductionDiagnostic, AccordionReductionOptions, AccordionReductionResult,
11    AccordionSourceMapping, AccordionSwingPolicy, ArrangeResult, GuidedAccordionOptions,
12    GuidedAccordionResult, GuidedArrangeDiagnostic, LayeredAccordionOptions,
13    LayeredAccordionResult, PartCandidate, PositionedAccordionChord, analyze_for_accordion,
14    arrange_for_accordion, arrange_for_accordion_with_options, arrange_with_drone,
15    arrange_with_explicit_chords, arrange_with_layers,
16};
17pub use model::arrange_presets::{
18    AccordionLayerConfig, AccordionLayerResult, AccordionLayerShuffleOptions,
19    AccordionPresetCapabilities, AccordionPresetConfig, AccordionPresetDescription,
20    AccordionPresetResult, AccordionPresetSelection, AccordionPreviousConfig,
21    AccordionShuffleOptions, accordion_preset_capabilities, arrange_accordion_layers,
22    arrange_accordion_preset, arrange_from_resolved_layers, arrange_from_resolved_preset,
23    shuffle_accordion_layers, shuffle_accordion_preset,
24};
25pub use model::authored_chords::{
26    AuthoredChordAnnotation, AuthoredChordDiagnostic, AuthoredChordOptions, AuthoredChordResult,
27    annotate_from_authored_chords,
28};
29pub use model::change_hint::{ChangeHint, ChangeScope};
30pub use model::chord_plan::{
31    BeatFraction, CHORD_PLAN_CONTRACT_VERSION, ChordPlan, ChordPlanCoverage, ChordPlanDiagnostic,
32    ChordPlanEntry, ChordPlanExtractionMode, ChordPlanExtractionOptions, ChordPlanExtractionResult,
33    ChordPlanOrigin, ChordPlanPosition, ChordPlanPresetResult, ChordPlanSource,
34    chord_plan_to_preset_selection, extract_chord_plan,
35};
36pub use model::chord_proposals::{
37    CHORD_PROPOSAL_CONTRACT_VERSION, CHORD_PROPOSAL_MAX_MEASURES, ChordChangedSpan,
38    ChordPresetAssessment, ChordPresetAssessmentResult, ChordProposalArrangementResult,
39    ChordProposalCandidate, ChordProposalDiagnostic, ChordProposalRequest, ChordProposalResult,
40    ResolvedChordProposal, SourceRangeViolation, arrange_from_chord_proposal, assess_chord_presets,
41    suggest_chord_plans,
42};
43pub use model::commands::{
44    AddHairpinCmd, AddMeasureCmd, AddNoteCmd, AddPartCmd, AddPedalCmd, AddPitchCmd, AddSpannerCmd,
45    AddStaffCmd, BatchCmd, Command, CommandStack, CycleEnharmonicSpellingCmd, DeleteMeasureCmd,
46    DeleteNoteCmd, DeletePartCmd, DeleteStaffCmd, DurationScale, ExchangeVoicesCmd,
47    ExplodeChordPitchesCmd, ExplodeVoicesCmd, ImplodeStavesCmd, JoinMeasuresCmd,
48    MoveOrCopyVoiceRangeCmd, NewScoreCmd, PasteRangeCmd, PasteScoreFragmentCmd, PasteVoiceCmd,
49    RealizeChordSymbolsCmd, RemoveScoreViewCmd, RemoveSpannerCmd, RemoveTrailingEmptyMeasuresCmd,
50    ReorderPartsCmd, ResequenceRehearsalMarksCmd, RespellScoreCmd, RespellScoreToKeyCmd,
51    RespellStaffRegionCmd, ScaleVoiceRangeCmd, ScoreFragmentPastePolicy, SetArpeggioCmd,
52    SetBarlineCmd, SetChordSymbolCmd, SetClefCmd, SetCrossStaffCmd, SetCueCmd, SetDurationCmd,
53    SetDynamicCmd, SetExpressionTextCmd, SetFiguredBassCmd, SetFingeringCmd, SetFingeringsCmd,
54    SetGlissandoCmd, SetGraceCmd, SetGuitarBendAlterCmd, SetGuitarBendCurveCmd,
55    SetGuitarTechniqueCmd, SetHarmonyRangeCmd, SetHarpPedalDiagramsCmd, SetHiddenCmd,
56    SetInstrumentDefinitionCmd, SetInstrumentIdCmd, SetKeySignatureCmd, SetLyricCmd,
57    SetMeasureInstrumentChangeCmd, SetMeasureTablatureChangeCmd, SetMeasureTextCmd, SetMetadataCmd,
58    SetMidMeasureClefsCmd, SetMidiInstrumentCmd, SetMultiRestCmd, SetNavigationMarkCmd,
59    SetNoteHeadCmd, SetNotePlacementCmd, SetObjectStyleOverridesCmd, SetOttavaCmd, SetPageBreakCmd,
60    SetPartGroupCmd, SetPartNameCmd, SetPercussionKitCmd, SetRehearsalMarkCmd,
61    SetScoreStyleOverridesCmd, SetScoreTextCmd, SetSectionBreakCmd, SetStaffPresentationCmd,
62    SetStemCmd, SetStringNumberCmd, SetSystemBreakCmd, SetSystemBreakIntervalCmd,
63    SetTabPositionCmd, SetTablatureConfigCmd, SetTechniqueTextCmd, SetTempoAtMeasureCmd,
64    SetTempoCmd, SetTimeSignatureCmd, SetTransposeCmd, SetTupletCmd, SetUnpitchedCmd, SetVoltaCmd,
65    SplitMeasureCmd, ToggleArticulationCmd, ToggleSlurCmd, ToggleTieCmd, ToggleTrillLineCmd,
66    TransposeStaffRegionCmd, TupletScalePolicy, UnrollRepeatsCmd, UpdateSpannerCmd,
67    UpsertScoreViewCmd, command_key, command_label,
68};
69pub use model::duration::Duration;
70pub use model::engine::{EngineHistory, HistoryConflict, HistoryRelation, ScoreEngine};
71pub use model::fragment::{
72    MIN_SUPPORTED_SCORE_FRAGMENT_CONTRACT_VERSION, SCORE_FRAGMENT_CONTRACT_VERSION, ScoreFragment,
73    ScoreFragmentCrossStaffTarget, ScoreFragmentDiagnostic, ScoreFragmentMeasure,
74    ScoreFragmentMeasureAttributes, ScoreFragmentSelection, ScoreFragmentVoice,
75    extract_score_fragment,
76};
77pub use model::free_bass::{
78    AccordionHandLimits, FreeBassDiagnostic, FreeBassOptions, FreeBassPitchMapping, FreeBassResult,
79    split_for_free_bass,
80};
81pub use model::gm::{drum_name, program_name};
82pub use model::harmony::{detect_chord, roman_numeral, roman_numeral_figured};
83pub use model::interval::{Interval, IntervalQuality};
84pub use model::melodic_insert::{
85    MelodicInsertion, MelodicInsertionCandidate, MelodicInsertionContext,
86    MelodicInsertionContextResult, MelodicInsertionDiagnostic, MelodicInsertionKind,
87    MelodicInsertionOptions, MelodicInsertionOutcome, MelodicInsertionResult,
88    MelodicInsertionSelection, MelodicInsertionSource, MelodicLocalKey, MelodicSourceMapping,
89    insert_melodic_notes, insert_melodic_notes_with_context,
90};
91pub use model::musical_diff::{
92    MusicalChange, MusicalChangeKind, MusicalComparisonDiagnostic, MusicalComparisonOptions,
93    MusicalComparisonResult, NoteCorrespondence, StructurePolicy, VoiceAddr, VoiceCorrespondence,
94    compare_musical_positions,
95};
96pub use model::notation::{
97    AccidentalDisplay, Articulation, Barline, BeamState, ChordBarre, ChordDefinition,
98    ChordDefinitionMember, ChordDegree, ChordSymbol, Clef, CrossStaff, Dynamic, FiguredBassFigure,
99    FiguredBassGroup, FingeringSelectionPolicy, GuitarTechnique, HairpinKind, KeySignature, Lyric,
100    NoteHead, OttavaKind, StyledText, TabPosition, TablatureConfig, TextStyle, TimeSignature,
101    TimeSymbol, TupletBoundary, TupletInfo, VerseLyric,
102};
103pub use model::omr::{
104    MAX_OMR_ANNOTATIONS, MAX_OMR_EVENTS_PER_MEASURE, MAX_OMR_MEASURES, MAX_OMR_PAGES,
105    OMR_PROPOSAL_CONTRACT_VERSION, OmrCommandPlan, OmrDiagnostic, OmrDiagnosticKind,
106    OmrMeasureProposal, OmrMeasureTarget, OmrNoteAnnotation, OmrNoteAnnotationProposal,
107    OmrNoteTarget, OmrPage, OmrProposal, OmrRegion, OmrRhythmicEvent, OmrUnresolvedItem,
108};
109pub use model::pitch::{Pitch, Step};
110pub use model::playback::{
111    DynamicTimeline, MAX_PLAYBACK_COMPARISON_EVENTS, MAX_TAB_PERFORMANCE_EVENTS, MetronomeConfig,
112    OFFLINE_RENDER_CONTRACT_VERSION, OfflineRenderDiagnostic, OfflineRenderDiagnosticKind,
113    OfflineRenderFormat, OfflineRenderFrameEvent, OfflineRenderManifest,
114    OfflineRenderMeasureAddress, OfflineRenderNavigationPolicy, OfflineRenderRequest,
115    OfflineRenderResult, OfflineRenderScope, OfflineRenderSemanticEventKind,
116    OfflineRenderSemanticFrameEvent, PLAYBACK_COMPARISON_CONTRACT_VERSION,
117    PLAYBACK_ROUTING_CONTRACT_VERSION, PLAYBACK_TIMING_CORPUS_CONTRACT_VERSION, PlaybackAuxSend,
118    PlaybackBusRoute, PlaybackEffectRoute, PlaybackEvent, PlaybackOptions, PlaybackPosition,
119    PlaybackRealizationProfile, PlaybackRoutingConfig, PlaybackRoutingManifest, PlaybackTimingCase,
120    PlaybackTimingCaseReport, PlaybackTimingCorpusReport, PlaybackTimingMismatch,
121    PlaybackTimingReport, PlaybackTimingTolerance, SharedUnisonPlaybackEvent,
122    TAB_PERFORMANCE_CONTRACT_VERSION, TAB_ROUND_TRIP_CONTRACT_VERSION,
123    TablaturePerformanceDiagnostic, TablaturePerformanceEvent, TablaturePerformanceReport,
124    TablatureRoundTripDiagnostic, TablatureRoundTripReport, build_offline_render_manifest,
125    build_playback_routing_manifest, coalesce_shared_unisons, compare_playback_timing,
126    compute_playback_position, evaluate_playback_timing_corpus, playback_fermata_pauses,
127    project_tablature_performance, tablature_round_trip_report, to_playback_events,
128    to_playback_events_bounded,
129};
130pub use model::repeat::measure_sequence;
131pub use model::scale::{Scale, ScaleKind};
132pub use model::score::{
133    GuitarBendPoint, HarpPedalDiagram, HarpPedalPosition, InstrumentDefinition, InstrumentRange,
134    Measure, MeasureLength, MetronomeMark, MidMeasureClef, MidiAftertouch, MidiControlChange,
135    MidiPitchBend, MidiProgramChange, NamedInstrumentChannel, NotationSpanner, NotationSpannerKind,
136    Note, NoteAddr, ObjectStyleOverride, ObjectStyleTarget, Part, PartGroup, PartGroupSymbol,
137    PercussionInstrument, RegionalTranspositionTarget, RespellPolicy, Score, ScoreChange,
138    ScoreMetadata, ScorePatch, ScoreSettings, ScoreStats, ScoreTemplate, ScoreView,
139    ScoreViewLayoutOverrides, Staff, StaffGroup, StaffKind, StaffNoteheadScheme, StaffPresentation,
140    StyleImportProvenance, TablatureFretMarkStyle, TablatureRhythmDisplay, TieSourceLocation,
141    TimedPedalDirection, ViewStaffKindOverride, ViewStaffRef, ViewStyle, ViewStyleOverride,
142    ViewStyleProperty, ViewTranspositionPolicy, VoiceChannelSwitch, VoltaBracket, apply_patch,
143    assign_tablature_positions, compute_beams, diff, measure_beats_remaining,
144    optimize_tablature_positions, respell_score, respell_score_to_key, respell_staff_region,
145    score_duration_secs, score_duration_secs_region, score_patch, staff_ottava_octave_shifts,
146    suggested_stem_up, transpose, transpose_checked, transpose_staff_region_checked,
147    tuplet_group_ranges, voice_duration_beats,
148};
149pub use model::structural_plan::{
150    STRUCTURAL_CHANGE_PLAN_CONTRACT_VERSION, StructuralChangeDiagnostic,
151    StructuralChangeDiagnosticKind, StructuralChangePlan, StructuralMeasureStructure,
152    plan_structural_change,
153};
154pub use model::validate::{
155    GuitarBendCurveValidationReason, InstrumentDefinitionValidationReason, InstrumentRangeKind,
156    ObjectStyleValidationReason, PercussionInstrumentValidationReason, ScoreViewValidationReason,
157    SpannerEndpoint, StaffPresentationValidationReason, TablatureValidationReason, ValidationError,
158    ValidationReport, ValidationWarning, validate,
159};
160
161/// Current Score JSON schema version produced by this crate.
162pub const SCORE_SCHEMA_VERSION: u32 = 1;
163
164#[derive(Debug, thiserror::Error)]
165pub enum Error {
166    #[error("part index {0} out of range")]
167    PartNotFound(usize),
168    #[error("staff index {0} out of range")]
169    StaffNotFound(usize),
170    #[error("measure index {0} out of range")]
171    MeasureNotFound(usize),
172    #[error("note index {0} out of range")]
173    NoteNotFound(usize),
174    #[error("voice index {0} out of range")]
175    VoiceOutOfRange(usize),
176    #[error("{0}")]
177    InvalidCommand(String),
178    #[error("nothing to undo")]
179    NothingToUndo,
180    #[error("nothing to redo")]
181    NothingToRedo,
182    #[error("clipboard is empty")]
183    ClipboardEmpty,
184    #[error("cannot delete the last staff of a part")]
185    CannotDeleteLastStaff,
186    #[error("invalid patch: {0}")]
187    InvalidPatch(String),
188    #[error("score failed structural validation")]
189    InvalidScore,
190    #[error("engine history base score does not match the supplied score")]
191    HistoryBaseMismatch,
192    #[error("engine history is not a safe append-only extension")]
193    HistoryNotAppendable,
194    #[error("invalid playback comparison tolerance")]
195    InvalidPlaybackComparison,
196    #[error("invalid offline render request")]
197    InvalidOfflineRenderRequest,
198    #[error("invalid playback routing configuration")]
199    InvalidPlaybackRouting,
200    #[error("invalid playback timing corpus")]
201    InvalidPlaybackTimingCorpus,
202    #[error("playback comparison contains too many events ({0})")]
203    PlaybackComparisonTooLarge(usize),
204    #[error("tablature performance projection contains too many events ({0})")]
205    TabPerformanceTooLarge(usize),
206    #[error("tablature round-trip serialization failed: {0}")]
207    TabRoundTripSerialization(String),
208}