gsharp-cvs
Threads by month
- ----- 2025 -----
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 396 discussions

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 21 Nov '05
by rstrandh@common-lisp.net 21 Nov '05
21 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv30080
Modified Files:
drawing.lisp measure.lisp packages.lisp
Log Message:
Move the computation of final relative accidental x offsets from
drawing.lisp to measure.lisp.
Date: Mon Nov 21 23:40:49 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.33 gsharp/drawing.lisp:1.34
--- gsharp/drawing.lisp:1.33 Mon Nov 21 23:18:37 2005
+++ gsharp/drawing.lisp Mon Nov 21 23:40:48 2005
@@ -3,13 +3,6 @@
(define-added-mixin dstaff () staff
((yoffset :initform 0 :accessor staff-yoffset)))
-(define-added-mixin dnote () note
- (;; The relative x offset of the accidental of the note with respect
- ;; to the cluster. A value of nil indicates that accidental has
- ;; not been placed yet
- (final-relative-accidental-xoffset :initform nil
- :accessor final-relative-accidental-xoffset)))
-
(define-presentation-method present
(object (type score-pane:clef) stream (view textual-view) &key)
(format stream "[~a clef on staff step ~a]" (name object) (lineno object)))
@@ -433,139 +426,6 @@
(defun element-has-suspended-notes (element)
(not (apply #'= (mapcar #'final-relative-note-xoffset (notes element)))))
-;;; table of x offsets (in staff steps) of accendentals.
-;;; The first index represents a notehead or a type of accidental.
-;;; The second index represents a type of accidentsl.
-;;; The third index is a vertical distance, measured in difference
-;;; in staff steps between the two.
-;;; The table entry gives how much the accidental represented by
-;;; the second parameter must be positioned to the left of the
-;;; first one.
-;;; Entries in the table are offset by 5 in the last dimension
-;;; so that vertical distances between -5 and 5 can be represented
-(defparameter *accidental-offset*
- ;;; -5 -4 -3 -2 -1 0 1 2 3 4 5
- #3A((( 0 0 0 3.5 3.5 3.5 3.5 3.5 3.5 1 0) ; notehead - dbl flat
- ( 0 0 0 3.5 3.5 3.5 3.5 3.5 3.5 1 0) ; notehead - flat
- ( 0 3.5 3.5 3.5 3.5 3.5 3.5 3.5 1 1 0) ; notehead - natural
- ( 0 3.5 3.5 3.5 3.5 3.5 3.5 3.5 1 1 0) ; notehead - sharp
- ( 0 0 0 3.5 3.5 3.5 3.5 3.5 0 0 0)) ; notehead - dbl sharp
- (( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - dbl flat
- ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - flat
- ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - natural
- ( 4 4 4 4 4 4 4 4 4 3.5 0) ; dbl flat - sharp
- ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 0 0 0)) ; dbl flat - dbl sharp
- (( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - dbl flat
- ( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - flat
- ( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - natural
- ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 1.5 0) ; flat - sharp
- ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 0 0 0)) ; flat - dbl sharp
- (( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - dbl flat
- ( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - flat
- ( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - natural
- ( 2 2 2 2 2 2 2 2 2 2 2) ; natural - sharp
- ( 2 2 2 2 2 2 2 2 1 1 1)) ; natural - dbl sharp
- (( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - dbl flat
- ( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - flat
- ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - natural
- ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 2.0) ; sharp - sharp
- ( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 0 0)) ; sharp - dbl sharp
- (( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - dbl flat
- ( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - flat
- ( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - natural
- ( 0 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 0) ; dbl sharp - sharp
- ( 0 0 0 2.8 2.8 2.8 2.8 2.8 0 0 0)))) ; dbl sharp - dbl sharp
-
-;;; given 1) a type of accidental 2) its position (in staff steps) 3)
-;;; a type of accidental or a type of notehead, and 4) its position,
-;;; return the x offset of the first accidental, i.e., how many staff
-;;; steps to the left that it must be moved in order to avoid overlap
-;;; with the second one.
-(defun accidental-distance (acc1 pos1 acc2 pos2)
- (let ((dist (- pos2 pos1)))
- (if (> (abs dist) 5)
- 0
- (aref *accidental-offset*
- (ecase acc2
- (:notehead 0)
- (:double-flat 1)
- (:flat 2)
- (:natural 3)
- (:sharp 4)
- (:double-sharp 5))
- (ecase acc1
- (:double-flat 0)
- (:flat 1)
- (:natural 2)
- (:sharp 3)
- (:double-sharp 4))
- (+ dist 5)))))
-
-;;; given two notes (where the first one has an accidental, and the
-;;; second one may or may not have an accidental) and the conversion
-;;; factor between staff steps and x positions, compute the x offset
-;;; of the accidental of the first note. If the second note has
-;;; an accidental, but that has not been given a final x offset, then
-;;; use the x offset of the notehead instead.
-(defun accidental-relative-xoffset (note1 note2 staff-step)
- (let* ((acc1 (final-accidental note1))
- (pos1 (note-position note1))
- (acc2 (if (and (final-accidental note2)
- (final-relative-accidental-xoffset note2))
- (final-accidental note2)
- :notehead))
- (pos2 (note-position note2))
- (xpos2 (or (final-relative-accidental-xoffset note2)
- (final-relative-note-xoffset note2))))
- (- xpos2 (* staff-step (accidental-distance acc1 pos1 acc2 pos2)))))
-
-;;; given a note and a list of notes, compute x offset of the accidental
-;;; of the note as required by each of the notes in the list. In order
-;;; for the accidental of the note not to overlap any of the others,
-;;; we must use the minimum of all the x offsets thus computed.
-(defun accidental-min-xoffset (note1 notes staff-step)
- (reduce #'min notes :key (lambda (note) (accidental-relative-xoffset note1 note staff-step))))
-
-;;; given a list of notes that have accidentals to place, and a list of
-;;; notes that either have no accidentals or with already-placed accidentals,
-;;; compute the note in the first list that can be placed as far to the right
-;;; as possible.
-(defun best-accidental (notes-with-accidentals notes staff-step)
- (reduce (lambda (note1 note2) (if (>= (accidental-min-xoffset note1 notes staff-step)
- (accidental-min-xoffset note2 notes staff-step))
- note1
- note2))
- notes-with-accidentals))
-
-;;; for each note in a list of notes, if it has an accidental, compute
-;;; the final relative x offset of that accidental and store it in the note.
-(defun compute-final-relative-accidental-xoffset (notes x final-stem-direction)
- (let* ((staff-step (score-pane:staff-step 1))
- ;; sort the notes from top to bottom
- (notes (sort (copy-list notes)
- (lambda (x y) (> (note-position x) (note-position y)))))
- (notes-with-accidentals (remove-if-not #'final-accidental notes)))
- ;; initially, no accidental has been placed
- (loop for note in notes do (setf (final-relative-accidental-xoffset note) nil))
- (when (eq final-stem-direction :up)
- ;; when the stem direction is :up and there is a suspended note
- ;; i.e., one to the right of the stem, then the accidental of the topmost
- ;; suspended note is placed first.
- (let ((first-suspended-note
- (find x notes-with-accidentals :test #'/= :key #'final-relative-note-xoffset)))
- (when first-suspended-note
- (setf notes-with-accidentals
- (remove first-suspended-note notes-with-accidentals))
- (setf (final-relative-accidental-xoffset first-suspended-note)
- (accidental-min-xoffset first-suspended-note notes staff-step)))))
- ;; place remaining accidentals
- (loop while notes-with-accidentals
- do (let ((choice (best-accidental notes-with-accidentals notes staff-step)))
- (setf notes-with-accidentals
- (remove choice notes-with-accidentals))
- (setf (final-relative-accidental-xoffset choice)
- (accidental-min-xoffset choice notes staff-step))))))
-
;;; draw a cluster. The stem direction and the stem position have
;;; already been computed.
;;; 1. Group notes by staff.
@@ -586,7 +446,6 @@
(score-pane:with-vertical-score-position (pane stem-yoffset)
(draw-flags pane element x direction stem-pos)))
(loop for group in groups do
- (compute-final-relative-accidental-xoffset group x direction)
(draw-notes pane group (dots element) (notehead element))
(draw-ledger-lines pane x group))
(unless (eq (notehead element) :whole)
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.13 gsharp/measure.lisp:1.14
--- gsharp/measure.lisp:1.13 Mon Nov 21 23:18:37 2005
+++ gsharp/measure.lisp Mon Nov 21 23:40:48 2005
@@ -18,7 +18,12 @@
;;; Note
(defrclass rnote note
- ((final-accidental :initform nil :accessor final-accidental)
+ (;; The relative x offset of the accidental of the note with respect
+ ;; to the cluster. A value of nil indicates that accidental has
+ ;; not been placed yet
+ (final-relative-accidental-xoffset :initform nil
+ :accessor final-relative-accidental-xoffset)
+ (final-accidental :initform nil :accessor final-accidental)
;; the relative x offset of the note with respect to the cluster
(final-relative-note-xoffset :accessor final-relative-note-xoffset)))
@@ -184,6 +189,139 @@
nil
(accidentals note)))))
+;;; table of x offsets (in staff steps) of accendentals.
+;;; The first index represents a notehead or a type of accidental.
+;;; The second index represents a type of accidentsl.
+;;; The third index is a vertical distance, measured in difference
+;;; in staff steps between the two.
+;;; The table entry gives how much the accidental represented by
+;;; the second parameter must be positioned to the left of the
+;;; first one.
+;;; Entries in the table are offset by 5 in the last dimension
+;;; so that vertical distances between -5 and 5 can be represented
+(defparameter *accidental-offset*
+ ;;; -5 -4 -3 -2 -1 0 1 2 3 4 5
+ #3A((( 0 0 0 3.5 3.5 3.5 3.5 3.5 3.5 1 0) ; notehead - dbl flat
+ ( 0 0 0 3.5 3.5 3.5 3.5 3.5 3.5 1 0) ; notehead - flat
+ ( 0 3.5 3.5 3.5 3.5 3.5 3.5 3.5 1 1 0) ; notehead - natural
+ ( 0 3.5 3.5 3.5 3.5 3.5 3.5 3.5 1 1 0) ; notehead - sharp
+ ( 0 0 0 3.5 3.5 3.5 3.5 3.5 0 0 0)) ; notehead - dbl sharp
+ (( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - dbl flat
+ ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - flat
+ ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3 3 0) ; dbl flat - natural
+ ( 4 4 4 4 4 4 4 4 4 3.5 0) ; dbl flat - sharp
+ ( 3.8 3.8 3.8 3.8 3.8 3.8 3.8 3.8 0 0 0)) ; dbl flat - dbl sharp
+ (( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - dbl flat
+ ( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - flat
+ ( 2 2 2 2 2 2 2 2 1.5 1 0) ; flat - natural
+ ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 1.5 0) ; flat - sharp
+ ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 0 0 0)) ; flat - dbl sharp
+ (( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - dbl flat
+ ( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - flat
+ ( 2 2 2 2 2 2 2 2 2 1.5 1.5) ; natural - natural
+ ( 2 2 2 2 2 2 2 2 2 2 2) ; natural - sharp
+ ( 2 2 2 2 2 2 2 2 1 1 1)) ; natural - dbl sharp
+ (( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - dbl flat
+ ( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - flat
+ ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 1.5 1.0) ; sharp - natural
+ ( 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.0 2.0) ; sharp - sharp
+ ( 0 2.4 2.4 2.4 2.4 2.4 2.4 2.4 2.4 0 0)) ; sharp - dbl sharp
+ (( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - dbl flat
+ ( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - flat
+ ( 0 0 2.4 2.4 2.4 2.4 2.4 2.4 2 1 0) ; dbl sharp - natural
+ ( 0 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 0) ; dbl sharp - sharp
+ ( 0 0 0 2.8 2.8 2.8 2.8 2.8 0 0 0)))) ; dbl sharp - dbl sharp
+
+;;; given 1) a type of accidental 2) its position (in staff steps) 3)
+;;; a type of accidental or a type of notehead, and 4) its position,
+;;; return the x offset of the first accidental, i.e., how many staff
+;;; steps to the left that it must be moved in order to avoid overlap
+;;; with the second one.
+(defun accidental-distance (acc1 pos1 acc2 pos2)
+ (let ((dist (- pos2 pos1)))
+ (if (> (abs dist) 5)
+ 0
+ (aref *accidental-offset*
+ (ecase acc2
+ (:notehead 0)
+ (:double-flat 1)
+ (:flat 2)
+ (:natural 3)
+ (:sharp 4)
+ (:double-sharp 5))
+ (ecase acc1
+ (:double-flat 0)
+ (:flat 1)
+ (:natural 2)
+ (:sharp 3)
+ (:double-sharp 4))
+ (+ dist 5)))))
+
+;;; given two notes (where the first one has an accidental, and the
+;;; second one may or may not have an accidental) and the conversion
+;;; factor between staff steps and x positions, compute the x offset
+;;; of the accidental of the first note. If the second note has
+;;; an accidental, but that has not been given a final x offset, then
+;;; use the x offset of the notehead instead.
+(defun accidental-relative-xoffset (note1 note2 staff-step)
+ (let* ((acc1 (final-accidental note1))
+ (pos1 (note-position note1))
+ (acc2 (if (and (final-accidental note2)
+ (final-relative-accidental-xoffset note2))
+ (final-accidental note2)
+ :notehead))
+ (pos2 (note-position note2))
+ (xpos2 (or (final-relative-accidental-xoffset note2)
+ (final-relative-note-xoffset note2))))
+ (- xpos2 (* staff-step (accidental-distance acc1 pos1 acc2 pos2)))))
+
+;;; given a note and a list of notes, compute x offset of the accidental
+;;; of the note as required by each of the notes in the list. In order
+;;; for the accidental of the note not to overlap any of the others,
+;;; we must use the minimum of all the x offsets thus computed.
+(defun accidental-min-xoffset (note1 notes staff-step)
+ (reduce #'min notes :key (lambda (note) (accidental-relative-xoffset note1 note staff-step))))
+
+;;; given a list of notes that have accidentals to place, and a list of
+;;; notes that either have no accidentals or with already-placed accidentals,
+;;; compute the note in the first list that can be placed as far to the right
+;;; as possible.
+(defun best-accidental (notes-with-accidentals notes staff-step)
+ (reduce (lambda (note1 note2) (if (>= (accidental-min-xoffset note1 notes staff-step)
+ (accidental-min-xoffset note2 notes staff-step))
+ note1
+ note2))
+ notes-with-accidentals))
+
+;;; for each note in a list of notes, if it has an accidental, compute
+;;; the final relative x offset of that accidental and store it in the note.
+(defun compute-final-relative-accidental-xoffset (notes final-stem-direction)
+ (let* ((staff-step (score-pane:staff-step 1))
+ ;; sort the notes from top to bottom
+ (notes (sort (copy-list notes)
+ (lambda (x y) (> (note-position x) (note-position y)))))
+ (notes-with-accidentals (remove-if-not #'final-accidental notes)))
+ ;; initially, no accidental has been placed
+ (loop for note in notes do (setf (final-relative-accidental-xoffset note) nil))
+ (when (eq final-stem-direction :up)
+ ;; when the stem direction is :up and there is a suspended note
+ ;; i.e., one to the right of the stem, then the accidental of the topmost
+ ;; suspended note is placed first.
+ (let ((first-suspended-note
+ (find 0 notes-with-accidentals :test #'/= :key #'final-relative-note-xoffset)))
+ (when first-suspended-note
+ (setf notes-with-accidentals
+ (remove first-suspended-note notes-with-accidentals))
+ (setf (final-relative-accidental-xoffset first-suspended-note)
+ (accidental-min-xoffset first-suspended-note notes staff-step)))))
+ ;; place remaining accidentals
+ (loop while notes-with-accidentals
+ do (let ((choice (best-accidental notes-with-accidentals notes staff-step)))
+ (setf notes-with-accidentals
+ (remove choice notes-with-accidentals))
+ (setf (final-relative-accidental-xoffset choice)
+ (accidental-min-xoffset choice notes staff-step))))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Rest
@@ -396,7 +534,8 @@
(defun compute-staff-group-parameters (staff-group stem-direction)
(compute-final-relative-note-xoffsets staff-group stem-direction)
- (compute-final-accidentals staff-group))
+ (compute-final-accidentals staff-group)
+ (compute-final-relative-accidental-xoffset staff-group stem-direction))
;;; compute some important parameters of an element
(defgeneric compute-element-parameters (element))
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.33 gsharp/packages.lisp:1.34
--- gsharp/packages.lisp:1.33 Mon Nov 21 23:18:37 2005
+++ gsharp/packages.lisp Mon Nov 21 23:40:48 2005
@@ -133,7 +133,7 @@
#:top-note #:bot-note #:top-note-pos #:bot-note-pos
#:beam-groups #:final-stem-direction
#:group-notes-by-staff #:final-relative-note-xoffset
- #:final-accidental))
+ #:final-accidental #:final-relative-accidental-xoffset))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
1
0

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 21 Nov '05
by rstrandh@common-lisp.net 21 Nov '05
21 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv28766
Modified Files:
drawing.lisp measure.lisp packages.lisp
Log Message:
moved the computation of the final accidental (determine whether
one should be displayed or not according to the key signature) from
drawing.lisp to measure.lisp.
Date: Mon Nov 21 23:18:38 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.32 gsharp/drawing.lisp:1.33
--- gsharp/drawing.lisp:1.32 Mon Nov 21 21:37:45 2005
+++ gsharp/drawing.lisp Mon Nov 21 23:18:37 2005
@@ -4,8 +4,7 @@
((yoffset :initform 0 :accessor staff-yoffset)))
(define-added-mixin dnote () note
- ((final-accidental :initform nil :accessor final-accidental)
- ;; The relative x offset of the accidental of the note with respect
+ (;; The relative x offset of the accidental of the note with respect
;; to the cluster. A value of nil indicates that accidental has
;; not been placed yet
(final-relative-accidental-xoffset :initform nil
@@ -431,17 +430,6 @@
(loop for note in notes do
(draw-note pane note notehead dots (final-absolute-note-xoffset note) (note-position note))))
-;;; Given a list of notes to be displayed on the same staff line, for
-;;; each note, compute the accidental to be displayed as a function of
-;;; the accidentals of the note and the key signature of the staff.
-(defun compute-final-accidentals (group)
- (loop for note in group do
- (setf (final-accidental note)
- (if (eq (accidentals note)
- (aref (keysig (staff note)) (mod (pitch note) 7)))
- nil
- (accidentals note)))))
-
(defun element-has-suspended-notes (element)
(not (apply #'= (mapcar #'final-relative-note-xoffset (notes element)))))
@@ -598,7 +586,6 @@
(score-pane:with-vertical-score-position (pane stem-yoffset)
(draw-flags pane element x direction stem-pos)))
(loop for group in groups do
- (compute-final-accidentals group)
(compute-final-relative-accidental-xoffset group x direction)
(draw-notes pane group (dots element) (notehead element))
(draw-ledger-lines pane x group))
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.12 gsharp/measure.lisp:1.13
--- gsharp/measure.lisp:1.12 Mon Nov 21 21:37:45 2005
+++ gsharp/measure.lisp Mon Nov 21 23:18:37 2005
@@ -18,7 +18,8 @@
;;; Note
(defrclass rnote note
- (;; the relative x offset of the note with respect to the cluster
+ ((final-accidental :initform nil :accessor final-accidental)
+ ;; the relative x offset of the note with respect to the cluster
(final-relative-note-xoffset :accessor final-relative-note-xoffset)))
;;; given a list of notes, group them so that every note in the group
@@ -172,6 +173,17 @@
when (non-empty-cluster-p element)
do (setf (final-stem-direction element) stem-direction))))
+;;; Given a list of notes to be displayed on the same staff line, for
+;;; each note, compute the accidental to be displayed as a function of
+;;; the accidentals of the note and the key signature of the staff.
+(defun compute-final-accidentals (group)
+ (loop for note in group do
+ (setf (final-accidental note)
+ (if (eq (accidentals note)
+ (aref (keysig (staff note)) (mod (pitch note) 7)))
+ nil
+ (accidentals note)))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Rest
@@ -383,7 +395,8 @@
(setf note old-note))))))
(defun compute-staff-group-parameters (staff-group stem-direction)
- (compute-final-relative-note-xoffsets staff-group stem-direction))
+ (compute-final-relative-note-xoffsets staff-group stem-direction)
+ (compute-final-accidentals staff-group))
;;; compute some important parameters of an element
(defgeneric compute-element-parameters (element))
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.32 gsharp/packages.lisp:1.33
--- gsharp/packages.lisp:1.32 Mon Nov 21 21:37:45 2005
+++ gsharp/packages.lisp Mon Nov 21 23:18:37 2005
@@ -132,7 +132,8 @@
#:note-position #:non-empty-cluster-p
#:top-note #:bot-note #:top-note-pos #:bot-note-pos
#:beam-groups #:final-stem-direction
- #:group-notes-by-staff #:final-relative-note-xoffset))
+ #:group-notes-by-staff #:final-relative-note-xoffset
+ #:final-accidental))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
1
0

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/gsharp.asd gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 21 Nov '05
by rstrandh@common-lisp.net 21 Nov '05
21 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv20469
Modified Files:
drawing.lisp gsharp.asd measure.lisp packages.lisp
Log Message:
moved the computation of relative x offsets of notes from drawing.lisp
to measure.lisp. This required some reorganization of packages.lisp and
gsharp.asd as well.
Date: Mon Nov 21 21:37:45 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.31 gsharp/drawing.lisp:1.32
--- gsharp/drawing.lisp:1.31 Mon Nov 21 03:11:08 2005
+++ gsharp/drawing.lisp Mon Nov 21 21:37:45 2005
@@ -4,9 +4,7 @@
((yoffset :initform 0 :accessor staff-yoffset)))
(define-added-mixin dnote () note
- (;; the relative x offset of the note with respect to the cluster
- (final-relative-note-xoffset :accessor final-relative-note-xoffset)
- (final-accidental :initform nil :accessor final-accidental)
+ ((final-accidental :initform nil :accessor final-accidental)
;; The relative x offset of the accidental of the note with respect
;; to the cluster. A value of nil indicates that accidental has
;; not been placed yet
@@ -433,36 +431,6 @@
(loop for note in notes do
(draw-note pane note notehead dots (final-absolute-note-xoffset note) (note-position note))))
-;;; given a group of notes (i.e. a list of notes, all displayed on the
-;;; same staff, compute their final x offsets. This is a question of
-;;; determining whether the note goes to the right or to the left of
-;;; the stem. The head-note of the stem goes to the left of an
-;;; up-stem and to the right of a down-stem. The x offset of a cluster
-;;; gives the x position of the head-note.
-(defun compute-final-relative-note-xoffsets (group direction)
- (setf group (sort (copy-list group)
- (if (eq direction :up)
- (lambda (x y) (< (note-position x) (note-position y)))
- (lambda (x y) (> (note-position x) (note-position y))))))
- (score-pane:with-suspended-note-offset offset
- ;; the first element of the group is the head-note
- (setf (final-relative-note-xoffset (car group)) 0)
- ;; OFFSET is a positive quantity that determines the
- ;; absolute difference between the x offset of a suspended
- ;; note and that of a normally positioned note.
- (when (eq direction :down) (setf offset (- offset)))
- (loop for note in (cdr group)
- and old-note = (car group) then note
- do (let* ((pos (note-position note))
- (old-pos (note-position old-note))
- ;; if adjacent notes are just one staff step apart,
- ;; then one must be suspended.
- (dx (if (= (abs (- pos old-pos)) 1) offset 0)))
- (setf (final-relative-note-xoffset note) dx)
- ;; go back to ordinary offset
- (when (= (abs (- pos old-pos)) 1)
- (setf note old-note))))))
-
;;; Given a list of notes to be displayed on the same staff line, for
;;; each note, compute the accidental to be displayed as a function of
;;; the accidentals of the note and the key signature of the staff.
@@ -610,15 +578,6 @@
(setf (final-relative-accidental-xoffset choice)
(accidental-min-xoffset choice notes staff-step))))))
-;;; given a list of notes, group them so that every note in the group
-;;; is displayed on the same staff. Return the list of groups.
-(defun group-notes-by-staff (notes)
- (let ((groups '()))
- (loop while notes do
- (push (remove (staff (car notes)) notes :test-not #'eq :key #'staff) groups)
- (setf notes (remove (staff (car notes)) notes :test #'eq :key #'staff)))
- groups))
-
;;; draw a cluster. The stem direction and the stem position have
;;; already been computed.
;;; 1. Group notes by staff.
@@ -639,7 +598,6 @@
(score-pane:with-vertical-score-position (pane stem-yoffset)
(draw-flags pane element x direction stem-pos)))
(loop for group in groups do
- (compute-final-relative-note-xoffsets group direction)
(compute-final-accidentals group)
(compute-final-relative-accidental-xoffset group x direction)
(draw-notes pane group (dots element) (notehead element))
Index: gsharp/gsharp.asd
diff -u gsharp/gsharp.asd:1.1 gsharp/gsharp.asd:1.2
--- gsharp/gsharp.asd:1.1 Tue Nov 1 18:19:51 2005
+++ gsharp/gsharp.asd Mon Nov 21 21:37:45 2005
@@ -27,13 +27,13 @@
"gf"
"sdl"
"charmap"
+ "score-pane"
"buffer"
"numbering"
"Obseq/obseq"
"measure"
"postscript"
"glyphs"
- "score-pane"
"beaming"
"drawing"
"cursor"
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.11 gsharp/measure.lisp:1.12
--- gsharp/measure.lisp:1.11 Mon Nov 21 03:11:08 2005
+++ gsharp/measure.lisp Mon Nov 21 21:37:45 2005
@@ -18,7 +18,17 @@
;;; Note
(defrclass rnote note
- ())
+ (;; the relative x offset of the note with respect to the cluster
+ (final-relative-note-xoffset :accessor final-relative-note-xoffset)))
+
+;;; given a list of notes, group them so that every note in the group
+;;; is displayed on the same staff. Return the list of groups.
+(defun group-notes-by-staff (notes)
+ (let ((groups '()))
+ (loop while notes do
+ (push (remove (staff (car notes)) notes :test-not #'eq :key #'staff) groups)
+ (setf notes (remove (staff (car notes)) notes :test #'eq :key #'staff)))
+ groups))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
@@ -342,6 +352,39 @@
(append (merge 'list (butlast bar1) (butlast bar2) #'<)
(list (max (car (last bar1)) (car (last bar2))))))
+;;; given a group of notes (i.e. a list of notes, all displayed on the
+;;; same staff, compute their final x offsets. This is a question of
+;;; determining whether the note goes to the right or to the left of
+;;; the stem. The head-note of the stem goes to the left of an
+;;; up-stem and to the right of a down-stem. The x offset of a cluster
+;;; gives the x position of the head-note.
+(defun compute-final-relative-note-xoffsets (group direction)
+ (setf group (sort (copy-list group)
+ (if (eq direction :up)
+ (lambda (x y) (< (note-position x) (note-position y)))
+ (lambda (x y) (> (note-position x) (note-position y))))))
+ (score-pane:with-suspended-note-offset offset
+ ;; the first element of the group is the head-note
+ (setf (final-relative-note-xoffset (car group)) 0)
+ ;; OFFSET is a positive quantity that determines the
+ ;; absolute difference between the x offset of a suspended
+ ;; note and that of a normally positioned note.
+ (when (eq direction :down) (setf offset (- offset)))
+ (loop for note in (cdr group)
+ and old-note = (car group) then note
+ do (let* ((pos (note-position note))
+ (old-pos (note-position old-note))
+ ;; if adjacent notes are just one staff step apart,
+ ;; then one must be suspended.
+ (dx (if (= (abs (- pos old-pos)) 1) offset 0)))
+ (setf (final-relative-note-xoffset note) dx)
+ ;; go back to ordinary offset
+ (when (= (abs (- pos old-pos)) 1)
+ (setf note old-note))))))
+
+(defun compute-staff-group-parameters (staff-group stem-direction)
+ (compute-final-relative-note-xoffsets staff-group stem-direction))
+
;;; compute some important parameters of an element
(defgeneric compute-element-parameters (element))
@@ -350,20 +393,26 @@
(defmethod compute-element-parameters ((element cluster))
(when (non-empty-cluster-p element)
- (compute-top-bot-pos element)))
+ (compute-top-bot-pos element)
+ (loop for staff-group in (group-notes-by-staff (notes element))
+ do (compute-staff-group-parameters staff-group (final-stem-direction element)))))
(defun compute-beam-group-parameters (elements)
(let ((any-element-modified nil))
(loop for element in elements
do (when (modified-p element)
- (compute-element-parameters element)
- (setf any-element-modified t)
- (setf (modified-p element) nil)))
+ (when (non-empty-cluster-p element)
+ (compute-top-bot-pos element))
+ (setf any-element-modified t)))
(when any-element-modified
(if (null (cdr elements))
(when (non-empty-cluster-p (car elements))
(compute-final-stem-direction (car elements)))
- (compute-final-stem-directions elements)))))
+ (compute-final-stem-directions elements)))
+ (loop for element in elements
+ do (when (modified-p element)
+ (compute-element-parameters element)
+ (setf (modified-p element) nil)))))
;;; Given a list of the elements of a bar, return a list of beam
;;; groups. A beam group is defined to be either a singleton list or
@@ -416,18 +465,19 @@
;;; to indicate the position of the measure in the sequence of all
;;; measures of the buffer.
(defun compute-measure (bars spacing-style seg-pos bar-pos)
- (loop for bar in bars
- do (when (modified-p bar)
- (compute-bar-parameters bar)
- (setf (modified-p bar) nil)))
- (let* ((start-times (remove-duplicates
- (reduce #'combine-bars
- (mapcar #'start-times bars))))
- (durations (abs-rel start-times))
- (min-dist (reduce #'min durations))
- (coeff (loop for duration in durations
- sum (expt duration spacing-style))))
- (make-measure min-dist coeff start-times seg-pos bar-pos bars)))
+ (score-pane:with-staff-size 6
+ (loop for bar in bars
+ do (when (modified-p bar)
+ (compute-bar-parameters bar)
+ (setf (modified-p bar) nil)))
+ (let* ((start-times (remove-duplicates
+ (reduce #'combine-bars
+ (mapcar #'start-times bars))))
+ (durations (abs-rel start-times))
+ (min-dist (reduce #'min durations))
+ (coeff (loop for duration in durations
+ sum (expt duration spacing-style))))
+ (make-measure min-dist coeff start-times seg-pos bar-pos bars))))
;;; Compute all the measures of a segment by stepping through all the
;;; bars in parallel as long as there is at least one simultaneous bar.
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.31 gsharp/packages.lisp:1.32
--- gsharp/packages.lisp:1.31 Mon Nov 21 03:11:08 2005
+++ gsharp/packages.lisp Mon Nov 21 21:37:45 2005
@@ -1,3 +1,16 @@
+(defpackage :esa
+ (:use :clim-lisp :clim)
+ (:export #:minibuffer-pane #:display-message
+ #:esa-pane-mixin #:previous-command
+ #:info-pane #:master-pane
+ #:esa-frame-mixin #:windows #:recordingp #:executingp
+ #:*numeric-argument-p* #:*current-gesture*
+ #:esa-top-level #:simple-command-loop
+ #:global-esa-table #:keyboard-macro-table
+ #:help-table
+ #:set-key
+ #:find-applicable-command-table))
+
(defpackage :gsharp-utilities
(:shadow built-in-class)
(:use :clim-lisp :clim-mop)
@@ -33,6 +46,20 @@
#:+glyph-flags-up-two+ #:+glyph-flags-up-three+ #:+glyph-flags-up-four+
#:+glyph-flags-up-five+))
+(defpackage :score-pane
+ (:use :clim :clim-extensions :clim-lisp :sdl :esa)
+ (:shadow #:rest)
+ (:export #:draw-fiveline-staff #:draw-lyrics-staff
+ #:draw-stem #:draw-right-stem #:draw-left-stem
+ #:draw-ledger-line #:draw-bar-line #:draw-beam #:staff-step
+ #:draw-notehead #:draw-accidental #:draw-clef #:draw-rest #:draw-dot
+ #:draw-flags-up #:draw-flags-down
+ #:with-score-pane #:with-vertical-score-position
+ #:with-staff-size #:with-notehead-right-offsets
+ #:with-suspended-note-offset
+ #:with-notehead-left-offsets #:with-light-glyphs #:score-pane
+ #:clef #:staff #:fiveline-staff #:lyrics-staff #:notehead))
+
(defpackage :gsharp-buffer
(:use :common-lisp :gsharp-utilities)
(:shadow #:rest)
@@ -104,7 +131,8 @@
#:measure-seq-cost
#:note-position #:non-empty-cluster-p
#:top-note #:bot-note #:top-note-pos #:bot-note-pos
- #:beam-groups #:final-stem-direction))
+ #:beam-groups #:final-stem-direction
+ #:group-notes-by-staff #:final-relative-note-xoffset))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
@@ -131,33 +159,6 @@
#:8th-flag-down #:extend-flag-down #:whole-rest #:half-rest
#:quarter-rest #:8th-rest #:16th-rest #:32nd-rest #:64th-rest
#:128th-rest #:measure-rest #:double-whole-rest))
-
-(defpackage :esa
- (:use :clim-lisp :clim)
- (:export #:minibuffer-pane #:display-message
- #:esa-pane-mixin #:previous-command
- #:info-pane #:master-pane
- #:esa-frame-mixin #:windows #:recordingp #:executingp
- #:*numeric-argument-p* #:*current-gesture*
- #:esa-top-level #:simple-command-loop
- #:global-esa-table #:keyboard-macro-table
- #:help-table
- #:set-key
- #:find-applicable-command-table))
-
-(defpackage :score-pane
- (:use :clim :clim-extensions :clim-lisp :sdl :esa)
- (:shadow #:rest)
- (:export #:draw-fiveline-staff #:draw-lyrics-staff
- #:draw-stem #:draw-right-stem #:draw-left-stem
- #:draw-ledger-line #:draw-bar-line #:draw-beam #:staff-step
- #:draw-notehead #:draw-accidental #:draw-clef #:draw-rest #:draw-dot
- #:draw-flags-up #:draw-flags-down
- #:with-score-pane #:with-vertical-score-position
- #:with-staff-size #:with-notehead-right-offsets
- #:with-suspended-note-offset
- #:with-notehead-left-offsets #:with-light-glyphs #:score-pane
- #:clef #:staff #:fiveline-staff #:lyrics-staff #:notehead))
(defpackage :gsharp-beaming
(:use :common-lisp)
1
0

21 Nov '05
Update of /project/gsharp/cvsroot/gsharp/Scores
In directory common-lisp.net:/tmp/cvs-serv16314
Modified Files:
rapsoden-sjunger.gsh
Log Message:
Adjust rapsoden-sjunger to cope with the new semibreve rest. (Make some
other minor changes to rest vertical positions: I don't know whether the
original positions were meant to reflect some notated score, but the
ones I've put in look better to me...)
Date: Mon Nov 21 13:19:44 2005
Author: crhodes
Index: gsharp/Scores/rapsoden-sjunger.gsh
diff -u gsharp/Scores/rapsoden-sjunger.gsh:1.3 gsharp/Scores/rapsoden-sjunger.gsh:1.4
--- gsharp/Scores/rapsoden-sjunger.gsh:1.3 Thu Aug 5 07:54:36 2004
+++ gsharp/Scores/rapsoden-sjunger.gsh Mon Nov 21 13:19:44 2005
@@ -1,369 +1,3 @@
G#V3
-[B :staves (#1=[= :name "two" :clef [K :name :TREBLE :lineno 2 ] :keysig #(:FLAT
- :FLAT
- :FLAT
- :NATURAL
- :FLAT
- :FLAT
- :FLAT) ]
- #2=[= :name "one" :clef [K :name :BASS :lineno 6 ] :keysig #(:FLAT
- :FLAT
- :FLAT
- :NATURAL
- :FLAT
- :FLAT
- :FLAT) ] ) :segments ([S :layers ([_ :name "one" :staves (#1#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 43 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 45 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 44 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 43 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 42 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 42 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 36 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 23 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ]
- [_ :name "two" :staves (#1#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos 0 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -2 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -2 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos 0 ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -2 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 29 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -6 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -12 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #1# :head :HALF :accidentals :FLAT :dots 0 ]
- [N :pitch 27 :staff #1# :head :HALF :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -6 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -6 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #1# :staff-pos -4 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ]
- [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ]
- [_ :name "three" :staves (#2#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 31 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 30 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 29 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 28 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 28 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 13 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :AUTO :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 13 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 4 ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ]
- [% :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :xoffset 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ]
- [_ :name "four" :staves (#2#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 2 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 4 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 2 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 2 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset -3 :stem-direction :AUTO :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ]
- [% :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset -3 :stem-direction :AUTO :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ]
- [N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements NIL ]
- [| :elements ([- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ]
- [% :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ]
- [- :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ]
- [| :elements ([- :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :xoffset 0 :staff #2# :staff-pos 0 ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ] ) ] ) :min-width 17 :spacing-style 0.4 :right-edge 700 :left-offset 30 :left-margin 20 ]
+[B :staves (#1=[= :name "two" :clef [K :name :TREBLE :lineno 2 ] :keysig #(:FLAT :FLAT :FLAT :NATURAL :FLAT :FLAT :FLAT) ] #2=[= :name "one" :clef [K :name :BASS :lineno 6 ] :keysig #(:FLAT :FLAT :FLAT :NATURAL :FLAT :FLAT :FLAT) ] ) :segments ([S :layers ([_ :name "one" :staves (#1#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :AUTO :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :AUTO :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 43 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 45 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 44 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 43 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :AUTO :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 42 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 42 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 35 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 36 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 41 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 40 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 39 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 38 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 37 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 36 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :AUTO :notes ([N :pitch 23 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 33 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 29 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ] [_ :name "two" :staves (#1#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -2 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos 0 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 34 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 32 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -2 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -2 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos 0 ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 31 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -2 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 29 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -6 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -12 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #1# :head :HALF :accidentals :FLAT :dots 0 ] [N :pitch 27 :staff #1# :head :HALF :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 30 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -6 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -6 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #1# :staff-pos -4 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] [N :pitch 28 :staff #1# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ] [_ :name "three" :staves (#2#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 29 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 31 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 30 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 29 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 28 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 28 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 13 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 13 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 21 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 14 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 17 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :staff #2# :staff-pos 4 ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 18 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 27 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 26 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 1 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 22 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :DOWN :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 1 :lbeams 0 :dots 0 :stem-direction :UP :notes ([N :pitch 24 :staff #2# :head :FILLED :accidentals :NATURAL :dots 0 ] ) ] [% :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 1 :dots 0 :stem-direction :UP :notes ([N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ] [_ :name "four" :staves (#2#) :head [/ :bars ([| :elements NIL ] ) ] :body [/ :bars ([| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 16 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 20 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 23 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset -3 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset -3 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :stem-direction :AUTO :notes ([N :pitch 25 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] ) ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 15 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] [N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements NIL ] [| :elements ([- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] [% :xoffset 0 :notehead :HALF :rbeams 0 :lbeams 0 :dots 0 :stem-direction :DOWN :notes ([N :pitch 19 :staff #2# :head :FILLED :accidentals :FLAT :dots 0 ] ) ] [- :xoffset 0 :notehead :FILLED :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] [| :elements ([- :xoffset 0 :notehead :WHOLE :rbeams 0 :lbeams 0 :dots 0 :staff #2# :staff-pos 0 ] ) ] ) ] :tail [/ :bars ([| :elements NIL ] ) ] ] ) ] ) :min-width 17 :spacing-style 0.4 :right-edge 700 :left-offset 30 :left-margin 20 ]
1
0

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 21 Nov '05
by rstrandh@common-lisp.net 21 Nov '05
21 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv1737
Modified Files:
drawing.lisp measure.lisp packages.lisp
Log Message:
moved computation of final stem direction from drawing.lisp to measure.lisp
Date: Mon Nov 21 03:11:09 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.30 gsharp/drawing.lisp:1.31
--- gsharp/drawing.lisp:1.30 Mon Nov 21 01:45:14 2005
+++ gsharp/drawing.lisp Mon Nov 21 03:11:08 2005
@@ -196,9 +196,6 @@
(bot-note-staff-yoffset :accessor bot-note-staff-yoffset)
(final-absolute-xoffset :accessor final-absolute-element-xoffset)))
-(define-added-mixin vcluster () cluster
- ((final-stem-direction :accessor final-stem-direction)))
-
(define-added-mixin welement () lyrics-element
((final-absolute-xoffset :accessor final-absolute-element-xoffset)))
@@ -216,20 +213,6 @@
(top-note-staff-yoffset element) 0
(bot-note-staff-yoffset element) 0)))
-;;; Given a non-empty cluster that is not beamed together with any
-;;; other clusters, compute and store its final stem direction.
-(defun compute-final-stem-direction (cluster)
- (assert (non-empty-cluster-p cluster))
- (setf (final-stem-direction cluster)
- (if (or (eq (stem-direction cluster) :up) (eq (stem-direction cluster) :down))
- (stem-direction cluster)
- (let ((top-note-pos (top-note-pos cluster))
- (bot-note-pos (bot-note-pos cluster)))
- (if (>= (- top-note-pos 4)
- (- 4 bot-note-pos))
- :down
- :up)))))
-
(defun compute-stem-length (element)
(let* ((top-note-pos (top-note-pos element))
(bot-note-pos (bot-note-pos element))
@@ -290,25 +273,6 @@
(incf start-time (duration element)))
(elements bar))))
-;;; Given a beam group containing at least two nonempty clusters,
-;;; compute and store the final stem directions of all the non-empty
-;;; clusters in the group
-(defun compute-final-stem-directions (elements)
- (let ((stem-direction (if (not (eq (stem-direction (car elements)) :auto))
- (stem-direction (car elements))
- (let ((top-note-pos
- (loop for element in elements
- when (non-empty-cluster-p element)
- maximize (top-note-pos element)))
- (bot-note-pos
- (loop for element in elements
- when (non-empty-cluster-p element)
- minimize (top-note-pos element))))
- (if (>= (- top-note-pos 4) (- 4 bot-note-pos)) :down :up)))))
- (loop for element in elements
- when (non-empty-cluster-p element)
- do (setf (final-stem-direction element) stem-direction))))
-
;;; the dominating note among a bunch of notes is the
;;; one that is closest to the beam, i.e. the one
;;; the one that is closest to the end of the stem that
@@ -330,25 +294,12 @@
(if (< (pitch n1) (pitch n2)) n1 n2))))))
notes))
-;;; Given a beam group, for each nonempty element, compute the top and
-;;; bottom note position, and the final stem direction.
-(defun compute-positions-and-stem-direction (elements)
-;; (loop for element in elements
-;; when (non-empty-cluster-p element)
-;; do (compute-top-bot-pos element))
- (if (null (cdr elements))
- (let ((element (car elements)))
- (when (non-empty-cluster-p element)
- (compute-final-stem-direction element)))
- (compute-final-stem-directions elements)))
-
(defun draw-beam-group (pane elements)
(mapc #'compute-top-bot-yoffset elements)
(if (null (cdr elements))
(let ((element (car elements)))
(when (or (typep element 'rest) (notes element))
(when (non-empty-cluster-p element)
- (compute-final-stem-direction element)
(compute-stem-length element))
(draw-element pane element (final-absolute-element-xoffset element))))
(let* ((stem-direction (final-stem-direction (car elements)))
@@ -402,43 +353,10 @@
(defun draw-cursor (pane x)
(draw-line* pane x (- (score-pane:staff-step -4)) x (- (score-pane:staff-step 12)) :ink +red+))
-;;; Given a list of the elements of a bar, return a list of beam
-;;; groups. A beam group is defined to be either a singleton list or
-;;; a list with more than one element. In the case of a singleton,
-;;; the element is either a non-cluster, an empty cluster, a cluster
-;;; that does not beam to the right, or a cluster that does beam to
-;;; the right, but either it is the last cluster in the bar, or the
-;;; first following cluster in the bar does not beam to the left. In
-;;; the case of a list with more than one element, the first element
-;;; is a cluster that beams to the right, the last element is a
-;;; cluster that beams to the left, and all other clusters in the list
-;;; beam both to the left and to the right. Notice that in the last
-;;; case, elements other than the first and the last can be
-;;; non-clusters, or empty clusters.
-(defun beam-groups (elements)
- (let ((group '()))
- (loop until (null elements) do
- (setf group (list (car elements))
- elements (cdr elements))
- (when (and (non-empty-cluster-p (car group))
- (plusp (rbeams (car group))))
- (loop while (and (not (null elements))
- (or (not (typep (car elements) 'cluster))
- (null (notes (car elements)))
- (plusp (lbeams (car elements)))))
- do (push (pop elements) group)
- until (and (non-empty-cluster-p (car group))
- (zerop (rbeams (car group)))))
- ;; pop off trailing unbeamable objects
- (loop until (non-empty-cluster-p (car group))
- do (push (pop group) elements)))
- collect (nreverse group))))
-
(defmethod draw-bar (pane (bar melody-bar) x width time-alist draw-cursor)
(compute-element-x-positions bar x time-alist)
(loop for group in (beam-groups (elements bar))
- do (compute-positions-and-stem-direction group)
- (draw-beam-group pane group))
+ do (draw-beam-group pane group))
(when (eq (cursor-bar *cursor*) bar)
(let ((elements (elements bar)))
(if (null (cursor-element *cursor*))
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.10 gsharp/measure.lisp:1.11
--- gsharp/measure.lisp:1.10 Mon Nov 21 01:45:18 2005
+++ gsharp/measure.lisp Mon Nov 21 03:11:08 2005
@@ -102,7 +102,8 @@
;;; Cluster
(define-added-mixin rcluster () cluster
- (;; the position, in staff steps, of the top not in the element.
+ ((final-stem-direction :accessor final-stem-direction)
+ ;; the position, in staff steps, of the top not in the element.
(top-note-pos :accessor top-note-pos)
;; the position, in staff steps, of the bottom note in the element.
(bot-note-pos :accessor bot-note-pos)))
@@ -128,6 +129,39 @@
(when (cluster note)
(mark-modified (cluster note))))
+;;; Given a non-empty cluster that is not beamed together with any
+;;; other clusters, compute and store its final stem direction.
+(defun compute-final-stem-direction (cluster)
+ (assert (non-empty-cluster-p cluster))
+ (setf (final-stem-direction cluster)
+ (if (or (eq (stem-direction cluster) :up) (eq (stem-direction cluster) :down))
+ (stem-direction cluster)
+ (let ((top-note-pos (top-note-pos cluster))
+ (bot-note-pos (bot-note-pos cluster)))
+ (if (>= (- top-note-pos 4)
+ (- 4 bot-note-pos))
+ :down
+ :up)))))
+
+;;; Given a beam group containing at least two nonempty clusters,
+;;; compute and store the final stem directions of all the non-empty
+;;; clusters in the group
+(defun compute-final-stem-directions (elements)
+ (let ((stem-direction (if (not (eq (stem-direction (car elements)) :auto))
+ (stem-direction (car elements))
+ (let ((top-note-pos
+ (loop for element in elements
+ when (non-empty-cluster-p element)
+ maximize (top-note-pos element)))
+ (bot-note-pos
+ (loop for element in elements
+ when (non-empty-cluster-p element)
+ minimize (top-note-pos element))))
+ (if (>= (- top-note-pos 4) (- 4 bot-note-pos)) :down :up)))))
+ (loop for element in elements
+ when (non-empty-cluster-p element)
+ do (setf (final-stem-direction element) stem-direction))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Rest
@@ -318,12 +352,60 @@
(when (non-empty-cluster-p element)
(compute-top-bot-pos element)))
+(defun compute-beam-group-parameters (elements)
+ (let ((any-element-modified nil))
+ (loop for element in elements
+ do (when (modified-p element)
+ (compute-element-parameters element)
+ (setf any-element-modified t)
+ (setf (modified-p element) nil)))
+ (when any-element-modified
+ (if (null (cdr elements))
+ (when (non-empty-cluster-p (car elements))
+ (compute-final-stem-direction (car elements)))
+ (compute-final-stem-directions elements)))))
+
+;;; Given a list of the elements of a bar, return a list of beam
+;;; groups. A beam group is defined to be either a singleton list or
+;;; a list with more than one element. In the case of a singleton,
+;;; the element is either a non-cluster, an empty cluster, a cluster
+;;; that does not beam to the right, or a cluster that does beam to
+;;; the right, but either it is the last cluster in the bar, or the
+;;; first following cluster in the bar does not beam to the left. In
+;;; the case of a list with more than one element, the first element
+;;; is a cluster that beams to the right, the last element is a
+;;; cluster that beams to the left, and all other clusters in the list
+;;; beam both to the left and to the right. Notice that in the last
+;;; case, elements other than the first and the last can be
+;;; non-clusters, or empty clusters.
+(defun beam-groups (elements)
+ (let ((group '()))
+ (loop until (null elements) do
+ (setf group (list (car elements))
+ elements (cdr elements))
+ (when (and (non-empty-cluster-p (car group))
+ (plusp (rbeams (car group))))
+ (loop while (and (not (null elements))
+ (or (not (typep (car elements) 'cluster))
+ (null (notes (car elements)))
+ (plusp (lbeams (car elements)))))
+ do (push (pop elements) group)
+ until (and (non-empty-cluster-p (car group))
+ (zerop (rbeams (car group)))))
+ ;; pop off trailing unbeamable objects
+ (loop until (non-empty-cluster-p (car group))
+ do (push (pop group) elements)))
+ collect (nreverse group))))
+
;;; compute some important parameters of a bar
-(defun compute-bar-parameters (bar)
- (loop for element in (elements bar)
- do (when (modified-p element)
- (compute-element-parameters element)
- (setf (modified-p element) nil))))
+(defgeneric compute-bar-parameters (bar))
+
+(defmethod compute-bar-parameter (bar)
+ nil)
+
+(defmethod compute-bar-parameters ((bar melody-bar))
+ (loop for group in (beam-groups (elements bar))
+ do (compute-beam-group-parameters group)))
;;; From a list of simultaneous bars (and some other stuff), create a
;;; measure. The `other stuff' is the spacing style, which is neded
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.30 gsharp/packages.lisp:1.31
--- gsharp/packages.lisp:1.30 Mon Nov 21 01:45:18 2005
+++ gsharp/packages.lisp Mon Nov 21 03:11:08 2005
@@ -103,7 +103,8 @@
#:reduced-width #:natural-width #:compress-factor
#:measure-seq-cost
#:note-position #:non-empty-cluster-p
- #:top-note #:bot-note #:top-note-pos #:bot-note-pos))
+ #:top-note #:bot-note #:top-note-pos #:bot-note-pos
+ #:beam-groups #:final-stem-direction))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
1
0

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 21 Nov '05
by rstrandh@common-lisp.net 21 Nov '05
21 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv27569
Modified Files:
drawing.lisp measure.lisp packages.lisp
Log Message:
Moved some more code from drawing.lisp to measure.lisp
Date: Mon Nov 21 01:45:22 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.29 gsharp/drawing.lisp:1.30
--- gsharp/drawing.lisp:1.29 Sat Nov 19 23:59:59 2005
+++ gsharp/drawing.lisp Mon Nov 21 01:45:14 2005
@@ -197,26 +197,11 @@
(final-absolute-xoffset :accessor final-absolute-element-xoffset)))
(define-added-mixin vcluster () cluster
- ((final-stem-direction :accessor final-stem-direction)
- ;; the position, in staff steps, of the top not in the element.
- (top-note-pos :accessor top-note-pos)
- ;; the position, in staff steps, of the bottom note in the element.
- (bot-note-pos :accessor bot-note-pos)))
+ ((final-stem-direction :accessor final-stem-direction)))
(define-added-mixin welement () lyrics-element
((final-absolute-xoffset :accessor final-absolute-element-xoffset)))
-;;; Compute and store some important information about a non-empty
-;;; cluster:
-;;; * the position, in staff steps of the top note.
-;;; * the position, in staff steps of the bottom note.
-(defun compute-top-bot-pos (cluster)
- (assert (non-empty-cluster-p cluster))
- (let ((top-note (top-note (notes cluster)))
- (bot-note (bot-note (notes cluster))))
- (setf (top-note-pos cluster) (note-position top-note)
- (bot-note-pos cluster) (note-position bot-note))))
-
;;; Compute and store several important pieces of information
;;; about an element:
;;; * the y-offset of the staff containing the top note.
@@ -305,11 +290,6 @@
(incf start-time (duration element)))
(elements bar))))
-;;; Return true if and only if the element is a non-empty cluster
-(defun non-empty-cluster-p (element)
- (and (typep element 'cluster)
- (not (null (notes element)))))
-
;;; Given a beam group containing at least two nonempty clusters,
;;; compute and store the final stem directions of all the non-empty
;;; clusters in the group
@@ -353,9 +333,9 @@
;;; Given a beam group, for each nonempty element, compute the top and
;;; bottom note position, and the final stem direction.
(defun compute-positions-and-stem-direction (elements)
- (loop for element in elements
- when (non-empty-cluster-p element)
- do (compute-top-bot-pos element))
+;; (loop for element in elements
+;; when (non-empty-cluster-p element)
+;; do (compute-top-bot-pos element))
(if (null (cdr elements))
(let ((element (car elements)))
(when (non-empty-cluster-p element)
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.9 gsharp/measure.lisp:1.10
--- gsharp/measure.lisp:1.9 Sat Nov 19 06:16:28 2005
+++ gsharp/measure.lisp Mon Nov 21 01:45:18 2005
@@ -101,6 +101,26 @@
;;;
;;; Cluster
+(define-added-mixin rcluster () cluster
+ (;; the position, in staff steps, of the top not in the element.
+ (top-note-pos :accessor top-note-pos)
+ ;; the position, in staff steps, of the bottom note in the element.
+ (bot-note-pos :accessor bot-note-pos)))
+
+;;; Return true if and only if the element is a non-empty cluster
+(defun non-empty-cluster-p (element)
+ (and (typep element 'cluster)
+ (not (null (notes element)))))
+
+;;; Compute and store some important information about a non-empty
+;;; cluster:
+;;; * the position, in staff steps of the top note.
+;;; * the position, in staff steps of the bottom note.
+(defun compute-top-bot-pos (cluster)
+ (assert (non-empty-cluster-p cluster))
+ (setf (top-note-pos cluster) (note-position (top-note (notes cluster)))
+ (bot-note-pos cluster) (note-position (bot-note (notes cluster)))))
+
(defmethod add-note :after ((element relement) (note note))
(mark-modified element))
@@ -288,6 +308,23 @@
(append (merge 'list (butlast bar1) (butlast bar2) #'<)
(list (max (car (last bar1)) (car (last bar2))))))
+;;; compute some important parameters of an element
+(defgeneric compute-element-parameters (element))
+
+(defmethod compute-element-parameters (element)
+ nil)
+
+(defmethod compute-element-parameters ((element cluster))
+ (when (non-empty-cluster-p element)
+ (compute-top-bot-pos element)))
+
+;;; compute some important parameters of a bar
+(defun compute-bar-parameters (bar)
+ (loop for element in (elements bar)
+ do (when (modified-p element)
+ (compute-element-parameters element)
+ (setf (modified-p element) nil))))
+
;;; From a list of simultaneous bars (and some other stuff), create a
;;; measure. The `other stuff' is the spacing style, which is neded
;;; in order to compute the coefficient of the measure, the position
@@ -297,6 +334,10 @@
;;; to indicate the position of the measure in the sequence of all
;;; measures of the buffer.
(defun compute-measure (bars spacing-style seg-pos bar-pos)
+ (loop for bar in bars
+ do (when (modified-p bar)
+ (compute-bar-parameters bar)
+ (setf (modified-p bar) nil)))
(let* ((start-times (remove-duplicates
(reduce #'combine-bars
(mapcar #'start-times bars))))
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.29 gsharp/packages.lisp:1.30
--- gsharp/packages.lisp:1.29 Sun Nov 20 20:17:22 2005
+++ gsharp/packages.lisp Mon Nov 21 01:45:18 2005
@@ -102,8 +102,8 @@
#:buffer-cost-method
#:reduced-width #:natural-width #:compress-factor
#:measure-seq-cost
- #:note-position
- #:top-note #:bot-note))
+ #:note-position #:non-empty-cluster-p
+ #:top-note #:bot-note #:top-note-pos #:bot-note-pos))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
1
0

[gsharp-cvs] CVS update: gsharp/buffer.lisp gsharp/gui.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 20 Nov '05
by rstrandh@common-lisp.net 20 Nov '05
20 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv3313
Modified Files:
buffer.lisp gui.lisp packages.lisp
Log Message:
Patch to allow the current note to be deleted.
(thanks to Robert J. Macomber)
Date: Sun Nov 20 20:17:22 2005
Author: rstrandh
Index: gsharp/buffer.lisp
diff -u gsharp/buffer.lisp:1.26 gsharp/buffer.lisp:1.27
--- gsharp/buffer.lisp:1.26 Wed Nov 16 02:27:34 2005
+++ gsharp/buffer.lisp Sun Nov 20 20:17:22 2005
@@ -352,6 +352,24 @@
(setf notes (delete note notes :test #'eq)))
(setf cluster nil)))
+(defun lower-bound (bound list &key (test #'<))
+ "Return the `largest' element in the sorted list LIST such that
+\(TEST element BOUND) is true."
+ (let ((last nil))
+ (dolist (item list)
+ (unless (funcall test item bound)
+ (return-from lower-bound last))
+ (setf last item))
+ last))
+
+(defmethod cluster-lower-bound ((cluster cluster) (bound note))
+ (with-slots (notes) cluster
+ (lower-bound bound notes :test #'note-less)))
+
+(defmethod cluster-upper-bound ((cluster cluster) (bound note))
+ (with-slots (notes) cluster
+ (lower-bound bound (reverse notes) :test (complement #'note-less))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Rest
Index: gsharp/gui.lisp
diff -u gsharp/gui.lisp:1.43 gsharp/gui.lisp:1.44
--- gsharp/gui.lisp:1.43 Mon Nov 14 21:26:14 2005
+++ gsharp/gui.lisp Sun Nov 20 20:17:22 2005
@@ -812,6 +812,19 @@
(add-note cluster new-note)
(setf *current-note* new-note)))
+(define-gsharp-command com-remove-current-note ()
+ (let ((cluster (cur-cluster))
+ (note (cur-note)))
+ (when note
+ (remove-note note)
+ ;; try to set current-note to the highest note lower than the
+ ;; removed note. If that fails, to the lowest note higher than
+ ;; it.
+ (setf *current-note* (or (cluster-lower-bound cluster note)
+ (cluster-upper-bound cluster note)))
+ (unless *current-note*
+ (com-erase-element)))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; motion by element
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.28 gsharp/packages.lisp:1.29
--- gsharp/packages.lisp:1.28 Sat Nov 19 06:16:28 2005
+++ gsharp/packages.lisp Sun Nov 20 20:17:22 2005
@@ -45,6 +45,7 @@
#:notehead #:rbeams #:lbeams #:dots #:element
#:melody-element #:notes
#:add-note #:find-note #:remove-note
+ #:cluster-upper-bound #:cluster-lower-bound
#:cluster #:make-cluster
#:rest #:make-rest
#:lyrics-element #:make-lyrics-element
1
0
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv10771
Modified Files:
drawing.lisp
Log Message:
Moved final stem direction and final top- and bottom positions to a
cluster mixin.
Renamed some parameters to correspond to a more specific type.
Added asserts for documentation and to simplify debugging.
Fixed spelling errors, most of which were caused by automatic completion.
Date: Sat Nov 19 23:59:59 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.28 gsharp/drawing.lisp:1.29
--- gsharp/drawing.lisp:1.28 Sat Nov 19 22:59:25 2005
+++ gsharp/drawing.lisp Sat Nov 19 23:59:59 2005
@@ -181,42 +181,41 @@
buffer)))))
(define-added-mixin velement () melody-element
- ((final-stem-direction :accessor final-stem-direction)
- ;; the position, in staff steps, of the end of the stem
+ (;; the position, in staff steps, of the end of the stem
;; that is not attached to a note, independent of the
;; staff on which it is located
(final-stem-position :accessor final-stem-position)
;; the yoffset of the staff relative to which the end of the
;; stem is located
(final-stem-yoffset :initform 0 :accessor final-stem-yoffset)
- ;; the position, in staff steps, of the bottom note in the element.
- (bot-note-pos :accessor bot-note-pos)
;; the yoffset of the staff that contains the top note of
;; the element
(top-note-staff-yoffset :accessor top-note-staff-yoffset)
- ;; the position, in staff steps, of the top not in the element.
- (top-note-pos :accessor top-note-pos)
;; the yoffset of the staff that contains the bottom note of
;; the element
(bot-note-staff-yoffset :accessor bot-note-staff-yoffset)
(final-absolute-xoffset :accessor final-absolute-element-xoffset)))
+(define-added-mixin vcluster () cluster
+ ((final-stem-direction :accessor final-stem-direction)
+ ;; the position, in staff steps, of the top not in the element.
+ (top-note-pos :accessor top-note-pos)
+ ;; the position, in staff steps, of the bottom note in the element.
+ (bot-note-pos :accessor bot-note-pos)))
+
(define-added-mixin welement () lyrics-element
((final-absolute-xoffset :accessor final-absolute-element-xoffset)))
-;;; Compute and store several important pieces of information
-;;; about an element:
+;;; Compute and store some important information about a non-empty
+;;; cluster:
;;; * the position, in staff steps of the top note.
;;; * the position, in staff steps of the bottom note.
-(defun compute-top-bot-pos (element)
- (if (and (typep element 'cluster) (notes element))
- (let ((top-note (top-note (notes element)))
- (bot-note (bot-note (notes element))))
- (setf (top-note-pos element) (note-position top-note)
- (bot-note-pos element) (note-position bot-note)))
-;; (setf (top-note-pos element) 4
-;; (bot-note-pos element) 4)
- ))
+(defun compute-top-bot-pos (cluster)
+ (assert (non-empty-cluster-p cluster))
+ (let ((top-note (top-note (notes cluster)))
+ (bot-note (bot-note (notes cluster))))
+ (setf (top-note-pos cluster) (note-position top-note)
+ (bot-note-pos cluster) (note-position bot-note))))
;;; Compute and store several important pieces of information
;;; about an element:
@@ -232,14 +231,15 @@
(top-note-staff-yoffset element) 0
(bot-note-staff-yoffset element) 0)))
-;;; Compute and store the final stem direction of an element that is
-;;; not beamed together with any other elements.
-(defun compute-final-stem-direction (element)
- (setf (final-stem-direction element)
- (if (or (eq (stem-direction element) :up) (eq (stem-direction element) :down))
- (stem-direction element)
- (let ((top-note-pos (top-note-pos element))
- (bot-note-pos (bot-note-pos element)))
+;;; Given a non-empty cluster that is not beamed together with any
+;;; other clusters, compute and store its final stem direction.
+(defun compute-final-stem-direction (cluster)
+ (assert (non-empty-cluster-p cluster))
+ (setf (final-stem-direction cluster)
+ (if (or (eq (stem-direction cluster) :up) (eq (stem-direction cluster) :down))
+ (stem-direction cluster)
+ (let ((top-note-pos (top-note-pos cluster))
+ (bot-note-pos (bot-note-pos cluster)))
(if (>= (- top-note-pos 4)
(- 4 bot-note-pos))
:down
@@ -306,25 +306,27 @@
(elements bar))))
;;; Return true if and only if the element is a non-empty cluster
-(defun non-empty-custer-p (element)
+(defun non-empty-cluster-p (element)
(and (typep element 'cluster)
(not (null (notes element)))))
-;;; Compute and store the final stem directions of all the elements of
-;;; a beam group with at least two elements in it.
+;;; Given a beam group containing at least two nonempty clusters,
+;;; compute and store the final stem directions of all the non-empty
+;;; clusters in the group
(defun compute-final-stem-directions (elements)
(let ((stem-direction (if (not (eq (stem-direction (car elements)) :auto))
(stem-direction (car elements))
(let ((top-note-pos
(loop for element in elements
- when (non-empty-custer-p element)
+ when (non-empty-cluster-p element)
maximize (top-note-pos element)))
(bot-note-pos
(loop for element in elements
- when (non-empty-custer-p element)
+ when (non-empty-cluster-p element)
minimize (top-note-pos element))))
(if (>= (- top-note-pos 4) (- 4 bot-note-pos)) :down :up)))))
(loop for element in elements
+ when (non-empty-cluster-p element)
do (setf (final-stem-direction element) stem-direction))))
;;; the dominating note among a bunch of notes is the
@@ -348,16 +350,16 @@
(if (< (pitch n1) (pitch n2)) n1 n2))))))
notes))
-;;; Given a list of elements to be beamed together, for each element,
-;;; compute the top and bottom note position, and the final stem
-;;; direction.
+;;; Given a beam group, for each nonempty element, compute the top and
+;;; bottom note position, and the final stem direction.
(defun compute-positions-and-stem-direction (elements)
- (mapc #'compute-top-bot-pos elements)
+ (loop for element in elements
+ when (non-empty-cluster-p element)
+ do (compute-top-bot-pos element))
(if (null (cdr elements))
(let ((element (car elements)))
- (when (or (typep element 'rest) (notes element))
- (when (typep element 'cluster)
- (compute-final-stem-direction element))))
+ (when (non-empty-cluster-p element)
+ (compute-final-stem-direction element)))
(compute-final-stem-directions elements)))
(defun draw-beam-group (pane elements)
@@ -365,14 +367,14 @@
(if (null (cdr elements))
(let ((element (car elements)))
(when (or (typep element 'rest) (notes element))
- (when (typep element 'cluster)
+ (when (non-empty-cluster-p element)
(compute-final-stem-direction element)
(compute-stem-length element))
(draw-element pane element (final-absolute-element-xoffset element))))
(let* ((stem-direction (final-stem-direction (car elements)))
(dominating-notes
(loop for element in elements
- when (non-empty-custer-p element)
+ when (non-empty-cluster-p element)
collect (dominating-note (notes element) stem-direction)))
(dominating-staff
(staff (dominating-note dominating-notes stem-direction)))
@@ -438,17 +440,17 @@
(loop until (null elements) do
(setf group (list (car elements))
elements (cdr elements))
- (when (and (non-empty-custer-p (car group))
+ (when (and (non-empty-cluster-p (car group))
(plusp (rbeams (car group))))
(loop while (and (not (null elements))
(or (not (typep (car elements) 'cluster))
(null (notes (car elements)))
(plusp (lbeams (car elements)))))
do (push (pop elements) group)
- until (and (non-empty-custer-p (car group))
+ until (and (non-empty-cluster-p (car group))
(zerop (rbeams (car group)))))
;; pop off trailing unbeamable objects
- (loop until (non-empty-custer-p (car group))
+ (loop until (non-empty-cluster-p (car group))
do (push (pop group) elements)))
collect (nreverse group))))
@@ -730,7 +732,7 @@
;;; 6. If necessary, draw ledger lines for notes in a group
;;; 7. Draw the stem, if any
(defmethod draw-element (pane (element cluster) x &optional (flags t))
- (when (notes element)
+ (unless (null (notes element))
(let ((direction (final-stem-direction element))
(stem-pos (final-stem-position element))
(stem-yoffset (final-stem-yoffset element))
1
0
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv6376
Modified Files:
drawing.lisp
Log Message:
Be more precise when computing beam groups.
It is now possible to have a rest or an empty cluster in the middle
of a beam group.
Date: Sat Nov 19 22:59:26 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.27 gsharp/drawing.lisp:1.28
--- gsharp/drawing.lisp:1.27 Sat Nov 19 06:16:28 2005
+++ gsharp/drawing.lisp Sat Nov 19 22:59:25 2005
@@ -214,8 +214,9 @@
(bot-note (bot-note (notes element))))
(setf (top-note-pos element) (note-position top-note)
(bot-note-pos element) (note-position bot-note)))
- (setf (top-note-pos element) 4
- (bot-note-pos element) 4)))
+;; (setf (top-note-pos element) 4
+;; (bot-note-pos element) 4)
+ ))
;;; Compute and store several important pieces of information
;;; about an element:
@@ -304,13 +305,24 @@
(incf start-time (duration element)))
(elements bar))))
+;;; Return true if and only if the element is a non-empty cluster
+(defun non-empty-custer-p (element)
+ (and (typep element 'cluster)
+ (not (null (notes element)))))
+
;;; Compute and store the final stem directions of all the elements of
;;; a beam group with at least two elements in it.
(defun compute-final-stem-directions (elements)
(let ((stem-direction (if (not (eq (stem-direction (car elements)) :auto))
(stem-direction (car elements))
- (let ((top-note-pos (reduce #'max elements :key #'top-note-pos))
- (bot-note-pos (reduce #'min elements :key #'bot-note-pos)))
+ (let ((top-note-pos
+ (loop for element in elements
+ when (non-empty-custer-p element)
+ maximize (top-note-pos element)))
+ (bot-note-pos
+ (loop for element in elements
+ when (non-empty-custer-p element)
+ minimize (top-note-pos element))))
(if (>= (- top-note-pos 4) (- 4 bot-note-pos)) :down :up)))))
(loop for element in elements
do (setf (final-stem-direction element) stem-direction))))
@@ -359,8 +371,9 @@
(draw-element pane element (final-absolute-element-xoffset element))))
(let* ((stem-direction (final-stem-direction (car elements)))
(dominating-notes
- (mapcar (lambda (e) (dominating-note (notes e) stem-direction))
- elements))
+ (loop for element in elements
+ when (non-empty-custer-p element)
+ collect (dominating-note (notes element) stem-direction)))
(dominating-staff
(staff (dominating-note dominating-notes stem-direction)))
(positions (mapcar (lambda (n)
@@ -408,17 +421,35 @@
(draw-line* pane x (- (score-pane:staff-step -4)) x (- (score-pane:staff-step 12)) :ink +red+))
;;; Given a list of the elements of a bar, return a list of beam
-;;; groups, where each beam group is a list of elements that are
-;;; beamed together
+;;; groups. A beam group is defined to be either a singleton list or
+;;; a list with more than one element. In the case of a singleton,
+;;; the element is either a non-cluster, an empty cluster, a cluster
+;;; that does not beam to the right, or a cluster that does beam to
+;;; the right, but either it is the last cluster in the bar, or the
+;;; first following cluster in the bar does not beam to the left. In
+;;; the case of a list with more than one element, the first element
+;;; is a cluster that beams to the right, the last element is a
+;;; cluster that beams to the left, and all other clusters in the list
+;;; beam both to the left and to the right. Notice that in the last
+;;; case, elements other than the first and the last can be
+;;; non-clusters, or empty clusters.
(defun beam-groups (elements)
(let ((group '()))
- (loop while (not (null elements)) do
- (setf group '())
- (push (pop elements) group)
- (loop while (and (not (null elements))
- (> (rbeams (car group)) 0)
- (> (lbeams (car elements)) 0))
- do (push (pop elements) group))
+ (loop until (null elements) do
+ (setf group (list (car elements))
+ elements (cdr elements))
+ (when (and (non-empty-custer-p (car group))
+ (plusp (rbeams (car group))))
+ (loop while (and (not (null elements))
+ (or (not (typep (car elements) 'cluster))
+ (null (notes (car elements)))
+ (plusp (lbeams (car elements)))))
+ do (push (pop elements) group)
+ until (and (non-empty-custer-p (car group))
+ (zerop (rbeams (car group)))))
+ ;; pop off trailing unbeamable objects
+ (loop until (non-empty-custer-p (car group))
+ do (push (pop group) elements)))
collect (nreverse group))))
(defmethod draw-bar (pane (bar melody-bar) x width time-alist draw-cursor)
1
0

[gsharp-cvs] CVS update: gsharp/drawing.lisp gsharp/measure.lisp gsharp/packages.lisp
by rstrandh@common-lisp.net 19 Nov '05
by rstrandh@common-lisp.net 19 Nov '05
19 Nov '05
Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv30117
Modified Files:
drawing.lisp measure.lisp packages.lisp
Log Message:
Started moving code from drawing.lisp to measure.lisp in order to
prepare for computing physical widths earlier.
Date: Sat Nov 19 06:16:28 2005
Author: rstrandh
Index: gsharp/drawing.lisp
diff -u gsharp/drawing.lisp:1.26 gsharp/drawing.lisp:1.27
--- gsharp/drawing.lisp:1.26 Fri Nov 18 20:41:44 2005
+++ gsharp/drawing.lisp Sat Nov 19 06:16:28 2005
@@ -204,36 +204,6 @@
(define-added-mixin welement () lyrics-element
((final-absolute-xoffset :accessor final-absolute-element-xoffset)))
-;;; given a list of notes, return the one that is at the top
-(defun top-note (notes)
- (reduce (lambda (n1 n2)
- (cond ((< (staff-yoffset (staff n1))
- (staff-yoffset (staff n2)))
- n1)
- ((> (staff-yoffset (staff n1))
- (staff-yoffset (staff n2)))
- n2)
- ((> (note-position n1)
- (note-position n2))
- n1)
- (t n2)))
- notes))
-
-;;; given a list of notes, return the one that is at the bottom
-(defun bot-note (notes)
- (reduce (lambda (n1 n2)
- (cond ((> (staff-yoffset (staff n1))
- (staff-yoffset (staff n2)))
- n1)
- ((< (staff-yoffset (staff n1))
- (staff-yoffset (staff n2)))
- n2)
- ((< (note-position n1)
- (note-position n2))
- n1)
- (t n2)))
- notes))
-
;;; Compute and store several important pieces of information
;;; about an element:
;;; * the position, in staff steps of the top note.
@@ -492,12 +462,6 @@
(defmethod note-difference ((note1 note) (note2 note))
(- (pitch note1) (pitch note2)))
-
-(defmethod note-position ((note note))
- (let ((clef (clef (staff note))))
- (+ (- (pitch note)
- (ecase (name clef) (:treble 32) (:bass 24) (:c 35)))
- (lineno clef))))
(defun draw-ledger-lines (pane x notes)
(score-pane:with-vertical-score-position (pane (staff-yoffset (staff (car notes))))
Index: gsharp/measure.lisp
diff -u gsharp/measure.lisp:1.8 gsharp/measure.lisp:1.9
--- gsharp/measure.lisp:1.8 Fri Nov 18 02:59:27 2005
+++ gsharp/measure.lisp Sat Nov 19 06:16:28 2005
@@ -8,6 +8,13 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
+;;; Staff
+
+(define-added-mixin rstaff () staff
+ ((rank :accessor staff-rank)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
;;; Note
(defrclass rnote note
@@ -54,6 +61,42 @@
(declare (ignore dots))
(mark-modified element))
+(defmethod note-position ((note note))
+ (let ((clef (clef (staff note))))
+ (+ (- (pitch note)
+ (ecase (name clef) (:treble 32) (:bass 24) (:c 35)))
+ (lineno clef))))
+
+;;; given a list of notes, return the one that is at the top
+(defun top-note (notes)
+ (reduce (lambda (n1 n2)
+ (cond ((< (staff-rank (staff n1))
+ (staff-rank (staff n2)))
+ n1)
+ ((> (staff-rank (staff n1))
+ (staff-rank (staff n2)))
+ n2)
+ ((> (note-position n1)
+ (note-position n2))
+ n1)
+ (t n2)))
+ notes))
+
+;;; given a list of notes, return the one that is at the bottom
+(defun bot-note (notes)
+ (reduce (lambda (n1 n2)
+ (cond ((> (staff-rank (staff n1))
+ (staff-rank (staff n2)))
+ n1)
+ ((< (staff-rank (staff n1))
+ (staff-rank (staff n2)))
+ n2)
+ ((< (note-position n1)
+ (note-position n2))
+ n1)
+ (t n2)))
+ notes))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Cluster
@@ -369,6 +412,10 @@
(defmethod recompute-measures ((buffer rbuffer))
(when (modified-p buffer)
+ ;; number the staves
+ (loop for staff in (staves buffer)
+ for i from 0
+ do (setf (staff-rank staff) i))
;; for now, invalidate everything
(mapc #'adjust-lowpos-highpos (segments buffer))
;; initialize cost method from buffer-specific style parameters
Index: gsharp/packages.lisp
diff -u gsharp/packages.lisp:1.27 gsharp/packages.lisp:1.28
--- gsharp/packages.lisp:1.27 Mon Nov 14 15:27:32 2005
+++ gsharp/packages.lisp Sat Nov 19 06:16:28 2005
@@ -100,7 +100,9 @@
#:recompute-measures #:measure-cost-method #:make-measure-cost-method
#:buffer-cost-method
#:reduced-width #:natural-width #:compress-factor
- #:measure-seq-cost))
+ #:measure-seq-cost
+ #:note-position
+ #:top-note #:bot-note))
(defpackage :gsharp-postscript
(:use :clim :clim-lisp)
1
0