Update of /project/fomus/cvsroot/fomus
In directory common-lisp.net:/tmp/cvs-serv19199
Modified Files:
CHANGELOG TODO backend_ly.lisp data.lisp postproc.lisp
splitrules.lisp test.lisp util.lisp version.lisp
Log Message:
testing/bug fixes
Date: Wed Aug 31 16:07:11 2005
Author: dpsenicka
Index: fomus/CHANGELOG
diff -u fomus/CHANGELOG:1.9 fomus/CHANGELOG:1.10
--- fomus/CHANGELOG:1.9 Tue Aug 30 00:28:03 2005
+++ fomus/CHANGELOG Wed Aug 31 16:07:10 2005
@@ -1,11 +1,17 @@
+v0.1.12
+
+ Testing/bug fixes:
+ nested tuplets
+
v0.1.11
Testing/bug fixes:
errors involving 0 durations
parsing user input
user rests and rest marks
- switching functionality on/off w/ auto- settings
- Support for user rests, pizz/arco markings
+ switching functionality on/off w/ AUTO- settings
+ user rests, pizz/arco markings
+ part ordering (parts with grand staves)
v0.1.10
@@ -17,16 +23,16 @@
v0.1.9
Testing/bug fixes
+ compiling/viewing LilyPond files
Added QUALITY setting
Eliminated complex score/penalty settings (will replace with simple presets)
Other changes to settings
- Adjustments to note splitting/tying
- Fixed issues with compiling/viewing LilyPond files
+ Adjustments to note splitting/tying
More speed improvements
v0.1.8 and earlier:
Testing/bug fixes
+ tremolos, text, glissandi/portamenti, arpeggios, harmonics, note heads
Some speed improvements (more needed)
- Support for tremolos, text, glissandi/portamenti, arpeggios, harmonics, note heads
Improved quantize algorithm
Index: fomus/TODO
diff -u fomus/TODO:1.16 fomus/TODO:1.17
--- fomus/TODO:1.16 Tue Aug 30 00:28:03 2005
+++ fomus/TODO Wed Aug 31 16:07:10 2005
@@ -12,9 +12,11 @@
Avoid staff changes when notes move in other direction
Durations that fill to next/previous note
Proofread/finish documentation, add easy examples
+ Tuplet bracket setting
Short Term:
+ Part properties: override settings for individual parts
CMN backend
MIDI to percussion
Number of lines in staff
Index: fomus/backend_ly.lisp
diff -u fomus/backend_ly.lisp:1.14 fomus/backend_ly.lisp:1.15
--- fomus/backend_ly.lisp:1.14 Sun Aug 28 23:31:27 2005
+++ fomus/backend_ly.lisp Wed Aug 31 16:07:10 2005
@@ -169,12 +169,7 @@
do (destructuring-bind (&key (lily-partname (lyname p))
lily-parthead ;; extra header information for part (list of strings)
&allow-other-keys) (part-opts p)
- (let ((ns (instr-staves (part-instr p)))
- #|(sa 1)|#)
-;; (flet ((lystaff (s)
-;; (if (/= s sa)
-;; (format nil "\\change Staff = ~A " (code-char (+ 64 (setf sa s))))
-;; "")))
+ (let ((ns (instr-staves (part-instr p))))
(push lily-partname nms)
(format f "~A = {~%" lily-partname)
(when (part-name p) (format f " \\set Staff.instrument = ~S~%" (part-name p)))
Index: fomus/data.lisp
diff -u fomus/data.lisp:1.17 fomus/data.lisp:1.18
--- fomus/data.lisp:1.17 Tue Aug 30 00:28:03 2005
+++ fomus/data.lisp Wed Aug 31 16:07:10 2005
@@ -212,8 +212,8 @@
"Found ~S, expected (INTEGERS 1) or SYMBOLS in the form I, (I (S S I) ...) in CLEFLEGLS slot" t))
(instr-8uplegls (check* (or* null (integer 1) (list* (integer 1) (integer 1))) "Found ~S, expected NIL, (INTEGER 1) or ((INTEGER 1) (INTEGER 1)) in 8UPLEGLS slot" t))
(instr-8dnlegls (check* (or* null (integer 1) (list* (integer 1) (integer 1))) "Found ~S, expected NIL, (INTEGER 1) or ((INTEGER 1) (INTEGER 1)) in 8DNLEGLS slot" t))
- (instr-percs (check* (or null (list-of* (type* *perc-type*))) "Found ~S, expected list of PERC objects in PERCS slot" t))
- (instr-midiprgch-im (check* (or null (integer 0 127) (list-of* (integer 0 127)))
+ (instr-percs (check* (or* null (list-of* (type* *perc-type*))) "Found ~S, expected list of PERC objects in PERCS slot" t))
+ (instr-midiprgch-im (check* (or* null (integer 0 127) (list-of* (integer 0 127)))
"Found ~S, expected NIL, (integer 0 127) or list of (integer 0 127) in MIDIPRGCH-IM slot" t))
(instr-midiprgch-ex (check* (or null (integer 0 127))
"Found ~S, expected NIL, (integer 0 127) in MIDIPRGCH-EX slot" t)))))
Index: fomus/postproc.lisp
diff -u fomus/postproc.lisp:1.9 fomus/postproc.lisp:1.10
--- fomus/postproc.lisp:1.9 Tue Aug 30 00:28:03 2005
+++ fomus/postproc.lisp Wed Aug 31 16:07:10 2005
@@ -50,7 +50,7 @@
;; returns ratio to display: (cons num1 num2)
(defun tupratio (rat writunit events ts)
(declare (type (rational (0)) rat writunit) (type cons events) (type timesig-repl ts))
- (let ((m (loop with x of-type (rational 1) = (max (/ writunit (loop for e of-type (or noteex restex) in events maximize (event-writtendur e ts))) 1)
+ (let ((m (loop with x of-type rational = (/ writunit (loop for e of-type (or noteex restex) in events maximize (event-writtendur e ts)))
for i = 1 then (* i 2) when (>= i x) do (return i))))
(cons (* (numerator rat) m) (* (denominator rat) m))))
@@ -67,17 +67,17 @@
(loop
with l = (length *max-tuplet*)
with lvl = -1
- and tp = (make-array l :element-type '(integer 0) :initial-element 0)
+ and tp = (make-array l :element-type '(rational 0 1) :initial-element 0)
and uu = (make-array l :element-type '(or (rational (0)) null) :initial-element nil)
and ll = (make-array l :element-type 'list :initial-element nil)
for e of-type (or noteex restex) in ee
- do (loop
+ do (loop
with td = (reverse (event-tupdurmult e))
and i = -1
- for f of-type (rational (0)) in (nreverse (event-tupfrac e))
- and u of-type (rational (0)) in td
+ for f of-type (rational (0)) in (reverse (event-tupfrac e)) ; larger to smaller
+ and u of-type (rational (0)) in td ; durmults
do (incf i)
- when (> i lvl) do (setf (svref uu i) u (svref ll i) nil) ; start
+ when (> i lvl) do (setf (svref uu i) u (svref ll i) nil) ; start new count
when (>= i lvl) do (incf (svref tp i) f)
do (push e (svref ll i))
finally
@@ -86,17 +86,17 @@
while (and (>= j 0) (>= (svref tp j) 1))
do
(setf (svref tp j) 0)
- (let* ((el (nreverse (svref ll j))) ; events in order
+ (let* ((el (reverse (svref ll j))) ; events in order
(ef (first el)))
(declare (type (or noteex restex) ef))
(addmark ef
- (let ((w (unitwritdur (- (event-endoff e) (event-off ef)) (event-tupdurmult e) (meas-timesig m))))
+ (let* ((w (unitwritdur (- (event-endoff e) (event-off ef)) (nthcdr (- i j) (event-tupdurmult e)) #|(- i j)|# (meas-timesig m))))
(multiple-value-bind (wr wd) (writtendur* w)
- (list :starttup (1+ i)
- (tupratio (svref uu j) w el (meas-timesig m))
- (or #|(list1p el)|# ; bracket?
- (< j i) ; not innermost
- (loop
+ (list :starttup (1+ j)
+ (tupratio (svref uu j) w el (meas-timesig m)) ; tupratio as cons
+ (or ; bracket?
+ (< j i) ; not innermost--use bracket (make this a setting later)
+ (loop ; innermost
for (x1 x2 x3) of-type ((or (or noteex restex) null) (or (or noteex restex) null) (or (or noteex restex) null))
on (cons nil el) while x2
when (or (if x1
@@ -106,12 +106,12 @@
(or (restp x2) (= (event-beamrt x2) 0))
(and (notep x2) (> (event-beamrt x2) 0))))
do (return t)))
- (cons wr wd))))) ; i is tup index, next value is bracket t/nil, next two are written tuplet unit value
+ (cons wr wd))))) ; i is tup index, next value is bracket t/nil, next cons is written value of tuplet-unit-dur
(addmark e (list :endtup (1+ j)))) ; end
finally
(setf lvl j))))
(loop for e of-type (or noteex restex) in gg do (setf (event-tup e) nil))
- (loop for e of-type (or noteex restex) in ee do (setf (event-tup e) (nreverse (event-tupdurmult e))))) (print-dot))))
+ (loop for e of-type (or noteex restex) in ee do (setf (event-tup e) (reverse (event-tupdurmult e))))) (print-dot))))
(defun postproc-graces (pts)
(declare (type list pts))
Index: fomus/splitrules.lisp
diff -u fomus/splitrules.lisp:1.3 fomus/splitrules.lisp:1.4
--- fomus/splitrules.lisp:1.3 Tue Aug 30 00:28:03 2005
+++ fomus/splitrules.lisp Wed Aug 31 16:07:10 2005
@@ -91,8 +91,7 @@
(declare (type baserule rule) (type (member nil t :s) tups))
(let ((mt (first (if (baseunitp rule)
(loop for e on *max-tuplet* for xxx in (rule-tup rule) finally (return e))
- *max-tuplet*))) ; max tuplet for next nesting level
- #|(mn (length mt))|#) ; max nesting depth
+ *max-tuplet*)))) ; max tuplet for next nesting level
(flet ((dv2 (n)
(declare (type (integer 1) n))
(loop for n2 = (/ n 2) while (integerp n2) do (setf n n2))
@@ -109,7 +108,7 @@
(cons (if (list>1p x) x (first x))
(loop for (e1 e2) of-type ((rational 0 1) (or (rational 0 1) null)) on (cons 0 (append x '(1))) while e2
for ii in (if (listp i) i (list i (- tup i))) and tt = (- e2 e1) and a1 = t then a2
- for a2 = (and (expof2 e2) (expof2 (- tup e2))) collect
+ for a2 = (or (= e2 1) (and (expof2 e2) (expof2 (- tup e2)))) collect
(if (and (<= ii 1) (if (unitp rule) (rule-sim rule) t))
(make-unit-nodiv :tup (cons tt tu) :comp (rule-comp rule) :dmu dmu :tlt t :trt t)
(make-unit :div (dv2 ii) :tup (cons tt tu) :dmu dmu :alt a1 :art a2 :irr ir :comp (rule-comp rule) :sim (when (eq tups :s) ii))))))))))
@@ -196,7 +195,7 @@
(list (nconc (list (loop for i from 1/2 below num collect (/ i num)) ; regular off beat syncopation
(snd (/ 1/2 num) t nil))
(make-list (- num 1/2) :initial-element (snd (/ num) nil nil))))))))
- (when (and tups mt (or (initdivp rule) (rule-alt rule)) (or (initdivp rule) (rule-art rule)))
+ (when (and tups mt (or (initdivp rule) (and (sigp rule) (rule-top rule)) (and (rule-alt rule) (rule-art rule))))
(loop
with nu = (if (rule-comp rule) (* num 3/2) num)
for j of-type (integer 2) in (primes2 mt) ; only primes--number isn't actual tuplet, just division
@@ -235,10 +234,10 @@
(list (list 1/8 (un 1/8 :l t t) (und 7/8 nil t))))))
(when (and (al *shortlongshort-notes-level*) (rule-alt rule) (rule-art rule) ex)
(list (list '(1/4 3/4) (un 1/4 :l t t) (und 1/2 t t) (un 1/4 :r t t)))) ; longer note in middle
- (when #|(debugn-if (>= (length (rule-tup rule)) 1) "~A ~A ~A ~A"
- tups mt (or (initdivp rule) (rule-alt rule)) (or (initdivp rule) (rule-art rule))
- (and tups mt (or (initdivp rule) (rule-alt rule)) (or (initdivp rule) (rule-art rule))))|#
- (and tups mt (or (initdivp rule) (rule-alt rule)) (or (initdivp rule) (rule-art rule)))
+ (when (and tups mt (or (initdivp rule) (and (sigp rule) (rule-top rule))
+ (if (and (baseunitp rule) (rule-tup rule))
+ (or (rule-alt rule) (rule-art rule))
+ (and (rule-alt rule) (rule-art rule)))))
(loop
for j of-type (integer 2) in (primes2 mt) ; only primes--number isn't actual tuplet, just division
unless (expof2 (/ (rule-div rule) j))
Index: fomus/test.lisp
diff -u fomus/test.lisp:1.8 fomus/test.lisp:1.9
--- fomus/test.lisp:1.8 Tue Aug 30 00:28:03 2005
+++ fomus/test.lisp Wed Aug 31 16:07:10 2005
@@ -75,10 +75,10 @@
(0 '(:accent))
(1 '(:staccato))))))
-;; Nested Tuplets (not working yet)
+;; Nested Tuplets
(fomus
- :backend '((:data) (:lilypond :view t))
+ :backend '(:data (:lilypond :view t))
:ensemble-type :orchestra
:verbose 2
:beat-division 8
@@ -102,8 +102,6 @@
(0 '(:accent))
(1 '(:staccato))))))
-;; TESTS
-
;; Parts with no events
(fomus
@@ -128,6 +126,8 @@
:instr :tuba
:events nil)))
+;; Part ordering/grouping
+
(fomus
:backend '((:data) (:lilypond :view t))
:ensemble-type :orchestra
@@ -788,22 +788,25 @@
(0 :woodblock)
(1 :snaredrum)))))))
-(fomus ; :auto-multivoice-notes (not working yet)
- :backend '((:data) (:lilypond :view t))
- :ensemble-type :orchestra
- :parts
- (list
- (make-part
- :name "Violin"
- :instr :violin
- :events
- (loop repeat 2 nconc
- (loop
- for off from 0 to 40 by 1/2
- collect (make-note :off off
- :voice '(1 2)
- :dur (if (< off 40) 1/2 1)
- :note (+ 55 (random 19))))))))
+(let ((*break-on-signals* t))
+ (fomus ; :auto-multivoice-notes (not working yet)
+ :backend '(:lilypond :view t)
+ :ensemble-type :orchestra
+ :parts
+ (list
+ (make-part
+ :name "Violin"
+ :instr :violin
+ :events
+ (loop repeat 2 nconc
+ (loop
+ for off from 0 to 40 by 1/2
+ collect (make-note :off off
+ :voice '(1 2)
+ :dur (if (< off 40) 1/2 1)
+ :note (+ 55 (random 19)))))))))
+
+(WARN KERNEL:SIMPLE-STYLE-WARNING :FORMAT-CONTROL "Variable ~S defined but never used." :FORMAT-ARGUMENTS ...)
(fomus ; :auto-percussion-durs
:backend '((:data) (:lilypond :view t))
Index: fomus/util.lisp
diff -u fomus/util.lisp:1.13 fomus/util.lisp:1.14
--- fomus/util.lisp:1.13 Tue Aug 30 00:28:04 2005
+++ fomus/util.lisp Wed Aug 31 16:07:10 2005
@@ -269,10 +269,14 @@
(if (notep ev) (max (- (roundint (log (event-writtendur* ev ts) 1/2)) 2) 0) 0))
;; given duration of entire tuplet & dmu list, return unit of tuplet (1/8 = eighth note, etc.)
-(defun unitwritdur (dur dmu ts)
+(defun unitwritdur (dur dmu ts) ; ndmu = the level that applies
(declare (type (rational (0)) dur) (type list dmu) (type timesig-repl ts))
- (/ (* (effectdur dur dmu) (timesig-beat* ts))
+ (/ (* (effectdur dur dmu) (timesig-beat* ts)) ; written dur w/o dots info of entire tuplet
(numerator (first dmu))))
+;; (loop with re = (* (effectdur dur dmu) (timesig-beat* ts)) ; written dur w/o dots info of entire tuplet
+;; repeat (1+ ndmu) for x in dmu
+;; do (setf re (/ re (numerator x)))
+;; finally (return re)))
(declaim (inline chordp))
(defun chordp (ev)
Index: fomus/version.lisp
diff -u fomus/version.lisp:1.6 fomus/version.lisp:1.7
--- fomus/version.lisp:1.6 Tue Aug 30 00:28:04 2005
+++ fomus/version.lisp Wed Aug 31 16:07:10 2005
@@ -12,7 +12,7 @@
(declaim (type string +title+)
(type cons +version+ +banner+))
(defparameter +title+ "FOMUS")
-(defparameter +version+ '(0 1 11))
+(defparameter +version+ '(0 1 12))
(defparameter +banner+
`("Lisp music notation formatter"
"Copyright (c) 2005 David Psenicka, All Rights Reserved"