Sheetmusic Terminology

A visual glossary of the notation elements Sheetmusic4J renders, so you can point at something in a screenshot and know exactly which class/method is responsible for it. Rendered from fxdemo/src/test/resources/xmlsamples/SchbAvMaSample.musicxml (Schubert’s Ave Maria), the same fixture used throughout development.

Annotated notation elements Annotated notation elements

How to Use This When Reporting a Difference

Instead of “the horizontal line above the notes is too low”, say “the beam is too low”, then check the table below for Beam to jump straight to Engraver.computeStemTips / naturalStem. The goal is to skip a round of “what do you mean by X” every time something looks off.

Element Reference

Every element flows through the same three layers: MusicXML to core model to engraving layout to painter. The table gives the concrete name at each stage.

ElementWhat it looks likeMusicXML sourceCore model (core)Layout (engraving.Engraver)Placement typeDrawn by (fxviewer.ScorePainter)
ClefTreble/bass symbol at the start of a staff<clef>Clef, ClefSignclefGlyph(), clefAnchorLineIndex()GlyphPlacement (CLEF_G/F/C)drawGlyph
Key signatureSharps/flats after the clef<key><fifths>KeySignatureplaceKeySignature(), KeySignatureLayoutGlyphPlacement (ACCIDENTAL_SHARP/FLAT)drawGlyph
Time signaturee.g. 4/4 after the key sig<time>TimeSignatureplaceTimeSignature()GlyphPlacement (TIME_DIGIT_09)drawGlyph
BarlineVertical line ending a measure/systemimplicit / <barline>(none)measure loop in layoutStaffRow; SystemBarlineSystemBarlinedrawSystemBarline, drawStaff
Measure (bar)Horizontal span of music between two barlines<measure>Measuremeasure loop in layoutStaffRow; sharedMeasureMinWidths()(implicit, bounded by two SystemBarlines)(none)
NoteheadThe oval note head itself<note><type>Note, NoteTypenoteheadGlyph(), placeNote()GlyphPlacement (NOTEHEAD_BLACK/HALF/WHOLE)drawGlyph
Chord2+ noteheads stacked at the same beat<chord/>Chord (wraps List<Note>)placeElement() Chord branchmultiple GlyphPlacements, one shared StemPlacementdrawGlyph x N
StemVertical line from a noteheadimplicit, or explicit <stem>up/down</stem>Note.stemUp()naturalStem(), computeStemTips() (run-wide flattening + ledger-line clearance), placeNote()StemPlacement(x, y1, y2)drawStem
BeamThick bar(s) joining stems of short notes<beam number="N">begin/continue/end</beam>Beam, Beam.StateprocessBeams(), computeStemTips()BeamPlacementdrawBeam
FlagCurly tail on an unbeamed 8th/16th noteimplicit from <type> when not beamed(none)flagGlyph()GlyphPlacement (FLAG_8TH/16TH_UP/DOWN)drawGlyph
AccidentalSharp/flat/natural directly before a notehead<accidental> (explicit only, see note below)Accidental, Note.displayedAccidental()accidentalGlyph(), hasAccidental()GlyphPlacement (ACCIDENTAL_*)drawGlyph
Augmentation dotSmall dot after a note/rest, extends duration<dot/>Note.dots() / Rest.dots()dot loop in placeNote()/placeElement()GlyphPlacement (AUG_DOT)drawGlyph
RestSymbol for a silent beat<rest/>Rest, NoteTyperestGlyph(), restAnchorStaffStep()GlyphPlacement (REST_WHOLEREST_128TH)drawGlyph
Tuplet number/bracketSmall italic count (e.g. “6”, “3”) over/under a grouped run<time-modification> + <notations><tuplet>TimeModification, TupletupdateTupletCandidates(), TupletRun (tracks the run’s pitch extreme)TupletPlacementdrawTuplet
SlurCurved line over/under a phrase (different pitches)<notations><slur>Slur, Slur.Placementslur matching in placeNote(), SlurStart (tracks pitch extremes spanned)SlurPlacementdrawSlur
TieCurved line joining two notes of the same pitch<tie type="start/stop"/>Note.tieStart()/tieStop()tie matching in placeNote(), PlacedNoteTiePlacementdrawTie
Articulation, staccatoDot directly above/below a notehead<notations><articulations><staccato/>Articulation.STACCATOarticulation loop in placeNote()GlyphPlacement (ARTICULATION_STACCATO)drawGlyph
Articulation, accent> mark above/below a notehead<notations><articulations><accent/>Articulation.ACCENTarticulation loop in placeNote()GlyphPlacement (ARTICULATION_ACCENT)drawGlyph
Dynamicspp, mf, ff, …<direction-type><dynamics>DynamicMark, DirectionType.DynamicplaceDirection() Dynamic branch, dynamicGlyph()GlyphPlacement (DYNAMIC_*)drawGlyph
HairpinOpening/closing wedge (cresc./dim.)<direction-type><wedge>DirectionType.Wedge, WedgeTypeplaceDirection() Wedge branch, WedgeStartHairpinPlacementdrawHairpin
Tempo / words texte.g. “Sehr langsam” above the staff<direction-type><words>DirectionType.WordsplaceDirection() Words branchTextPlacement (MarkingCategory.DIRECTION)drawText
Metronome marke.g. quarter note = 60<metronome>DirectionType.MetronomeplaceDirection() Metronome branch, metronomeText()TextPlacement (MarkingCategory.TEMPO)drawText
Rehearsal markBoxed letter/number (A, B, 12…)<rehearsal>DirectionType.RehearsalplaceDirection() Rehearsal branchTextPlacement, boxed (MarkingCategory.REHEARSAL)drawText
Chord symbolGuitar/piano chord name above the staff (Cmaj7…)<harmony>Harmony, HarmonyKindplaceHarmony()TextPlacement (MarkingCategory.CHORD_SYMBOL)drawText
LyricsSyllables under a vocal line<lyric>Lyric, SyllabicplaceLyrics()TextPlacement (MarkingCategory.LYRIC)drawText
Brace / bracket (“accolade”)Curly/square brace grouping staves at the left<part-group>, or implicit for a multi-staff part (e.g. piano grand staff)PartGroup, GroupSymbolgrand-staff brace + <part-group> bracket logic in layout()BracketPlacementdrawBracket
Part labelInstrument name at the left of a system (e.g. “Piano”)<part-name> / <part-abbreviation>PartemitPartLabel()TextPlacement (MarkingCategory.PART_LABEL)drawText

