Update of /project/fomus/cvsroot/fomus In directory common-lisp:/tmp/cvs-serv9366
Modified Files: accidentals.lisp backend_cmn.lisp backend_ly.lisp backend_xml.lisp data.lisp marks.lisp misc.lisp postproc.lisp test.lisp util.lisp version.lisp Log Message: bug fixes
--- /project/fomus/cvsroot/fomus/accidentals.lisp 2006/01/19 00:02:35 1.14 +++ /project/fomus/cvsroot/fomus/accidentals.lisp 2006/01/28 20:31:19 1.15 @@ -409,41 +409,42 @@ ;; rests are removed already, after chords & ties ;; events are events in 1 measure (defun acc-nokey-postaccs (events) - (when *acc-throughout-meas* - (let ((as (make-array 128 :element-type '(or null (cons (integer -2 2) (rational -1/2 1/2))) :initial-element nil)) - (ac (make-array 128 :element-type '(or null (cons (integer -2 2) (rational -1/2 1/2))) :initial-element nil))) - (flet ((fixacc (e n a a2 tl) - (declare (type noteex e) (type rational n) (type (integer -2 2) a) (type (rational -1/2 1/2) a2) (type boolean tl)) - (let ((w (- n a a2))) - (if tl - (setf (svref as w) (unless (and (= a 0) (= a2 0)) (cons a a2)) (svref ac w) t) - (if (and (= a 0) (= a2 0)) - (when (svref as w) ; show the natural - (setf (svref as w) nil) - (rmmark e (list :cautacc w)) - (addmark e (list (if (svref ac w) :cautacc :showacc) w))) - (if (equal (svref as w) (cons a a2)) - (addmark e (list :hideacc w)) - (setf (svref as w) (cons a a2) (svref ac w) nil))))))) - (loop - for e of-type noteex in events - if (chordp e) - do (loop - for n of-type rational in (event-notes* e) - and a of-type (integer -2 2) in (event-accs e) - and a2 of-type (rational -1/2 1/2) in (event-addaccs e) - and tl of-type boolean in (event-tielt e) - do (fixacc e n a a2 tl)) - else do (fixacc e (event-note* e) (event-acc e) (event-addacc e) (event-tielt e)))))) + (let ((as (make-array 128 :element-type '(or null (cons (integer -2 2) (rational -1/2 1/2))) :initial-element nil)) + (ac (make-array 128 :element-type '(or null (cons (integer -2 2) (rational -1/2 1/2))) :initial-element nil))) + (flet ((fixacc (e n a a2 tl) + (declare (type noteex e) (type rational n) (type (integer -2 2) a) (type (rational -1/2 1/2) a2) (type boolean tl)) + (let ((w (- n a a2))) + (if tl + (setf (svref as w) (unless (and (= a 0) (= a2 0)) (cons a a2)) (svref ac w) t) + (if (and (= a 0) (= a2 0)) + (when (svref as w) ; show the natural + (setf (svref as w) nil) + (rmmark e (list :cautacc w)) + (addmark e (list (if (svref ac w) :cautacc :showacc) w))) + (if (equal (svref as w) (cons a a2)) + (addmark e (list :hideacc w)) + (setf (svref as w) (cons a a2) (svref ac w) nil))))))) + (loop + for e of-type noteex in events + if (chordp e) + do (loop + for n of-type rational in (event-notes* e) + and a of-type (integer -2 2) in (event-accs e) + and a2 of-type (rational -1/2 1/2) in (event-addaccs e) + and tl of-type boolean in (event-tielt e) + do (fixacc e n a a2 tl)) + else do (fixacc e (event-note* e) (event-acc e) (event-addacc e) (event-tielt e))))) (print-dot))
;; post processing (defun postaccs (parts) - (loop for p of-type partex in parts unless (is-percussion p) do - (loop for m of-type meas in (part-meas p) do - (multiple-value-bind (evs rs) (split-list (meas-events m) #'notep) - (case (auto-accs-fun) - (:nokey1 (acc-nokey-postaccs evs)) - (otherwise (error "Unknown accidental assignment function ~S" *auto-accs-mod*))) - (setf (meas-events m) (sort (nconc rs evs) #'sort-offdur)))))) + (when *acc-throughout-meas* + (loop for p of-type partex in parts unless (is-percussion p) do + (loop for m of-type meas in (part-meas p) do + (multiple-value-bind (evs rs) (split-list (meas-events m) #'notep) + (loop for ev of-type cons in (split-into-groups evs #'event-staff) do + (case (auto-accs-fun) + (:nokey1 (acc-nokey-postaccs (copy-list (sort ev #'sort-offdur)))) + (otherwise (error "Unknown accidental assignment function ~S" *auto-accs-mod*)))) + (setf (meas-events m) (sort (nconc rs evs) #'sort-offdur)))))))
--- /project/fomus/cvsroot/fomus/backend_cmn.lisp 2006/01/26 05:48:21 1.4 +++ /project/fomus/cvsroot/fomus/backend_cmn.lisp 2006/01/28 20:31:19 1.5 @@ -8,6 +8,10 @@ (in-package :fomus) (compile-settings)
+(eval-when (:load-toplevel :execute) + (defparameter +cmn-view-exe+ +ghostview-exe+)) +(defparameter +cmn-view-opts+ #-darwin nil #+darwin '("/Applications/Preview.app")) + (defparameter +cmn-comment+ ";;; CMN score file~%;;; ~A v~A.~A.~A~%~%")
(defparameter +cmn-num-note+ (vector "C" nil "D" nil "E" "F" nil "G" nil "A" nil "B")) @@ -22,9 +26,13 @@ (defparameter +cmn-durations+ '((1/16 . 64th) (3/32 . 64th.) (1/8 . 32nd) (3/16 . 32nd.) (1/4 . s) (3/8 . s.) (7/16 . s..) + (1/6 . ts) (1/2 . e) (3/4 . e.) (7/8 . e..) + (1/3 . te) (1 . q) (3/2 . q.) (7/4 . q..) + (2/3 . tq) (2 . h) (3 . h.) (7/2 . h..) + (4/3 . th) (4 . w) (6 . w.) (8 . dw))) (defparameter +cmn-restdurs+ '((1/32 . one-twenty-eighth-rest) @@ -37,10 +45,6 @@ (4 . whole-rest) (6 . dotted-whole-rest) (8 . double-whole-rest)))
-;; french-violin treble tenor-treble soprano mezzo-soprano alto tenor baritone baritone-c -;; baritone-f bass sub-bass double-bass -;; percussion quad-bass double-treble quad-treble - (defparameter +cmn-clefs+ '((:subbass-8dn . sub-bass) (:bass-8dn . double-bass) (:c-baritone-8dn . baritone-c) (:f-baritone-8dn . baritone-f) (:tenor-8dn . tenor) (:subbass . sub-bass) (:alto-8dn . alto) (:bass . bass) (:mezzosoprano-8dn . mezzo-soprano) (:c-baritone . baritone-c) (:f-baritone . baritone-f) (:soprano-8dn . soprano) (:tenor . tenor) (:subbass-8up . sub-bass) (:treble-8dn . tenor-treble) (:alto . alto) (:bass-8up . bass) @@ -48,7 +52,9 @@ (:treble . treble) (:alto-8up . alto) (:mezzosoprano-8up . mezzo-soprano) (:soprano-8up . soprano) (:treble-8up . double-treble) (:percussion . percussion)))
-(defparameter +cmn-options+ '((automatic-rests nil) (implicit-accidental-duration 1) (implicit-accidental-style :new-style))) +(defparameter +cmn-options+ '((automatic-rests nil) (implicit-accidental-duration 1) (implicit-accidental-style :new-style) + (automatic-beams nil) (automatic-octave-signs nil))) +(defparameter +cmn-changeableopts+ '((all-output-in-one-file t) (size 24)))
(defun internalize (x) (typecase x @@ -57,30 +63,55 @@ (list (mapcar #'internalize x)) (otherwise x)))
-;; (defparameter +cmn-writeflags+ '(:escape t)) - (defparameter +cmn-out-ext+ "eps")
-;; (defun save-cmn (parts header filename options process view) nil) +(defun view-cmn (filename options view) + (when (not *cmn-exists*) ;; for viewing only + (format t ";; ERROR: Common Music Notation required for CMN output~%") + (return-from view-cmn)) + (when (>= *verbose* 1) (out ";; Compiling/opening ~S for viewing...~%" filename)) + (destructuring-bind (&key view-exe view-exe-opts out-ext &allow-other-keys) options + (flet ((er (str) + (format t ";; ERROR: Error ~A CMN file~%" str) + (return-from view-cmn))) + #+(and (or cmu sbcl openmcl allegro) (or linux darwin unix)) + (progn + (ignore-errors (delete-file (change-filename filename :ext (or out-ext +cmn-out-ext+)))) + (#+cmu unix:unix-chdir #+sbcl sb-posix:chdir #+openmcl ccl:cwd #+allegro excl:chdir + (change-filename filename :name nil :ext nil)) + (if (ignore-errors (load filename)) + (progn + (unless (probe-file (change-filename filename :ext (or out-ext +cmn-out-ext+))) (er "compiling")) + (when view + (unless #+(or cmu sbcl openmcl) (#+cmu extensions:run-program #+sbcl sb-ext:run-program #+openmcl ccl:run-program + (or view-exe +cmn-view-exe+) + (append (or view-exe-opts +cmn-view-opts+) + (list (change-filename filename :ext (or out-ext +cmn-out-ext+)))) + :wait nil) + #+allegro (= (run-allegro-cmd + (apply #'vector (cons (or view-exe +cmn-view-exe+) + (cons (or view-exe +cmn-view-exe+) + (append (or view-exe-opts +cmn-view-opts+) + (list (change-filename filename :ext (or out-ext +cmn-out-ext+))))))) nil) 0) + (er "viewing")))) + (er "compiling"))) + #-(and (or cmu sbcl openmcl allegro) (or linux darwin unix)) (format t ";; ERROR: Don't know how to compile/view CMN file~%"))))
(defun save-cmn (parts header filename options process view) - (when (and (not *cmn-exists*) (or process view)) ;; for viewing only - (format t ";; ERROR: Common Music Notation required for CMN output~%") - (return-from save-cmn)) (when (>= *verbose* 1) (out ";; Saving CMN file ~S...~%" filename)) (with-open-file (f filename :direction :output :if-exists :supersede) (destructuring-bind (&key score-attr out-ext &allow-other-keys) options (format f "~A" header) (let ((de 0) (phash (make-hash-table :test 'equal))) (flet ((cmndur (val m) (* val (timesig-beat* (meas-timesig m)) 4)) - (cmnnote (wnum acc1 acc2 dur hide show caut harmt harms) ;; wdur is actual dur * beat * 4 + (cmnnote (wnum acc1 acc2 dur hide show caut harmt harms) ;; wdur is actual dur * beat * 4 (let ((acc (unless hide (if *quartertones* (svref (svref +cmn-num-accq+ (+ acc1 2)) (1+ (* acc2 2))) (svref +cmn-num-acc+ (+ acc1 2)))))) (when caut (setf acc (list acc 'in-parentheses))) (when (and (equal acc 'natural) (not show)) (setf acc nil)) (nconc (list (intern (conc-strings (svref +cmn-num-note+ (mod wnum 12)) (case acc (flat "F") (natural "N") (sharp "S") (otherwise "")) - (format nil "~D" (1- (truncate wnum 12))))) - (or (lookup dur +cmn-durations+) (list 'rq dur))) + (format nil "~D" (1- (truncate wnum 12)))))) + (when dur (list (or (lookup dur +cmn-durations+) (list 'rq dur)))) (unless (member acc '(nil flat natural sharp)) (list acc))))) (cmnname (p) (incf de) @@ -92,79 +123,98 @@ collect (string x)))) "-" (string (code-char (+ 64 de))))))) - (let ((cmp (loop for p in parts nconc - (destructuring-bind (&key (cmn-partname (cmnname p)) &allow-other-keys) (part-opts p) - (loop with nvce = (loop for e in (part-meas p) maximize (length (meas-voices e))) - for vi from 0 below nvce nconc ; loop through voices - (loop with pna = (if (> nvce 1) (format nil "~A~D" cmn-partname (1+ vi)) cmn-partname) - and ns = (instr-staves (part-instr p)) ; number of staves - for si from 1 to ns - for ipna = (intern (if (> ns 1) - (if (> nvce 0) - (format nil "~A~D~D" pna (1+ vi) si) - (format nil "~A1~D" pna si)) - (if (> nvce 0) - (format nil "~A~D" pna (1+ vi)) - pna))) - do (setf (gethash p phash) (nconc (gethash p phash) (list ipna))) - collect - `(,ipna - (staff bar - ,@(when (and (<= si 1) (part-name p)) (list (list 'staff-name (part-name p)))) - ,@(when (> vi 0) - (list (list 'tied-to (intern (if (> ns 1) - (format nil "~A1~D" pna si) - (format nil "~A1" pna)))))) - ,(lookup (second (find si (getprops p :clef) :key #'third)) +cmn-clefs+) - ,@(loop with o = 0 and st = 1 - for m in (part-meas p) - and stoff = 0 then (+ stoff lmdur) - for lmdur = (cmndur (- (meas-endoff m) (meas-off m)) m) - when (getprop m :startsig) collect (list 'meter (timesig-num (meas-timesig m)) (timesig-den (meas-timesig m))) - nconc - (loop for e in (nth vi (meas-events m)) - for co = (+ stoff (cmndur (- (event-off e) (meas-off m)) m)) - do (setf st (or (third (getmark e '(:staff :voice))) st)) - when (= st si) collect - (let ((y (if (restp e) - (or (lookup (cmndur (event-dur* e) m) +cmn-restdurs+) (error "Finish me")) - (if (chordp e) - (cons 'chord - (loop - for n in (event-writtennotes e) - and w in (event-writtennotes e) - and a in (event-accs e) - and a2 in (event-addaccs e) - for ha = (getmark e (list :harmonic :touched n)) - and hs = (getmark e (list :harmonic :sounding n)) - collect (cmnnote w a a2 - (cmndur (event-dur* e) m) - (getmark e (list :hideacc n)) - (getmark e (list :showacc n)) - (getmark e (list :cautacc n)) - (getmark e (list :harmonic :touched n)) - (getmark e (list :harmonic :sounding n))))) - (cmnnote (event-writtennote e) (event-acc e) (event-addacc e) - (cmndur (event-dur* e) m) - (getmark e (list :hideacc (event-writtennote e))) - (getmark e (list :showacc (event-writtennote e))) - (getmark e (list :cautacc (event-writtennote e))) - (getmark e (list :harmonic :touched (event-writtennote e))) - (getmark e (list :harmonic :sounding (event-writtennote e)))))))) - (if (> co o) (nconc y (list (list 'onset co))) y)) - and do (setf o (+ co (cmndur (event-dur e) m)))) - collect (let ((b (getprop m :barline))) - (if (>= o (+ stoff lmdur)) - (lookup (second b) +cmn-barlines+) - (list (lookup (second b) +cmn-barlines+) - (list 'onset (setf o (+ stoff lmdur))))))))))))))) + (let* ((bv -1) + (cmp (loop for p in parts nconc + (destructuring-bind (&key (cmn-partname (cmnname p)) &allow-other-keys) (part-opts p) + (loop with nvce = (loop for e in (part-meas p) maximize (length (meas-voices e))) + and bbb = (make-hash-table :test 'eq) + for vi from 0 below nvce nconc ; loop through voices + (loop with pna = (if (> nvce 1) (format nil "~A~D" cmn-partname (1+ vi)) cmn-partname) + and ns = (instr-staves (part-instr p)) ; number of staves + for si from 1 to ns + for ipna = (intern (if (> ns 1) + (if (> nvce 0) + (format nil "~A~D~D" pna (1+ vi) si) + (format nil "~A1~D" pna si)) + (if (> nvce 0) + (format nil "~A~D" pna (1+ vi)) + pna))) + do (setf (gethash p phash) (nconc (gethash p phash) (list ipna))) + collect + `(,ipna + (staff bar + ,@(when (and (<= si 1) (part-name p)) (list (list 'staff-name (part-name p)))) + ,@(when (> vi 0) + (list (list 'tied-to (intern (if (> ns 1) + (format nil "~A1~D" pna si) + (format nil "~A1" pna)))))) + ,(lookup (second (find si (getprops p :clef) :key #'third)) +cmn-clefs+) + ,@(loop with o = 0 and st = 1 + for m in (part-meas p) + and stoff = 0 then (+ stoff lmdur) + for lmdur = (cmndur (- (meas-endoff m) (meas-off m)) m) + when (getprop m :startsig) collect `(meter ,(timesig-num (meas-timesig m)) ,(timesig-den (meas-timesig m))) + nconc + (loop + with bb and ee ;;for (pre e nxe) on (cons nil (nth vi (meas-events m))) ;;while e + for e in (nth vi (meas-events m)) + for co = (+ stoff (cmndur (- (event-off e) (meas-off m)) m)) + and l = (and (notep e) (> (event-beamlt e) 0)) + and r = (and (notep e) (> (event-beamrt e) 0)) + and tu = (getmark e :starttup) + do (setf st (or (third (getmark e '(:staff :voice))) st)) + when (and r (not l)) do + (when ee (setf (car ee) '-beam ee nil)) + (event-off e) + (setf bb e) + when (= st si) collect + (let* ((cd (cmndur (event-dur* e) m)) + (y (if (restp e) ; y must be nconcable + (or (lookup cd +cmn-restdurs+) (list 'rest `(rq ,cd))) + (if (chordp e) + (cons 'chord + (nconc + (loop + for n in (event-writtennotes e) + and w in (event-writtennotes e) + and a in (event-accs e) + and a2 in (event-addaccs e) + for ha = (getmark e (list :harmonic :touched n)) + and hs = (getmark e (list :harmonic :sounding n)) + collect (cmnnote w a a2 nil + (getmark e (list :hideacc n)) + (getmark e (list :showacc n)) + (getmark e (list :cautacc n)) + (getmark e (list :harmonic :touched n)) + (getmark e (list :harmonic :sounding n)))) + (list (or (lookup cd +cmn-restdurs+) `(rq ,cd))))) + (cmnnote (event-writtennote e) (event-acc e) (event-addacc e) cd + (getmark e (list :hideacc (event-writtennote e))) + (getmark e (list :showacc (event-writtennote e))) + (getmark e (list :cautacc (event-writtennote e))) + (getmark e (list :harmonic :touched (event-writtennote e))) + (getmark e (list :harmonic :sounding (event-writtennote e)))))))) + (when (or l r) + (let ((h (gethash bb bbb))) + (nconc y (list (if h + (setf ee (list '-beam- `(svref bvect ,h))) + `(setf (svref bvect ,(setf (gethash bb bbb) (incf bv))) (beam-))))))) + (if (> co o) (nconc y (list `(onset ,co))) y)) + and do (setf o (+ co (cmndur (event-dur* e) m))) + finally (when ee (setf (car ee) '-beam))) + collect (let ((b (getprop m :barline))) + (if (>= o (+ stoff lmdur)) + (lookup (second b) +cmn-barlines+) + (list (lookup (second b) +cmn-barlines+) + `(onset ,(setf o (+ stoff lmdur))))))))))))))) (prin1 (internalize '(in-package cmn)) f) (fresh-line f) (prin1 (internalize - `(cmn ,@(remove-duplicates (append +cmn-options+ score-attr (list (list 'output-file (change-filename filename :ext (or out-ext +cmn-out-ext+))))) + `(cmn ,@(remove-duplicates (append +cmn-options+ score-attr +cmn-changeableopts+ + (list (list 'output-file (change-filename filename :ext (or out-ext +cmn-out-ext+))))) :key (lambda (x) (if (consp x) (first x) x)) :from-end t) - (let* ,cmp + (let* ,(if (> bv 0) (cons `(bvect (make-array ,(1+ bv))) cmp) cmp) ,@(labels ((pfn (pps &optional (grp 1)) (loop for e = (pop pps) ; e = part while e @@ -179,4 +229,5 @@ else nconc (gethash e phash)))) (pfn parts))))) f) - (fresh-line f))))))) + (fresh-line f)))))) + (when process (view-cmn filename options view))) --- /project/fomus/cvsroot/fomus/backend_ly.lisp 2006/01/26 05:48:21 1.23 +++ /project/fomus/cvsroot/fomus/backend_ly.lisp 2006/01/28 20:31:19 1.24 @@ -13,31 +13,12 @@
#+sbcl (eval-when (:compile-toplevel :load-toplevel :execute) (require :sb-posix))
-#+allegro -(defun run-allegro-cmd (cmd &optional (wait t)) - (multiple-value-bind (ostr istr p) (excl:run-shell-command cmd :input :stream :output :stream :error-output :stream :wait nil) - (declare (ignore istr)) - (values (if wait (sys:os-wait nil p) 0) ostr))) - -#+(or linux darwin unix) -(defun find-exe (filename) - (namestring* - (or #+darwin (probe-file (change-filename filename :dir "/Applications")) - #+darwin (probe-file (change-filename filename :dir "/Applications/Lilypond.app")) - #+darwin (probe-file (change-filename filename :dir "/sw/bin")) - (probe-file (change-filename filename :dir "/usr/local/bin")) - (probe-file (change-filename filename :dir "/usr/bin")) - (probe-file (change-filename filename :dir "/bin"))))) - (eval-when (:load-toplevel :execute) (defparameter +lilypond-exe+ (or #+darwin (find-exe "lilypond.sh") (find-exe "lilypond") #-darwin "lilypond" #+darwin "lilypond.sh")) - (defparameter +lilypond-view-exe+ - #+darwin (find-exe "open") - #+(and (or linux unix) (not darwin)) (or (find-exe "ggv") (find-exe "kgv") (find-exe "gv") (find-exe "ghostview") "gv") - #-(or linux darwin unix) "gv")) + (defparameter +lilypond-view-exe+ +ghostview-exe+))
(defparameter +lilypond-opts+ '("--ps")) (defparameter +lilypond-out-ext+ "ps") --- /project/fomus/cvsroot/fomus/backend_xml.lisp 2005/10/01 00:49:45 1.4 +++ /project/fomus/cvsroot/fomus/backend_xml.lisp 2006/01/28 20:31:19 1.5 @@ -124,11 +124,12 @@ ("sign" nil ,s) ,@(when l `(("line" nil ,l))) ,@(when o `(("clef-octave-change" nil ,o))))))))) - ,.(loop with nv = (length (meas-voices m)) + ,.(loop with nv = (length (meas-voices m)) and ts = (meas-timesig m) for v in (meas-voices m) - for b = (getprop m :barline) + for b = (getprop m :barline) and fi = nil then t + when fi collect `("backup" nil ("duration" nil ,(* (- (meas-endoff m) (meas-off m)) (timesig-beat* ts) dv))) nconc (loop - with tv and ts = (meas-timesig m) + with tv for e in v nconc (loop with ch = (chordp e) for fi = t then nil @@ -155,15 +156,16 @@ ("display-step" nil ,(svref +xml-num-perc-note+ (mod no 12))) ("display-octave" nil ,(floor (1- no) 12))))) ,@(when (restp e) '(("rest" nil))) +;; ,@(when tl '(("tie" ("type" "stop")))) +;; ,@(when tr '(("tie" ("type" "start")))) ,@(unless (event-grace e) `(("duration" nil ,(* (event-writtendur e ts) dv)))) ,@(when (> nv 1) `(("voice" nil ,(event-voice* e)))) - ,@(when tr '(("tie" ("type" "end")))) - ,@(when tl '(("tie" ("type" "start")))) ("type" nil ,(lookup (event-writtendur* e ts) +xml-num-durtype+)) ,.(loop repeat (nth-value 1 (event-writtendur* e ts)) collect '("dot" nil)) - ,@(let ((ca (getmark e (list :cautacc o)))) - (when (and (notep e) (not pc) - (or (/= ac 0) (/= aac 0) ca)) + ,@(let ((ca (getmark e (list :cautacc no)))) + (when (and (notep e) (not pc) (not tl) + (not (getmark e (list :hideacc no))) + (or (getmark e (list :showacc no)) (/= ac 0) (/= aac 0) ca)) `(("accidental" ,(when ca '("cautionary" "yes")) ,(svref (svref +xml-num-acctype+ (+ ac 2)) (1+ (* aac 2))))))) ,@(when (event-tup e) @@ -187,7 +189,10 @@ (loop for i from 1 to bc collect `("beam" ("number" ,i) "continue")) (loop for i from (1+ bc) to (event-beamlt e) collect `("beam" ("number" ,i) "end")) (loop for i from (1+ bc) to (event-beamrt e) collect `("beam" ("number" ,i) "begin"))))) - ;; notations + ,@(let ((ntr (when tr '(("tied" ("type" "start"))))) + (ntl (when tl '(("tied" ("type" "stop")))))) + (when (or ntr ntl) + `(("notations" nil ,@ntl ,@ntr)))) ) do (let ((ns (mapcar #'rest (getmarks e '(:endtup))))) (setf tv (delete-if (lambda (x) (find (first x) ns)) tv))))) --- /project/fomus/cvsroot/fomus/data.lisp 2006/01/19 00:02:35 1.28 +++ /project/fomus/cvsroot/fomus/data.lisp 2006/01/28 20:31:19 1.29 @@ -794,11 +794,11 @@ '((:startslur- :slur- :endslur- nil) (:startgraceslur- :graceslur- :endgraceslur- nil) (:starttext- :text- :endtext- :text) - (:startwedge< :wedge< :endwedge< t) - (:startwedge> :wedge> :endwedge> t) - (:startwedge*< :wedge*< :endwedge*< t) - (:startwedge*> :wedge*> :endwedge*> t) - (:startlongtrill- :longtrill- :endlongtrill- t))) + (:startwedge< :wedge< :endwedge< nil) + (:startwedge> :wedge> :endwedge> nil) + (:startwedge*< :wedge*< :endwedge*< nil) + (:startwedge*> :wedge*> :endwedge*> nil) + (:startlongtrill- :longtrill- :endlongtrill- nil))) (defparameter +marks-spanner-staves+ '((:start8up- :8up- :end8up- :8up) (:start8down- :8down- :end8down- :8down))) --- /project/fomus/cvsroot/fomus/marks.lisp 2006/01/26 05:48:21 1.14 +++ /project/fomus/cvsroot/fomus/marks.lisp 2006/01/28 20:31:19 1.15 @@ -53,17 +53,19 @@ (loop for (startsym contsym endsym) of-type (symbol symbol symbol) in spanners do (loop for p of-type partex in pts do (loop - with ss = (make-hash-table :test 'eql) and nu of-type (integer 0) = 0 and sta + with ss = (make-hash-table :test 'eql) and nu of-type (integer 0) = 0 and sta and mor of-type list for (e nxe) of-type ((or noteex restex) (or noteex restex null)) on (reverse (part-events p)) do ; go backwards, find endsyms + (setf mor nil) (loop for (xxx a1) of-type (t (or (integer 1) null)) in (sort (nconc (when contsym (loop for x = (popmark e contsym) while x collect (force-list x))) ; a1 is level (loop for x = (popmark e endsym) while x collect (force-list x))) #'< :key (lambda (x) (or (second x) 1))) do (let ((lv (or a1 1))) - (unless (gethash lv ss) - (setf (gethash lv ss) (incf nu)) - (addmark e (list endsym nu))))) + (if (gethash lv ss) + (push lv mor) + (progn (setf (gethash lv ss) (incf nu)) + (addmark e (list endsym nu)))))) (loop ; find startsyms for rr0 of-type cons in (sort (loop for x = (popmark e startsym) @@ -85,11 +87,17 @@ (addmark e (nconc (list startsym n) (when a3 (list a3)) (when a2 (list a2)))) ; fixed order now--level is mandatory 1st argument, string is second if text, modifier is last and optional (decf nu)) (error "Levels for marks ~S, ~S and ~S are out of order at offset ~S, part ~S" startsym contsym endsym (event-foff e) (part-name p))) - (progn + (progn (loop for (a b) of-type ((or noteex restex) (or noteex restex null)) on sta if b do (addmark a (list contsym 1)) else do (addmark a (list endsym 1)) (addmark e (nconc (list startsym 1) (when a3 (list a3)) (when a2 (list a2)))))))))) - (loop for l being each hash-value in ss do (addmark e (list (if nxe contsym startsym) l))) + (loop for lv of-type (integer 1) in mor do + (unless (gethash lv ss) + (setf (gethash lv ss) (incf nu)) + (addmark e (list endsym nu)))) + (loop for l of-type (integer 1) being each hash-value in ss + if nxe do (unless (getmark e (list endsym l)) (addmark e (list contsym l))) + else do (addmark e (list startsym l))) (push e sta)) (print-dot))))
--- /project/fomus/cvsroot/fomus/misc.lisp 2006/01/19 00:02:35 1.13 +++ /project/fomus/cvsroot/fomus/misc.lisp 2006/01/28 20:31:19 1.14 @@ -67,6 +67,25 @@ (defmacro cons-list (objs places) `(mapcar #'cons ,objs ,places))
+(declaim (inline namestring*)) +(defun namestring* (filename) (when filename (namestring filename))) + +#+allegro +(defun run-allegro-cmd (cmd &optional (wait t)) + (multiple-value-bind (ostr istr p) (excl:run-shell-command cmd :input :stream :output :stream :error-output :stream :wait nil) + (declare (ignore istr)) + (values (if wait (sys:os-wait nil p) 0) ostr))) + +#+(or linux darwin unix) +(defun find-exe (filename) + (namestring* + (or #+darwin (probe-file (change-filename filename :dir "/Applications")) + #+darwin (probe-file (change-filename filename :dir "/Applications/Lilypond.app")) + #+darwin (probe-file (change-filename filename :dir "/sw/bin")) + (probe-file (change-filename filename :dir "/usr/local/bin")) + (probe-file (change-filename filename :dir "/usr/bin")) + (probe-file (change-filename filename :dir "/bin"))))) + (defstruct (heap (:constructor make-heap-aux) (:predicate heapp)) (fun #'+ :type (function (t t) t)) (arr #() :type (array t))) --- /project/fomus/cvsroot/fomus/postproc.lisp 2006/01/26 05:48:21 1.18 +++ /project/fomus/cvsroot/fomus/postproc.lisp 2006/01/28 20:31:19 1.19 @@ -255,19 +255,23 @@ ;; leave middle marks (defun postproc-spanners (pts) (declare (type list pts)) - (loop + (loop for (startsym xxx endsym replsym) of-type (symbol symbol symbol symbol) in (append +marks-spanner-voices+ +marks-spanner-staves+) ;; fix any notes with starts/ends on same note - unless (truep replsym) do (loop for p of-type partex in pts - do (loop for e of-type (or noteex restex) in (loop for x of-type meas in (part-meas p) append (meas-events x)) do - (loop - for ma of-type cons in (mapcar #'force-list (getmarks e startsym)) - for lv = (second ma) - when (getmark e (if lv (list endsym lv) endsym)) - do - (rmmark e (if lv (list startsym lv) startsym)) - (rmmark e (if lv (list endsym lv) endsym)) - when replsym do (addmark e (nconc (list replsym lv) (cddr ma))))) + do (loop for v from 0 below (loop for x of-type meas in (part-meas p) maximize (length (meas-voices x))) do + (loop with h = (make-hash-table) + for e of-type (or noteex restex) in (loop for x of-type meas in (part-meas p) append (nth v (meas-voices x))) do + (loop + for ma of-type cons in (mapcar #'force-list (getmarks e endsym)) + for lv = (second ma) do + (unless (gethash lv h) + (rmmark e (if lv (list startsym lv) startsym)) + (rmmark e (if lv (list endsym lv) endsym)) + (when replsym (addmark e (nconc (list replsym lv) (cddr ma))))) + (remhash lv h)) + (loop + for ma of-type cons in (mapcar #'force-list (getmarks e startsym)) + do (setf (gethash (second ma) h) t)))) (print-dot))))
(defun postproc-barlines (pts) @@ -476,10 +480,10 @@ (defun postproc (pts) (postproc-tremolos pts) (postproc-timesigs pts) - (postproc-spanners pts) (postproc-markaccs pts) (postproc-midimarks pts) (postproc-voices pts) ;; voices now separated into lists + (postproc-spanners pts) (postproc-clefs pts) (postproc-staves pts) (postproc-measrests pts) --- /project/fomus/cvsroot/fomus/test.lisp 2006/01/26 05:48:21 1.21 +++ /project/fomus/cvsroot/fomus/test.lisp 2006/01/28 20:31:19 1.22 @@ -5,7 +5,7 @@ ;; Example 1
(fomus - :backend '((:data) (:lilypond :view t) (:midi :tempo 120 :delay 1 :play nil)) + :backend '((:data) (:lilypond :view t) (:cmn :view t) (:midi :tempo 120 :delay 1 :play nil)) :ensemble-type :orchestra :parts (list --- /project/fomus/cvsroot/fomus/util.lisp 2005/10/22 20:43:06 1.19 +++ /project/fomus/cvsroot/fomus/util.lisp 2006/01/28 20:31:19 1.20 @@ -30,6 +30,15 @@ (or (= (loop for i in '() maximize i) 0) (error "Failed LOOP test in "util.lisp"")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; FIND GHOSTVIEW + +(eval-when (:load-toplevel :execute) + (defparameter +ghostview-exe+ + #+darwin (find-exe "open") + #+(and (or linux unix) (not darwin)) (or (find-exe "ggv") (find-exe "kgv") (find-exe "gv") (find-exe "ghostview") "gv") + #-(or linux darwin unix) "gv")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PROGRESS DOTS, IMMEDIATE OUTPUT
(declaim (type (integer 0) +progress-int+)) @@ -102,9 +111,6 @@ finally (return (if (< o o2) (nconc r (list (cons o o2))) r))))
-(declaim (inline namestring*)) -(defun namestring* (filename) (when filename (namestring filename))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PROPERTIES/MARKS
--- /project/fomus/cvsroot/fomus/version.lisp 2006/01/26 05:48:21 1.25 +++ /project/fomus/cvsroot/fomus/version.lisp 2006/01/28 20:31:19 1.26 @@ -12,7 +12,7 @@ (declaim (type string +title+) (type cons +version+ +banner+)) (defparameter +title+ "FOMUS") -(defparameter +version+ '(0 1 30)) +(defparameter +version+ '(0 1 31)) (defparameter +banner+ `("Lisp music notation formatter" "Copyright (c) 2005, 2006 David Psenicka, All Rights Reserved"