;; -*- lisp -*- ;; Tests (in-package :fomus-test) (in-suite :fomus-test) ;; BASIC TESTS ;; FOR CHECKING CONSISTENCY IN BACKENDS ;; ACCIDENTALS (test-fomus accidentals-chromatic-scale-up ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 by 1/2 and p from 66 to (+ 66 12) do (fomus-newnote 1 :off o :dur 1/2 :note p)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-chromatic-scale-down ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 by 1/2 and p from (+ 66 12) downto 66 do (fomus-newnote 1 :off o :dur 1/2 :note p)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-alternating-pitches1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 1/2 and n = nil then (not n) do (fomus-newnote 1 :off o :dur 1/2 :note (+ 66 (if n 1 0)))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-alternating-pitches2 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 1/2 and n = nil then (not n) do (fomus-newnote 1 :off o :dur 1/2 :note (+ 66 (if n 0 2)))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-alternating-pitches3 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 1/2 and n from 0 do (fomus-newnote 1 :off o :dur 1/2 :note (+ 65 (let ((x (mod n 4))) (if (= x 3) 1 x))))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-scales-updownup ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 12 by 1/2 for n = (cond ((< o 4) (+ 66 (* o 2))) ((< o 8) (- 74 (* (- o 4) 2))) (t (+ 66 (* (- o 8) 2)))) do (fomus-newnote 1 :off o :dur 1/2 :note n)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-scales-updownup-chords ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 12 by 1/2 for n = (cond ((< o 4) (+ 66 (* o 2))) ((< o 8) (- 74 (* (- o 4) 2))) (t (+ 66 (* (- o 8) 2)))) do (fomus-newnote 1 :off o :dur 1/2 :note n) do (fomus-newnote 1 :off o :dur 1/2 :note (+ n 3))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-throughout ((:lilypond) (:musicxml) (:cmn)) (fomus-init :acc-throughout-meas t) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 8 do (fomus-newnote 1 :off o :dur 1 :note 70) do (fomus-newnote 1 :off o :dur 1 :note (+ 70 3))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-notthroughout ((:lilypond) (:musicxml) (:cmn)) (fomus-init :acc-throughout-meas nil) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 8 do (fomus-newnote 1 :off o :dur 1 :note 70) do (fomus-newnote 1 :off o :dur 1 :note (+ 70 3))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus accidentals-cautionary-throughout ((:lilypond) (:musicxml) (:cmn)) (fomus-init :acc-throughout-meas t :auto-cautionary-accs t) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 8 do (fomus-newnote 1 :off o :dur 1 :note (+ 66 (mod o 4))) do (fomus-newnote 1 :off o :dur 1 :note (+ 66 (mod o 4) 4))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; OTTAVAS (test-fomus accidentals-cautionary-notthroughout ((:lilypond) (:musicxml) (:cmn)) (fomus-init :acc-throughout-meas nil :auto-cautionary-accs t) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 8 do (fomus-newnote 1 :off o :dur 1 :note (+ 66 (mod o 4))) do (fomus-newnote 1 :off o :dur 1 :note (+ 66 (mod o 4) 4))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; LilyPond missing an f#? (LilyPond's accidental-style is 'forget, so LilyPond should do this) ;; (test-fomus accidentals-cautionary-notthroughout2 ((:lilypond)) ;; (fomus-init :acc-throughout-meas nil :auto-ottavas nil) ;; (fomus-newpart 1 :name "test" :instr :piano) ;; (let ((o -1/4)) ;; (loop for n from 91 to 103 ;; do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n)) ;; (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note 91) ;; (loop for n from 103 downto 91 ;; do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n))) ;; (test-checksum :lilypond)) (test-fomus ottavas ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :piano) (let ((o -1/4)) (loop for n from 91 to 103 do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n)) (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note 91) (loop for n from 103 downto 91 do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n)) (loop initially (setf o (- 8 1/4)) for n from 31 downto 21 do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n)) (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note 31) (loop for n from 21 to 31 do (fomus-newnote 1 :off (incf o 1/4) :dur 1/4 :note n))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; QUANTIZING (test-fomus quantizing-tuplets ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 2 by 2/3 do (fomus-newnote 1 :off (float o) :dur (float 2/3) :note 67)) (loop for o from 2 below 4 by 2/5 do (fomus-newnote 1 :off (float o) :dur (float 2/5) :note 67)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; MusicXML doesn't import this correctly--don't think it's my fault (Finale import seems to ignore the tags) (test-fomus quantizing-nestedtriplets ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(5 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 4/9 do (fomus-newnote 1 :off (float o) :dur (float 4/9) :note 67)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus quantizing-nested-tuplets ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(5 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 4/15 do (fomus-newnote 1 :off (float o) :dur (float 4/15) :note 67)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus quantizing-nontuplets ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(9 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 below 4 by 4/9 do (fomus-newnote 1 :off (float o) :dur (float 4/9) :note 67)) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus quantizing-mixed-nontuplets ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(9 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (fomus-newnote 1 :off (float 0) :dur (float 4/3) :note 67) (loop for o from 4/3 below 8/3 by 4/9 do (fomus-newnote 1 :off (float o) :dur (float 4/9) :note 67)) (fomus-newnote 1 :off (float 8/3) :dur (float 4/3) :note 67) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus quantizing-mixed-triplets ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(5 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (fomus-newnote 1 :off (float 0) :dur (float 4/3) :note 67) (loop for o from 4/3 below 8/3 by 4/9 do (fomus-newnote 1 :off (float o) :dur (float 4/9) :note 67)) (fomus-newnote 1 :off (float 8/3) :dur (float 4/3) :note 67) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus quantizing-mixed-triplets2 ((:lilypond) (:musicxml) (:cmn)) (fomus-init :max-tuplet '(5 5) :tuplet-style :ratio) (fomus-newpart 1 :name "test" :instr :oboe) (fomus-newnote 1 :off (float 0) :dur (float 2/3) :note 67) (loop for o from 4/3 below 8/3 by 4/9 do (fomus-newnote 1 :off (float o) :dur (float 4/9) :note 67)) (fomus-newnote 1 :off (float 8/3) :dur (float 2/3) :note 67) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; MARKS (test-fomus marks-single1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 for m in '(:stopped :open :staccato :staccatissimo :accent :marcato :tenuto :portato :upbow :downbow :thumb :leftheel :rightheel :lefttoe :righttoe (:fermata :short) (:fermata :long) (:fermata :verylong) (:notehead :harmonic) (:notehead :diamond) (:notehead :x) (:notehead :xcircle) (:notehead :triangle) (:notehead :slash)) do (fomus-newnote 1 :off o :dur 1 :note 72 :marks (list m))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus marks-ornament1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o = 0 then (+ o d) for (m . d) in '((:trill . 1) (:mordent . 1) (:prall . 1) (:longtrill . 2) ((:trill 73) . 1) ((:mordent 71) . 1) ((:longtrill 73) . 2) ((:prall 73) . 1) ((:trill 74) . 1) ((:longtrill 74) . 2) ((:mordent 70) . 1) ((:prall 74) . 1)) do (fomus-newnote 1 :off o :dur d :note 72 :marks (list m))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; As far as I can tell, Finale/Sibelius don't import harmonics as described in DTD (test-fomus marks-other1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (nconc (loop for o from 0 by 1 for m in '(:arpeggio (:arpeggio :up) (:arpeggio :down)) do (fomus-newnote 1 :off o :dur 1 :note 60 :marks (list m)) do (fomus-newnote 1 :off o :dur 1 :note 66 :marks (list m)) do (fomus-newnote 1 :off o :dur 1 :note 72 :marks (list m))) (list (fomus-newnote 1 :off 4 :dur 1 :note 67) (fomus-newnote 1 :off 5 :dur 1 :note 67 :marks '((:breath :before))) (fomus-newnote 1 :off 6 :dur 1 :note 67)) (list (fomus-newnote 1 :off 8 :dur 1 :note 67) (fomus-newnote 1 :off 9 :dur 1 :note 67 :marks '((:breath :after))) (fomus-newnote 1 :off 10 :dur 1 :note 67)) (list (fomus-newnote 1 :off 12 :dur 1 :note 60) (fomus-newnote 1 :off 13 :dur 1 :note 66 :marks '((:glissando :before))) (fomus-newnote 1 :off 14 :dur 1 :note 72 :marks '((:glissando :before))) (fomus-newnote 1 :off 15 :dur 1 :note 78 :marks '((:glissando :before)))) (list (fomus-newnote 1 :off 16 :dur 1 :note 60 :marks '((:glissando :after))) (fomus-newnote 1 :off 17 :dur 1 :note 66 :marks '((:glissando :after))) (fomus-newnote 1 :off 18 :dur 1 :note 72 :marks '((:glissando :after))) (fomus-newnote 1 :off 19 :dur 1 :note 78)) (list (fomus-newnote 1 :off 20 :dur 1 :note 60) (fomus-newnote 1 :off 21 :dur 1 :note 66 :marks '((:portamento :before))) (fomus-newnote 1 :off 22 :dur 1 :note 72 :marks '((:portamento :before))) (fomus-newnote 1 :off 23 :dur 1 :note 78 :marks '((:portamento :before)))) (list (fomus-newnote 1 :off 24 :dur 1 :note 60 :marks '((:portamento :after))) (fomus-newnote 1 :off 25 :dur 1 :note 66 :marks '((:portamento :after))) (fomus-newnote 1 :off 26 :dur 1 :note 72 :marks '((:portamento :after))) (fomus-newnote 1 :off 27 :dur 1 :note 78)) (loop for o from 28 below 32 by 1/2 and n from 67 do (fomus-newnote 1 :off o :dur 1/2 :note n :marks (list (list :harmonic :touched (+ n 5))))) (loop for o from 32 below 36 by 1/2 and n from 67 do (fomus-newnote 1 :off o :dur 1/2 :note n :marks (list (list :harmonic :touched (+ n 5)) (list :harmonic :sounding (+ n 24)))))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus marks-dynamics1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 by 4 for m in '(:pppppp :ppppp :pppp :ppp :pp :p :mp :mf :f :ff :fff :ffff :fffff :ffffff :fp :sf :sff :sp :spp :sfz :rfz) do (fomus-newnote 1 :off o :dur 2 :note 72 :marks (list m))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus marks-text1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 by 4 for m in '((:texttempo "Fast") (:text "some text") :fff (:textdyn "fff") (:textnote "pizz.")) do (fomus-newnote 1 :off o :dur 2 :note 72 :marks (list m))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) (test-fomus marks-spanners1 ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (loop for o from 0 by 5/2 for m1 in '(:startslur- (:starttext- "text") :startwedge< :startwedge>) and m2 in '(:endslur- :endtext- :endwedge< :endwedge>) do (fomus-newnote 1 :off o :dur 1/2 :note 72 :marks (list m1)) do (fomus-newnote 1 :off (+ o 1/2) :dur 1/2 :note 72) do (fomus-newnote 1 :off (+ o 1) :dur 1/2 :note 72) do (fomus-newnote 1 :off (+ o 3/2) :dur 1/2 :note 72) do (fomus-newnote 1 :off (+ o 2) :dur 1/2 :note 72 :marks (list m2))) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; ;; parts/groups ;; (fomus :filename "/tmp/parts" ;; :ensemble-type :orchestra ;; :parts (list ;; (make-part :name "Piano 1" :instr :piano :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Piano 2" :instr :piano :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Flute 1" :instr :flute :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Flute 2" :instr :flute :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Clarinet 1" :instr :bf-clarinet :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Clarinet 2" :instr :bf-clarinet :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Violin 1" :instr :violin :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Violin 2" :instr :violin :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Cello 1" :instr :cello :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Cello 2" :instr :cello :events (list (make-note :off 4 :dur 1 :note 60))) ;; (make-part :name "Tuba" :instr :tuba :events (list (make-note :off 4 :dur 1 :note 36))))) ;; PIZZ./ARCO ;; NO NOTES (test-fomus no-notes ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :name "test" :instr :oboe) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; TUPLET NOTE-VALUE TEST (test-fomus tuplet-note-values ((:lilypond) (:musicxml) (:cmn)) (fomus-init :default-beat 1/8 :max-tuplet-dur 10 :auto-timesig-comp nil) (fomus-newpart 1 :name "test" :instr :oboe) (fomus-newtimesig :off 0 :time '(1 8)) (fomus-newnote 1 :voice 1 :off 0 :dur 1/2 :note 60) (fomus-newnote 1 :voice 1 :off 1/2 :dur 1/2 :note 60) (fomus-newtimesig :off 1 :time '(2 8)) (fomus-newnote 1 :voice 1 :off 1 :dur 2/3 :note 60) (fomus-newnote 1 :voice 1 :off 5/3 :dur 2/3 :note 60) (fomus-newnote 1 :voice 1 :off 7/3 :dur 2/3 :note 60) (fomus-newtimesig :off 3 :time '(3 8)) (fomus-newnote 1 :voice 1 :off 3 :dur 3/4 :note 60) (fomus-newnote 1 :voice 1 :off 15/4 :dur 3/4 :note 60) (fomus-newnote 1 :voice 1 :off 9/2 :dur 3/4 :note 60) (fomus-newnote 1 :voice 1 :off 21/4 :dur 3/4 :note 60) (fomus-newtimesig :off 6 :time '(4 8)) (fomus-newnote 1 :voice 1 :off 6 :dur 4/5 :note 60) (fomus-newnote 1 :voice 1 :off 34/5 :dur 4/5 :note 60) (fomus-newnote 1 :voice 1 :off 38/5 :dur 4/5 :note 60) (fomus-newnote 1 :voice 1 :off 42/5 :dur 4/5 :note 60) (fomus-newnote 1 :voice 1 :off 46/5 :dur 4/5 :note 60) (fomus-newtimesig :off 10 :time '(5 8)) (fomus-newnote 1 :voice 1 :off 10 :dur 5/6 :note 60) (fomus-newnote 1 :voice 1 :off 65/6 :dur 5/6 :note 60) (fomus-newnote 1 :voice 1 :off 35/3 :dur 5/6 :note 60) (fomus-newnote 1 :voice 1 :off 25/2 :dur 5/6 :note 60) (fomus-newnote 1 :voice 1 :off 40/3 :dur 5/6 :note 60) (fomus-newnote 1 :voice 1 :off 85/6 :dur 5/6 :note 60) (fomus-newtimesig :off 15 :time '(6 8)) (fomus-newnote 1 :voice 1 :off 15 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 111/7 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 117/7 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 123/7 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 129/7 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 135/7 :dur 6/7 :note 60) (fomus-newnote 1 :voice 1 :off 141/7 :dur 6/7 :note 60) (fomus-newtimesig :off 21 :time '(7 8)) (fomus-newnote 1 :voice 1 :off 21 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 175/8 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 91/4 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 189/8 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 49/2 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 203/8 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 105/4 :dur 7/8 :note 60) (fomus-newnote 1 :voice 1 :off 217/8 :dur 7/8 :note 60) (fomus-newtimesig :off 28 :time '(8 8)) (fomus-newnote 1 :voice 1 :off 28 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 260/9 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 268/9 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 92/3 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 284/9 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 292/9 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 100/3 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 308/9 :dur 8/9 :note 60) (fomus-newnote 1 :voice 1 :off 316/9 :dur 8/9 :note 60) (fomus-newtimesig :off 36 :time '(9 8)) (fomus-newnote 1 :voice 1 :off 36 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 369/10 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 189/5 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 387/10 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 198/5 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 81/2 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 207/5 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 423/10 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 216/5 :dur 9/10 :note 60) (fomus-newnote 1 :voice 1 :off 441/10 :dur 9/10 :note 60) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn)) ;; MORE COMPLEX TESTS ;; Compound meters ;; Spanners from hell ;; Cautionary accidentals with 8vas ;; ...======= ;; ;; cautionary accidentals with 8vas... ;;; "Kilian tests" (test-fomus unnamed-part ((:lilypond) (:musicxml) (:cmn)) (fomus-newpart 1 :instr :oboe) (fomus-newnote 1 :off 0 :dur 1/2 :note 61) (test-checksum :lilypond) (test-checksum :musicxml) (test-checksum :cmn))