Notes on a Few Non-Obvious Rules

  • Accidentals are never inferred from pitch. A note’s alter (e.g. -1 for flat) only encodes the sounding pitch, it does not mean the flat should be drawn. Only an explicit <accidental> element in the source causes a glyph to appear. This matches standard MusicXML: the authoring software already decided where accidentals are visually needed (key signature, courtesy, previous note in the measure) and encodes that decision directly.
  • Stem direction prefers the explicit <stem> element over a pitch-based guess, because a beamed run can span notes on both sides of the staff’s middle line, so guessing per note independently can flip direction mid-beam.
  • A beamed run shares one stem length, computed from the highest/lowest notehead across the entire run (not each note’s own pitch), so every stem reaches the same beam height instead of some falling short.
  • Slurs track the pitch extremes of every note they span (not just their two endpoints), so a phrase that arcs up to a peak and back down gets a curve that clears the peak instead of cutting through it.
  • Tuplets and slurs both use MusicXML’s number attribute to pair a start with its matching stop when several are nested/concurrent.
  • “Measure” and “bar” are the same thing, the horizontal span between two barlines. Measure is the American term, bar the British one; the codebase uses Measure throughout (mirroring MusicXML’s <measure>), but bug reports and issues may use either interchangeably.

Source: docs/NOTATION_ELEMENTS.md in the Sheetmusic4J repository.