[CM] cmn, fixed length
Bill Schottstaedt
bil at ccrma.Stanford.EDU
Mon May 30 08:50:18 PDT 2011
> Is there a way to forbid justification (varying the free-expansion-factor,
> to adapt the length) ?
I think you can use spacing-hook, as in pmn.lisp. Here's an example:
(in-package :cmn)
(defvar *pmn-line-thickness* 0.1)
(defvar *pmn-stem-choice* :none)
(defun xmn (&rest args)
(apply #'cmn
(automatic-ties nil)
(automatic-rests nil)
(spacing-hook
#'(lambda (score)
(let ((beat-scl 0.0))
(let ((cur-fx 0.0))
(loop for td in (time-line score) do
(incf cur-fx (tld-fx0 td))
(setf (tld-acc-x td) (+ (tld-cx td) cur-fx))
(incf cur-fx (tld-fx1 td))))
(let* ((td0 (first (time-line score)))
(t0 (tld-time td0))
(x0 (tld-acc-x td0))
(cur-min-t 100.0)
(cur-max-x 0.0))
(loop for td1 in (cdr (time-line score)) do
(when (> (tld-time td1) t0)
(let ((dt (- (tld-time td1) t0))
(dx (- (tld-acc-x td1) x0)))
(when (<= dt cur-min-t)
(setf cur-min-t dt)
(when (> dx cur-max-x)
(setf cur-max-x dx)))
(setf td0 td1)
(setf t0 (tld-time td0))
(setf x0 (tld-acc-x td0)))))
(setf beat-scl (* (/ cur-max-x cur-min-t))))
(loop for td in (time-line score) do
(let ((dx0 (- (tld-cx td) (tld-x td))))
(setf (tld-cx td) (* beat-scl (tld-time td)))
(setf (tld-x td) (- (tld-cx td) dx0)))))))
args))
;;; (xmn staff treble c4 q e4 h bf4 q bar)
;;; (xmn staff treble (chord (notes c4 e4 g4) q) e4 h bf4 q bar)
;;; (xmn (size 16) (free-expansion-factor 1.5) (staff treble c4 q c4 e c4 q c4 s c4 s c4 q bar) (staff
bass c4 e c4 e c4 q c4 q c4 e bar))
;;; (xmn staff treble (c4 h (onset 0)) (e4 h (onset .5)) (chord h (notes c4 g4) (onset 4.0)))
More information about the Cmdist
mailing list