* First stage: Turn all (cdr (assoc calls into (assoc-get calls.
;; (newline)
(let* ((name-sym (car x))
(grob-entry (cdr x))
- (meta-entry (cdr (assoc 'meta grob-entry)))
- (class (cdr (assoc 'class meta-entry)))
+ (meta-entry (assoc-get 'meta grob-entry))
+ (class (assoc-get 'class meta-entry))
(ifaces-entry
- (cdr (assoc 'interfaces meta-entry))))
+ (assoc-get 'interfaces meta-entry)))
(cond
((eq? 'Item class)
(lambda (x)
(let* ((metah (assoc 'meta (cdr x)))
(meta (cdr metah))
- (ifaces (cdr (assoc 'interfaces meta))))
+ (ifaces (assoc-get 'interfaces meta)))
(map (lambda (iface)
(hashq-set!
(let* ((metah (assoc 'meta description))
(meta (cdr metah))
- (name (cdr (assoc 'name meta)))
+ (name (assoc-get 'name meta))
;; (bla (display name))
- (ifaces (map lookup-interface (cdr (assoc 'interfaces meta))))
+ (ifaces (map lookup-interface (assoc-get 'interfaces meta)))
(ifacedoc (map ref-ify
(sort
(map (lambda (iface)
(engraver-accepts-music-types? (cdr types) grav))))
(define (engraver-doc-string engraver in-which-contexts)
- (let* ((propsr (cdr (assoc 'properties-read (ly:translator-description engraver))))
- (propsw (cdr (assoc 'properties-written (ly:translator-description engraver))))
- (accepted (cdr (assoc 'events-accepted (ly:translator-description engraver))))
+ (let* ((propsr (assoc-get 'properties-read (ly:translator-description engraver)))
+ (propsw (assoc-get 'properties-written (ly:translator-description engraver)))
+ (accepted (assoc-get 'events-accepted (ly:translator-description engraver)))
(name-sym (ly:translator-name engraver))
(name-str (symbol->string name-sym))
- (desc (cdr (assoc 'description (ly:translator-description engraver))))
+ (desc (assoc-get 'description (ly:translator-description engraver)))
(grobs (engraver-grobs engraver)))
(string-append
(apply append
(map
(lambda (x)
- (let* ((context (cdr (assoc 'context-name x)))
+ (let* ((context (assoc-get 'context-name x))
(group (assq-ref x 'group-type))
(consists (append
(if group
(list group)
'())
- (cdr (assoc 'consists x)))))
+ (assoc-get 'consists x))))
(if (member name-sym consists)
(list context)
'())))
(define (context-doc context-desc)
- (let* ((name-sym (cdr (assoc 'context-name context-desc)))
+ (let* ((name-sym (assoc-get 'context-name context-desc))
(name (symbol->string name-sym))
- (aliases (map symbol->string (cdr (assoc 'aliases context-desc))))
+ (aliases (map symbol->string (assoc-get 'aliases context-desc)))
(desc-handle (assoc 'description context-desc))
(desc (if (and (pair? desc-handle) (string? (cdr desc-handle)))
(cdr desc-handle) "(not documented)"))
- (accepts (cdr (assoc 'accepts context-desc)))
- (consists (cdr (assoc 'consists context-desc)))
- (props (cdr (assoc 'property-ops context-desc)))
+ (accepts (assoc-get 'accepts context-desc))
+ (consists (assoc-get 'consists context-desc))
+ (props (assoc-get 'property-ops context-desc))
(grobs (context-grobs context-desc))
(grob-refs (map ref-ify (sort grobs ly:string-ci<?))))
grav)))
(if (eq? eg #f)
'()
- (map symbol->string (cdr (assoc 'grobs-created (ly:translator-description eg)))))))
+ (map symbol->string (assoc-get 'grobs-created (ly:translator-description eg))))))
(define (context-grobs context-desc)
(let* ((group (assq-ref context-desc 'group-type))
(if group
(list group)
'())
- (cdr (assoc 'consists context-desc))))
+ (assoc-get 'consists context-desc)))
(grobs (apply append
(map engraver-grobs consists))))
grobs))
;;;; documentation-lib.scm -- Assorted Functions for generated documentation
;;;;
;;;; source file of the GNU LilyPond music typesetter
-;;;;
+;;;;
;;;; (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
;;;; Jan Nieuwenhuizen <janneke@gnu.org>
(define (texi-section-command level)
- (cdr (assoc level '(
- ;; Hmm, texinfo doesn't have ``part''
- (0 . "@top")
- (1 . "@chapter")
- (2 . "@section")
- (3 . "@subsection")
- (4 . "@unnumberedsubsubsec")
- (5 . "@unnumberedsubsubsec")))))
+ (assoc-get level '(
+ ;; Hmm, texinfo doesn't have ``part''
+ (0 . "@top")
+ (1 . "@chapter")
+ (2 . "@section")
+ (3 . "@subsection")
+ (4 . "@unnumberedsubsubsec")
+ (5 . "@unnumberedsubsubsec"))))
(define (texi-appendix-section-command level)
- (cdr (assoc level '((0 . "@top")
- (1 . "@appendix")
- (2 . "@appendixsec")
- (3 . "@appendixsubsec")
- (4 . "@appendixsubsubsec")
- (5 . "@appendixsubsubsec")))))
+ (assoc-get level '((0 . "@top")
+ (1 . "@appendix")
+ (2 . "@appendixsec")
+ (3 . "@appendixsubsec")
+ (4 . "@appendixsubsubsec")
+ (5 . "@appendixsubsubsec"))))
(define (one-item->texi label-desc-pair)
"Document one (LABEL . DESC); return empty string if LABEL is empty string."
"Generate what is between @menu and @end menu."
(let ((maxwid
(apply max (map (lambda (x) (string-length (car x))) items-alist))))
-
+
(string-append
"\n@menu"
(apply string-append
(map (lambda (x)
(string-append
- (string-pad-right
+ (string-pad-right
(string-append "\n* " (car x) ":: ")
(+ maxwid 8))
(cdr x)))
(define (human-listify lst)
"Produce a textual enumeration from LST, a list of strings"
-
+
(cond
((null? lst) "none")
((null? (cdr lst)) (car lst))
(alist (if (pair? rest) (car rest) '()))
(type?-name (string->symbol
(string-append (symbol->string where) "-type?")))
- (doc-name (string->symbol
+ (doc-name (string->symbol
(string-append (symbol->string where) "-doc")))
(type (object-property sym type?-name))
(typename (type-name type))
(if (eq? desc #f)
(ly:error (_ "cannot find description for property ~S (~S)") sym where))
-
+
(cons
(string-append "@code{" name "} "
"(" typename ")"
(* size (assoc-get 'xo-padding details 0.2))) ; needed only here
(parameters (fret-parse-marking-list marking-list my-fret-count))
(capo-fret (assoc-get 'capo-fret parameters 0))
- (dot-list (cdr (assoc 'dot-list parameters)))
- (xo-list (cdr (assoc 'xo-list parameters)))
- (fret-range (cdr (assoc 'fret-range parameters)))
+ (dot-list (assoc-get 'dot-list parameters))
+ (xo-list (assoc-get 'xo-list parameters))
+ (fret-range (assoc-get 'fret-range parameters))
(my-fret-count (fret-count fret-range))
- (barre-list (cdr (assoc 'barre-list parameters)))
+ (barre-list (assoc-get 'barre-list parameters))
(barre-type
(assoc-get 'barre-type details 'curved))
(fret-diagram-stencil '()))
(if (eq? (current-thread) trace-thread)
#t ;; do nothing.
(let*
- ((cells (cdr (assoc 'total-cells-allocated (gc-stats))))
+ ((cells (assoc-get 'total-cells-allocated (gc-stats)))
(proc (arg-procedure args))
(time (tms:utime (times)))
(stack (extract-trace continuation)))
(set! trace-points '())
(set! continue-tracing #t)
(set! trace-count 0)
- (set! start-memory (cdr (assoc 'total-cells-allocated (gc-stats))))
+ (set! start-memory (assoc-get 'total-cells-allocated (gc-stats)))
(set! start-time (tms:utime (times)))
(install-tracepoint))
(for-each
(lambda (r)
(let*
- ((mem (- (cdr (assoc 'cells r)) start-memory))
- (proc (cdr (assoc 'proc r)))
- (stack (cdr (assoc 'stack r)))
- (time (- (cdr (assoc 'time r)) start-time)))
+ ((mem (- (assoc-get 'cells r) start-memory))
+ (proc (assoc-get 'proc r))
+ (stack (assoc-get 'stack r))
+ (time (- (assoc-get 'time r) start-time)))
(format graph-out "~a ~a\n" time mem)
(if stack
(- mem last-mem) proc)
(do
((j 0 (1+ j))
- (stack (cdr (assoc 'stack r)) stack))
+ (stack (assoc-get 'stack r) stack))
((>= j (vector-length stack)))
(format stacks-out "\t~a\n"
(ly:context-unset-property where 'ottavation)))
(let* ((offset (* -7 octavation))
- (string (cdr (assoc octavation '((2 . "15ma")
- (1 . "8va")
- (0 . #f)
- (-1 . "8vb")
- (-2 . "15mb"))))))
+ (string (assoc-get octavation '((2 . "15ma")
+ (1 . "8va")
+ (0 . #f)
+ (-1 . "8vb")
+ (-2 . "15mb")))))
(ly:context-set-property! context 'middleCOffset offset)
(ly:context-set-property! context 'ottavation string)
(ly:set-middle-C! context)))
"
(let ((meta (ly:grob-property grob 'meta)))
- (if (equal? (cdr (assoc 'name meta)) grob-name)
+ (if (equal? (assoc-get 'name meta) grob-name)
(set! (ly:grob-property grob symbol) val))))
(tag (if (and cause (integer? (ly:event-property cause 'input-tag)))
(ly:event-property cause 'input-tag)
-1))
- (name (cdr (assoc 'name (ly:grob-property grob 'meta)))))
+ (name (assoc-get 'name (ly:grob-property grob 'meta))))
(apply format
(append (list "cause ~a \"~a\" ~a ~a ~a ~a\n" tag name)
((symbol . middleCClefPosition)
(value . ,(+ oct
(caddr e)
- (cdr (assoc (cadr e) c0-pitch-alist)))))
+ (assoc-get (cadr e) c0-pitch-alist))))
((symbol . clefPosition) (value . ,(caddr e)))
((symbol . clefOctavation) (value . ,(- oct))))))
(recalc-mid-C (make-music 'ApplyContext))
;;;; part-combiner.scm -- Part combining, staff changes.
;;;;
;;;; source file of the GNU LilyPond music typesetter
-;;;;
+;;;;
;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
;; todo: figure out how to make module,
;; of (SYMBOL . RESULT-INDEX), which indicates where
;; said spanner was started.
(spanner-state #:init-value '() #:accessor span-state))
-
+
(define-method (write (x <Voice-state> ) file)
(display (when x) file)
(display " evs = " file)
;;
(is #:init-keyword #:voice-states #:accessor voice-states)
(synced #:init-keyword #:synced #:init-value #f #:getter synced?))
-
+
(define-method (write (x <Split-state> ) f)
(display (when x) f)
"Merge lists VS1 and VS2, containing Voice-state objects into vector
of Split-state objects, crosslinking the Split-state vector and
Voice-state objects
-"
+"
(define (helper ss-idx ss-list idx1 idx2)
(let* ((state1 (if (< idx1 (vector-length vs1)) (vector-ref vs1 idx1) #f))
(state2 (if (< idx2 (vector-length vs2)) (vector-ref vs2 idx2) #f))
(define (helper index active)
"Analyse EVS at INDEX, given state ACTIVE."
-
+
(define (analyse-tie-start active ev)
(if (equal? (ly:event-property ev 'class) 'tie-event)
(acons 'tie (split-index (vector-ref voice-state-vec index))
active)
active))
-
+
(define (analyse-tie-end active ev)
(if (equal? (ly:event-property ev 'class) 'note-event)
(assoc-remove! active 'tie)
(equal? STOP (ly:event-property ev 'span-direction))))
(assoc-remove! (assoc-remove! active 'cresc) 'decr)
active))
-
+
(define (active<? a b)
(cond ((symbol<? (car a) (car b)) #t)
((symbol<? (car b) (car b)) #f)
(else (< (cdr a) (cdr b)))))
-
+
(define (analyse-span-event active ev)
(let* ((name (ly:event-property ev 'class))
(key (cond ((equal? name 'slur-event) 'slur)
(set! (span-state (vector-ref voice-state-vec index))
(list-copy active))
(helper (1+ index) active))))
-
+
(helper 0 '()))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define-public (recording-group-emulate music odef)
+(define-public (recording-group-emulate music odef)
"Interprets music according to odef, but stores all events in a chronological list, similar to the Recording_group_engraver in 2.8 and earlier"
(let*
((context-list '())
(now-mom (ly:make-moment 0 0))
(global (ly:make-global-context odef))
- (mom-listener (ly:make-listener
+ (mom-listener (ly:make-listener
(lambda (tev)
(set! now-mom (ly:event-property tev 'moment)))))
(new-context-listener
(listener (ly:parser-lookup parser 'partCombineListener))
(evs2 (recording-group-emulate m2 listener))
(evs1 (recording-group-emulate m1 listener)))
-
+
(set! (ly:music-property m 'elements) (list m1 m2))
(set! (ly:music-property m 'split-list)
(if (and (assoc "one" evs1) (assoc "two" evs2))
- (determine-split-list (reverse! (cdr (assoc "one" evs1)) '())
- (reverse! (cdr (assoc "two" evs2)) '()))
+ (determine-split-list (reverse! (assoc-get "one" evs1) '())
+ (reverse! (assoc-get "two" evs2) '()))
'() ))
m))
(voice-state-vec1 (make-voice-states evl1))
(voice-state-vec2 (make-voice-states evl2))
(result (make-split-state voice-state-vec1 voice-state-vec2)))
-
+
(define (analyse-time-step result-idx)
(define (put x . index)
"Put the result to X, starting from INDEX backwards.
(begin
(set! (configuration (vector-ref result i)) x)
(put x (1- i))))))
-
+
(define (copy-state-from state-vec vs)
(define (copy-one-state key-idx)
(let* ((idx (cdr key-idx))
(previous-voice-state vs2)))
(if (and (null? (span-state vs1)) (null? (span-state vs2)))
(put 'chords)))))))))
-
+
(if (< result-idx (vector-length result))
(let* ((now-state (vector-ref result result-idx))
(vs1 (car (voice-states now-state)))
(vs2 (cdr (voice-states now-state))))
-
+
(cond ((not vs1) (put 'apart))
((not vs2) (put 'apart))
(else
(equal? active1 active2)
(equal? new-active1 new-active2))
(analyse-notes now-state)
-
+
;; active states different:
(put 'apart)))
-
+
;; go to the next one, if it exists.
(analyse-time-step (1+ result-idx)))))))
-
+
(define (analyse-a2 result-idx)
(if (< result-idx (vector-length result))
(let* ((now-state (vector-ref result result-idx))
(vs2 (cdr (voice-states now-state))))
(if (and (equal? (configuration now-state) 'chords)
vs1 vs2)
- (let ((notes1 (note-events vs1))
+ (let ((notes1 (note-events vs1))
(notes2 (note-events vs2)))
(cond ((and (= 1 (length notes1))
(= 1 (length notes2))
(= 0 (length notes2)))
(set! (configuration now-state) 'unisilence)))))
(analyse-a2 (1+ result-idx)))))
-
+
(define (analyse-solo12 result-idx)
-
+
(define (previous-config vs)
(let* ((pvs (previous-voice-state vs))
(spi (if pvs (split-index pvs) #f))
(if prev-split
(configuration prev-split)
'apart)))
-
+
(define (put-range x a b)
;; (display (list "put range " x a b "\n"))
(do ((i a (1+ i)))
((> i b) b)
(set! (configuration (vector-ref result i)) x)))
-
+
(define (put x)
;; (display (list "putting " x "\n"))
(set! (configuration (vector-ref result result-idx)) x))
-
+
(define (current-voice-state now-state voice-num)
(define vs ((if (= 1 voice-num) car cdr)
(voice-states now-state)))
(if (or (not vs) (equal? (when now-state) (when vs)))
vs
(previous-voice-state vs)))
-
+
(define (try-solo type start-idx current-idx)
"Find a maximum stretch that can be marked as solo. Only set
the mark when there are no spanners active.
;;
;; This includes rests. This isn't a problem: long rests
;; will be shared with the silent voice, and be marked
- ;; as unisilence. Therefore, long rests won't
+ ;; as unisilence. Therefore, long rests won't
;; accidentally be part of a solo.
;;
(put-range type start-idx current-idx)
(try-solo type start-idx (1+ current-idx)))))
;; try-solo
start-idx))
-
+
(define (analyse-moment result-idx)
"Analyse 'apart starting at RESULT-IDX. Return next index. "
(let* ((now-state (vector-ref result result-idx))
(equal? (when vs2) (when now-state))
(null? (previous-span-state vs2)))
(try-solo 'solo2 result-idx result-idx))
-
+
(else (1+ result-idx)))
;; analyse-moment
(1+ result-idx))))
-
+
(if (< result-idx (vector-length result))
(if (equal? (configuration (vector-ref result result-idx)) 'apart)
(analyse-solo12 (analyse-moment result-idx))
((note? object)
(let ((pitch (ly:pitch-semitones (note-pitch object))))
(format #f "~a~a~a~a"
- (cdr (assoc (modulo pitch 12) pp-pitch-names))
+ (assoc-get (modulo pitch 12) pp-pitch-names)
(let ((octave (+ (inexact->exact (floor (/ pitch 12))) 1)))
(cond
((= octave 0)