diff --git a/EXAMPLES.md b/EXAMPLES.md new file mode 100644 index 000000000..0af215ed7 --- /dev/null +++ b/EXAMPLES.md @@ -0,0 +1,294 @@ +- accent-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accent-element/ SKIP: already tested +- accidental-mark-element-notation: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accidental-mark-element-notation/ +- accidental-mark-element-ornament: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accidental-mark-element-ornament/ +- accidental-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accidental-element/ SKIP: already tested +- accordion-high-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accordion-high-element/ SKIP: esoteric +- accordion-low-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accordion-low-element/ SKIP: esoteric +- accordion-middle-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accordion-middle-element/ SKIP: esoteric +- accordion-registration-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/accordion-registration-element/ SKIP: esoteric +- alter-element-microtones: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/alter-element-microtones/ SKIP: esoteric +- alter-element-semitones: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/alter-element-semitones/ SKIP: already tested +- arpeggiate-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/arpeggiate-element/ SKIP: already tested +- arrow-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/arrow-element/ +- arrowhead-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/arrowhead-element/ +- articulations-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/articulations-element/ SKIP: already tested +- artificial-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/artificial-element/ +- assess-and-player-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/assess-and-player-elements/ SKIP: esoteric +- attributes-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/attributes-element/ SKIP: already tested +- backup-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/backup-element/ SKIP: already tested +- barline-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/barline-element/ +- barre-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/barre-element/ SKIP: already tested +- bass-alter-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bass-alter-element/ SKIP: already tested +- bass-separator-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bass-separator-element/ +- bass-step-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bass-step-element/ SKIP: already tested +- beam-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beam-element/ SKIP: already tested +- beat-repeat-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beat-repeat-element/ +- beat-type-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beat-type-element/ SKIP: already tested +- beat-unit-dot-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beat-unit-dot-element/ SKIP: already tested +- beat-unit-tied-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beat-unit-tied-element/ +- beat-unit-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beat-unit-element/ SKIP: already tested +- beater-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beater-element/ SKIP: esoteric +- beats-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/beats-element/ SKIP: already tested +- bend-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bend-element/ SKIP: already tested +- bookmark-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bookmark-element/ SKIP: esoteric +- bracket-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bracket-element/ +- brass-bend-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/brass-bend-element/ +- breath-mark-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/breath-mark-element/ +- caesura-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/caesura-element/ +- cancel-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/cancel-element/ SKIP: already tested +- capo-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/capo-element/ SKIP: esoteric +- chord-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/chord-element/ SKIP: already tested +- chord-element-multiple-stop: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/chord-element-multiple-stop/ SKIP: already tested +- circular-arrow-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/circular-arrow-element/ +- coda-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/coda-element/ +- concert-score-and-for-part-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/concert-score-and-for-part-elements/ SKIP: esoteric +- credit-image-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/credit-image-element/ SKIP: esoteric +- credit-symbol-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/credit-symbol-element/ SKIP: esoteric +- credit-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/credit-element/ SKIP: esoteric +- cue-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/cue-element/ +- damp-all-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/damp-all-element/ SKIP: esoteric +- damp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/damp-element/ SKIP: esoteric +- dashes-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/dashes-element/ +- defaults-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/defaults-element/ SKIP: esoteric +- degree-alter-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/degree-alter-element/ SKIP: already tested +- degree-type-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/degree-type-element/ SKIP: already tested +- degree-value-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/degree-value-element/ SKIP: already tested +- delayed-inverted-turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/delayed-inverted-turn-element/ +- delayed-turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/delayed-turn-element/ +- detached-legato-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/detached-legato-element/ +- divisions-and-duration-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/divisions-and-duration-elements/ SKIP: already tested +- doit-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/doit-element/ +- dot-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/dot-element/ SKIP: already tested +- double-tongue-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/double-tongue-element/ +- double-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/double-element/ SKIP: esoteric +- down-bow-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/down-bow-element/ +- effect-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/effect-element/ SKIP: esoteric +- elision-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/elision-element/ +- end-line-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/end-line-element/ SKIP: esoteric +- end-paragraph-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/end-paragraph-element/ SKIP: esoteric +- ending-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ending-element/ +- ensemble-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ensemble-element/ SKIP: esoteric +- except-voice-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/except-voice-element/ SKIP: esoteric +- extend-element-figure: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/extend-element-figure/ +- extend-element-lyric: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/extend-element-lyric/ +- eyeglasses-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/eyeglasses-element/ SKIP: esoteric +- f-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/f-element/ +- falloff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/falloff-element/ +- fermata-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fermata-element/ SKIP: already tested +- ff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ff-element/ +- fff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fff-element/ +- ffff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ffff-element/ +- fffff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fffff-element/ SKIP: esoteric +- ffffff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ffffff-element/ SKIP: esoteric +- figure-number-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/figure-number-element/ +- fingering-element-frame: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fingering-element-frame/ SKIP: already tested +- fingering-element-notation: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fingering-element-notation/ +- fingernails-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fingernails-element/ SKIP: esoteric +- flip-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/flip-element/ +- footnote-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/footnote-element/ SKIP: esoteric +- forward-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/forward-element/ SKIP: already tested +- fp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fp-element/ +- fret-element-frame: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fret-element-frame/ SKIP: already tested +- fz-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/fz-element/ +- glass-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/glass-element/ SKIP: esoteric +- glissando-element-multiple: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/glissando-element-multiple/ +- glissando-element-single: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/glissando-element-single/ +- glyph-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/glyph-element/ SKIP: esoteric +- golpe-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/golpe-element/ SKIP: esoteric +- grace-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/grace-element/ SKIP: already tested +- grace-element-appoggiatura: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/grace-element-appoggiatura/ SKIP: already tested +- group-abbreviation-display-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/group-abbreviation-display-element/ SKIP: esoteric +- group-abbreviation-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/group-abbreviation-element/ SKIP: esoteric +- group-barline-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/group-barline-element/ SKIP: already tested +- group-name-display-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/group-name-display-element/ SKIP: esoteric +- group-time-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/group-time-element/ SKIP: already tested +- grouping-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/grouping-element/ SKIP: esoteric +- half-muted-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/half-muted-element/ +- handbell-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/handbell-element/ SKIP: esoteric +- harmon-mute-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/harmon-mute-element/ +- harp-pedals-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/harp-pedals-element/ SKIP: esoteric +- haydn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/haydn-element/ +- heel-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/heel-element/ SKIP: esoteric +- heel-toe-substitution: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/heel-toe-substitution/ SKIP: esoteric +- hole-type-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/hole-type-element/ SKIP: esoteric +- hole-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/hole-element/ SKIP: esoteric +- humming-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/humming-element/ SKIP: esoteric +- identification-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/identification-element/ SKIP: esoteric +- image-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/image-element/ SKIP: esoteric +- instrument-change-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/instrument-change-element/ SKIP: esoteric +- instrument-link-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/instrument-link-element/ SKIP: esoteric +- interchangeable-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/interchangeable-element/ +- inversion-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/inversion-element/ SKIP: already tested +- inverted-mordent-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/inverted-mordent-element/ +- inverted-turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/inverted-turn-element/ +- inverted-vertical-turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/inverted-vertical-turn-element/ +- ipa-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ipa-element/ SKIP: esoteric +- key-octave-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/key-octave-element/ SKIP: esoteric +- key-element-non-traditional: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/key-element-non-traditional/ SKIP: esoteric +- key-element-traditional: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/key-element-traditional/ SKIP: already tested +- kind-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/kind-element/ SKIP: already tested +- laughing-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/laughing-element/ SKIP: esoteric +- level-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/level-element/ SKIP: esoteric +- line-detail-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/line-detail-element/ SKIP: esoteric +- line-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/line-element/ +- link-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/link-element/ SKIP: esoteric +- lyric-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/lyric-element/ +- measure-distance-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/measure-distance-element/ SKIP: esoteric +- measure-numbering-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/measure-numbering-element/ SKIP: already tested +- measure-repeat-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/measure-repeat-element/ +- membrane-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/membrane-element/ SKIP: esoteric +- metal-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/metal-element/ SKIP: esoteric +- metronome-arrows-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/metronome-arrows-element/ SKIP: esoteric +- metronome-note-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/metronome-note-element/ +- metronome-tied-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/metronome-tied-element/ SKIP: esoteric +- metronome-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/metronome-element/ SKIP: already tested +- mf-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/mf-element/ +- midi-device-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/midi-device-element/ SKIP: esoteric +- midi-instrument-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/midi-instrument-element/ SKIP: esoteric +- midi-name-and-midi-bank-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/midi-name-and-midi-bank-elements/ SKIP: esoteric +- midi-unpitched-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/midi-unpitched-element/ SKIP: esoteric +- mordent-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/mordent-element/ +- movement-number-and-movement-title-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/movement-number-and-movement-title-elements/ SKIP: esoteric +- mp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/mp-element/ +- multiple-rest-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/multiple-rest-element/ +- n-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/n-element/ SKIP: esoteric +- natural-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/natural-element/ SKIP: already tested +- non-arpeggiate-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/non-arpeggiate-element/ +- normal-dot-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/normal-dot-element/ SKIP: esoteric +- notehead-text-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/notehead-text-element/ +- numeral-alter-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/numeral-alter-element/ SKIP: already tested +- numeral-key-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/numeral-key-element/ SKIP: esoteric +- numeral-root-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/numeral-root-element/ SKIP: already tested +- octave-change-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/octave-change-element/ SKIP: esoteric +- octave-shift-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/octave-shift-element/ +- octave-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/octave-element/ SKIP: already tested +- open-string-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/open-string-element/ SKIP: already tested +- open-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/open-element/ +- p-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/p-element/ +- pan-and-elevation-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pan-and-elevation-elements/ SKIP: esoteric +- part-abbreviation-display-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/part-abbreviation-display-element/ SKIP: esoteric +- part-link-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/part-link-element/ SKIP: esoteric +- part-name-display-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/part-name-display-element/ SKIP: esoteric +- part-symbol-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/part-symbol-element/ SKIP: already tested +- pedal-element-lines: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pedal-element-lines/ SKIP: already tested +- pedal-element-symbols: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pedal-element-symbols/ SKIP: already tested +- per-minute-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/per-minute-element/ SKIP: already tested +- pf-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pf-element/ +- pitch-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pitch-element/ SKIP: already tested +- pitched-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pitched-element/ SKIP: esoteric +- plop-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/plop-element/ SKIP: esoteric +- pluck-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pluck-element/ SKIP: esoteric +- pp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pp-element/ +- ppp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ppp-element/ +- pppp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pppp-element/ +- ppppp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/ppppp-element/ SKIP: esoteric +- pppppp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pppppp-element/ SKIP: esoteric +- pre-bend-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/pre-bend-element/ SKIP: already tested +- prefix-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/prefix-element/ +- principal-voice-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/principal-voice-element/ SKIP: esoteric +- rehearsal-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/rehearsal-element/ +- release-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/release-element/ SKIP: already tested +- repeat-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/repeat-element/ +- rest-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/rest-element/ SKIP: already tested +- rf-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/rf-element/ +- rfz-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/rfz-element/ +- root-alter-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/root-alter-element/ SKIP: already tested +- root-step-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/root-step-element/ SKIP: already tested +- schleifer-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/schleifer-element/ +- scoop-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/scoop-element/ SKIP: esoteric +- scordatura-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/scordatura-element/ SKIP: esoteric +- score-timewise-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/score-timewise-element/ SKIP: esoteric +- segno-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/segno-element/ +- semi-pitched-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/semi-pitched-element/ SKIP: esoteric +- senza-misura-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/senza-misura-element/ +- sf-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sf-element/ +- sffz-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sffz-element/ +- sfp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sfp-element/ +- sfpp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sfpp-element/ +- sfz-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sfz-element/ +- sfzp-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sfzp-element/ +- shake-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/shake-element/ +- slash-type-and-slash-dot-elements: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/slash-type-and-slash-dot-elements/ SKIP: esoteric +- slash-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/slash-element/ SKIP: esoteric +- slide-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/slide-element/ +- slur-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/slur-element/ SKIP: already tested +- smear-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/smear-element/ SKIP: esoteric +- snap-pizzicato-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/snap-pizzicato-element/ +- soft-accent-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/soft-accent-element/ +- spiccato-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/spiccato-element/ +- staccatissimo-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staccatissimo-element/ SKIP: already tested +- staccato-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staccato-element/ SKIP: already tested +- staff-distance-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-distance-element/ SKIP: esoteric +- staff-divide-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-divide-element/ SKIP: esoteric +- staff-lines-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-lines-element/ SKIP: already tested +- staff-size-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-size-element/ SKIP: esoteric +- staff-tuning-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-tuning-element/ SKIP: already tested +- staff-type-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-type-element/ SKIP: already tested +- staff-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staff-element/ SKIP: already tested +- staves-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/staves-element/ SKIP: already tested +- step-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/step-element/ SKIP: already tested +- stick-location-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/stick-location-element/ SKIP: esoteric +- stick-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/stick-element/ SKIP: esoteric +- stopped-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/stopped-element/ +- straight-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/straight-element/ SKIP: esoteric +- stress-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/stress-element/ +- string-mute-element-off: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/string-mute-element-off/ +- string-mute-element-on: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/string-mute-element-on/ +- strong-accent-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/strong-accent-element/ SKIP: already tested +- suffix-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/suffix-element/ SKIP: esoteric +- supports-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/supports-element/ SKIP: esoteric +- swing-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/swing-element/ SKIP: esoteric +- syllabic-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/syllabic-element/ +- symbol-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/symbol-element/ SKIP: esoteric +- sync-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/sync-element/ SKIP: esoteric +- system-distance-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/system-distance-element/ SKIP: esoteric +- system-dividers-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/system-dividers-element/ SKIP: esoteric +- tap-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tap-element/ SKIP: already tested +- technical-element-tablature: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/technical-element-tablature/ SKIP: already tested +- tenuto-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tenuto-element/ SKIP: already tested +- thumb-position-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/thumb-position-element/ +- tied-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tied-element/ SKIP: already tested +- time-modification-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/time-modification-element/ +- timpani-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/timpani-element/ SKIP: esoteric +- toe-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/toe-element/ SKIP: esoteric +- transpose-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/transpose-element/ SKIP: esoteric +- tremolo-element-double: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tremolo-element-double/ +- tremolo-element-single: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tremolo-element-single/ +- trill-mark-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/trill-mark-element/ +- triple-tongue-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/triple-tongue-element/ SKIP: esoteric +- tuplet-dot-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tuplet-dot-element/ SKIP: esoteric +- tuplet-element-nested: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tuplet-element-nested/ SKIP: already tested +- tuplet-element-regular: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tuplet-element-regular/ SKIP: already tested +- turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/turn-element/ +- unpitched-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/unpitched-element/ SKIP: esoteric +- unstress-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/unstress-element/ SKIP: esoteric +- up-bow-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/up-bow-element/ +- vertical-turn-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/vertical-turn-element/ +- virtual-instrument-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/virtual-instrument-element/ SKIP: esoteric +- voice-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/voice-element/ SKIP: already tested +- wait-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/wait-element/ SKIP: esoteric +- wavy-line-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/wavy-line-element/ SKIP: esoteric +- wedge-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/wedge-element/ +- with-bar-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/with-bar-element/ SKIP: already tested +- wood-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/wood-element/ SKIP: esoteric +- work-element: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/work-element/ SKIP: esoteric +- alto-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/alto-clef/ +- baritone-c-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/baritone-c-clef/ +- baritone-f-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/baritone-f-clef/ +- bass-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bass-clef/ SKIP: already tested +- bass-clef-down-octave: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/bass-clef-down-octave/ SKIP: already tested +- mezzo-soprano-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/mezzo-soprano-clef/ +- percussion-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/percussion-clef/ +- soprano-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/soprano-clef/ +- system-attribute-also-top: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/system-attribute-also-top/ SKIP: esoteric +- system-attribute-only-top: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/system-attribute-only-top/ SKIP: esoteric +- tab-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tab-clef/ SKIP: already tested +- tenor-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tenor-clef/ +- treble-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/treble-clef/ SKIP: already tested +- tutorial-apres-un-reve: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-apres-un-reve/ +- tutorial-chopin-prelude: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-chopin-prelude/ +- tutorial-chord-symbols: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-chord-symbols/ SKIP: already tested +- tutorial-hello-world: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-hello-world/ SKIP: already tested +- tutorial-percussion: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-percussion/ +- tutorial-tablature: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/tutorial-tablature/ SKIP: already tested +- vocal-tenor-clef: https://w3c-cg.github.io/musicxml/musicxml-reference/examples/vocal-tenor-clef/ diff --git a/cli/render.ts b/cli/render.ts index 8ee0f5efb..6c0f2af9d 100644 --- a/cli/render.ts +++ b/cli/render.ts @@ -29,11 +29,11 @@ export async function render(opts: { await page.goto('http://localhost:3101/'); await page.evaluate( async ({ musicXML, config }) => { - const canvas = document.getElementById('vexml'); - if (!(canvas instanceof HTMLCanvasElement)) { - throw new Error('canvas not found'); + const container = document.getElementById('screenshot'); + if (!(container instanceof HTMLDivElement)) { + throw new Error('container not found'); } - await window.render(musicXML, canvas, config); + await window.render(musicXML, container, config); }, { musicXML, config }, ); diff --git a/site/src/App.tsx b/site/src/App.tsx index 1967f97fd..293b2fe60 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -1,6 +1,33 @@ import { useEffect, useRef, useState } from 'react'; -import type { Config } from '../../src'; -import { render } from '../../src'; +import type { + Config, + Note, + PointerTarget, + PointerTargetEvent, +} from '../../src'; +import { render, type Score } from '../../src'; + +// One-line summary of the hovered target for the tooltip. +function describe(target: PointerTarget): string { + if (target.type === 'note') { + const beats = target.getBeats(); + const parts = [ + target.getPitch() ?? 'rest', + `${beats} beat${beats === 1 ? '' : 's'}`, + ]; + if (target.isGrace()) { + parts.push('grace'); + } + if (target.isChordMember()) { + parts.push('chord'); + } + return parts.join(' · '); + } + if (target.type === 'tab-position') { + return `string ${target.getString()} · fret ${target.getFret()} · ${target.getNote().getPitch() ?? 'rest'}`; + } + return ''; +} // Vite reads the test fixtures straight from ../tests at build time (fs.allow: ['..'] in // vite.config permits it) and hands us the file list — no symlink or hand-written manifest. @@ -68,7 +95,8 @@ function Or() { } export default function App() { - const canvasRef = useRef(null); + const containerRef = useRef(null); + const scoreRef = useRef(null); const [text, setText] = useState(''); const [input, setInput] = useState(null); const [fixture, setFixture] = useState(''); @@ -83,6 +111,17 @@ export default function App() { ); const [cleared, setCleared] = useState(false); const [restored, setRestored] = useState(false); + const [showInfo, setShowInfo] = useState(true); + const [tooltip, setTooltip] = useState<{ + x: number; + y: number; + text: string; + } | null>(null); + // Read live inside the pointer handler so toggling the checkbox doesn't re-subscribe. + const showInfoRef = useRef(showInfo); + showInfoRef.current = showInfo; + // The note whose halo is currently lit, so the next move can turn it back off. + const haloRef = useRef(null); const debounceRef = useRef | undefined>( undefined, ); @@ -139,10 +178,14 @@ export default function App() { }, [config, renderMs]); useEffect(() => { - const canvas = canvasRef.current; - if (!canvas || input == null) { + const container = containerRef.current; + if (!container || input == null) { return; } + // Replace the previous render before starting a new one: render() appends a fresh + // managed canvas, so the old Score must be disposed or canvases would stack. + scoreRef.current?.dispose(); + scoreRef.current = null; setError(null); const start = performance.now(); // Engrave once at the configured reference width; CSS then scales the canvas to fit @@ -152,19 +195,75 @@ export default function App() { renderConfig.layout?.type === 'standard' ? renderConfig.layout.width : undefined; - render(input, canvas, { + let cancelled = false; + // Turn off the lit halo and hide the tooltip; called on move-to-empty and on leave. + const clearHalo = () => { + haloRef.current?.halo.off(); + haloRef.current?.color.off(); + haloRef.current = null; + container.style.cursor = ''; + setTooltip(null); + }; + let detach: (() => void) | undefined; + render(input, container, { ...renderConfig, layout: { type: 'standard', width: layoutWidth }, }) - .then(() => { - canvas.style.width = '100%'; - canvas.style.height = 'auto'; + .then((score) => { + // The effect can re-run before this resolves; drop the late score so it + // doesn't leak a canvas into a container a newer render already owns. + if (cancelled) { + score.dispose(); + return; + } + scoreRef.current = score; setRenderMs(performance.now() - start); + + const onPointer = (e: PointerTargetEvent) => { + const note = + e.target?.type === 'note' + ? e.target + : e.target?.type === 'tab-position' + ? e.target.getNote() + : null; + if (note !== haloRef.current) { + haloRef.current?.halo.off(); + haloRef.current?.color.off(); + note?.halo.on(); + note?.color.on('#2962ff'); + haloRef.current = note; + container.style.cursor = note ? 'pointer' : ''; + } + if (note && e.target && showInfoRef.current) { + const r = e.target.getBoundingClientRect(); + setTooltip({ + x: r.left + r.width / 2, + y: r.top, + text: describe(e.target), + }); + } else { + setTooltip(null); + } + }; + score.addEventListener('pointermove', onPointer); + score.addEventListener('pointerdown', onPointer); + container.addEventListener('pointerleave', clearHalo); + detach = () => { + container.removeEventListener('pointerleave', clearHalo); + clearHalo(); + }; }) .catch((e: unknown) => { setRenderMs(null); setError(e instanceof Error ? e.message : String(e)); }); + return () => { + cancelled = true; + // score.dispose() drops its own listeners; this only unbinds the DOM-level leave handler. + detach?.(); + scoreRef.current?.dispose(); + scoreRef.current = null; + }; }, [input, renderConfig]); // Restore the last-edited MusicXML, or open with a random example. @@ -426,6 +525,23 @@ export default function App() { /> Dark mode +
+ ref={containerRef} + className={`relative mx-auto w-full max-w-237.5 py-8 px-4 shadow-md ring-1 sm:py-16 [&_.vexml-canvas]:block [&_.vexml-canvas]:!h-auto [&_.vexml-canvas]:!w-full ${dark ? 'bg-zinc-900 ring-zinc-700 [&_.vexml-canvas]:invert' : 'bg-white ring-zinc-200'}`} + /> )} {debouncing && (
@@ -721,6 +838,15 @@ export default function App() {
+ + {tooltip && ( +
+ {tooltip.text} +
+ )} ); } diff --git a/src/decorations.test.ts b/src/decorations.test.ts new file mode 100644 index 000000000..7b3c7d344 --- /dev/null +++ b/src/decorations.test.ts @@ -0,0 +1,162 @@ +import { expect, test } from 'bun:test'; +import { Decorations } from './decorations'; +import { Rect } from './geometry'; +import type { Layer, LayerHost, LayerKind } from './stage'; +import type { Decoratable, NoteGlyph } from './targets'; + +// A recording 2D context: logs the operations Decorations performs so a test can assert what was +// painted (and in what order) without a real canvas. Cast to CanvasRenderingContext2D — only the +// members Decorations touches are implemented. + +class RecordingContext { + fillStyle: string | CanvasGradient | CanvasPattern = '#000000'; + font = ''; + textAlign = 'left'; + textBaseline = 'alphabetic'; + readonly canvas = { width: 800, height: 600 } as HTMLCanvasElement; + // In call order: 'clear', 'fill:: -
+
diff --git a/tests/testing/setup.ts b/tests/testing/setup.ts index cb226d9b7..9bb38854c 100644 --- a/tests/testing/setup.ts +++ b/tests/testing/setup.ts @@ -1,4 +1,4 @@ -import { afterAll, expect } from 'bun:test'; +import { afterAll, beforeAll, expect } from 'bun:test'; import { existsSync, mkdirSync, @@ -11,7 +11,9 @@ import * as path from 'node:path'; import { createCanvas, createImageData } from 'canvas'; import chalk from 'chalk'; import pixelmatch from 'pixelmatch'; +import { type Browser, chromium } from 'playwright'; import { PNG } from 'pngjs'; +import { serve } from './serve'; // Guard: tests must go through `vex test`, which renders in the pinned Docker // image. Bare `bun test` on the host compares against the committed Docker @@ -26,6 +28,38 @@ if (process.env.I_AM_RUNNING_TESTS_USING_VEX_TEST !== '1') { process.exit(1); } +// One browser and one page server for the whole `bun test` run. Launching a second Chromium in +// the same run is flaky in Docker — its teardown hangs past the hook timeout — so every browser +// test (the screenshot harness and the events smoke test) reuses these. Preloaded, so the +// lifecycle scopes to the run, not one file. Eager (beforeAll) to keep the launch out of the +// first test's own timeout; lazy getters so a unit-only run still pays for them only if used. +const TEST_PORT = 3100; +export const TEST_URL = `http://localhost:${TEST_PORT}/`; +let sharedServer: ReturnType | null = null; +let sharedBrowser: Promise | null = null; + +export function testServer(): ReturnType { + sharedServer ??= serve(TEST_PORT); + return sharedServer; +} + +export function testBrowser(): Promise { + testServer(); + sharedBrowser ??= chromium.launch(); + return sharedBrowser; +} + +beforeAll(async () => { + await testBrowser(); +}); + +afterAll(async () => { + if (sharedBrowser) { + await (await sharedBrowser).close(); + } + sharedServer?.stop(true); +}); + // [old][diff][new] stacked vertically, each captioned, returned as a PNG buffer. function composite( expected: PNG,