X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily.scm;h=6876a9cb6563701963920ccfe40e268c9616de0a;hb=0af6d4cb04fa3e4aa69a7aecb76034e4cb1ec49b;hp=337387b0bf5a25f953313de1cfe3f792df8494e4;hpb=01e85a02b5866e42e2ef822797f3986f06289bc0;p=lilypond.git diff --git a/scm/lily.scm b/scm/lily.scm index 337387b0bf..6876a9cb65 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -1,19 +1,91 @@ -; lily.scm -- implement Scheme output routines for TeX and PostScript -; -; source file of the GNU LilyPond music typesetter -; -; (c) 1998 Jan Nieuwenhuizen +;;; lily.scm -- implement Scheme output routines for TeX and PostScript +;;; +;;; source file of the GNU LilyPond music typesetter +;;; +;;; (c) 1998--2000 Jan Nieuwenhuizen +;;; Han-Wen Nienhuys -;(debug-enable 'backtrace) +;;; +;;; This file contains various routines in Scheme that are easier to +;;; do here than in C++. At present it is an unorganised mess. Sorry. + + +;;; We should repartition the entire scm side of lily in a +;;; more sane way, using namesspaces/modules? + +(debug-enable 'backtrace) ;;; library funtions (use-modules (ice-9 regex)) +(define (number-pair? x) + (and (pair? x) (number? (car x)) (number? (cdr x)))) + +(define (object-type obj) + (cond + ((dir? obj) "direction") + ((number-pair? obj) "pair of numbers") + ((ly-input-location? obj) "input location") + ((ly-element? obj) "graphic element") + ((pair? obj) "pair") + ((integer? obj) "integer") + ((list? obj) "list") + ((symbol? obj) "symbol") + ((string? obj) "string") + ((boolean? obj) "boolean") + ((moment? obj) "moment") + ((number? obj) "number") + ((char? obj) "char") + ((input-port? obj) "input port") + ((output-port? obj) "output port") + ((vector? obj) "vector") + ((procedure? obj) "procedure") + (else "unknown type") + )) + + +(define (type-name predicate) + (cond + ((eq? predicate dir?) "direction") + ((eq? predicate number-pair?) "pair of numbers") + ((eq? predicate ly-input-location?) "input location") + ((eq? predicate ly-element?) "graphic element") + ((eq? predicate pair?) "pair") + ((eq? predicate integer?) "integer") + ((eq? predicate list?) "list") + ((eq? predicate symbol?) "symbol") + ((eq? predicate string?) "string") + ((eq? predicate boolean?) "boolean") + ((eq? predicate moment?) "moment") + ((eq? predicate number?) "number") + ((eq? predicate char?) "char") + ((eq? predicate input-port?) "input port") + ((eq? predicate output-port?) "output port") + ((eq? predicate vector?) "vector") + ((eq? predicate procedure?) "procedure") + (else "unknown type") + )) + + +;; The regex module may not be available, or may be broken. +(define use-regex + (let ((os (string-downcase (vector-ref (uname) 0)))) + (not (equal? "cygwin" (substring os 0 (min 6 (string-length os))))))) + +;; If you have trouble with regex, define #f +(define use-regex #t) +;;(define use-regex #f) + ;; do nothing in .scm output (define (comment s) "") +;; URG guile-1.3/1.4 compatibility +(define (ly-eval x) (eval2 x #f)) + +(define (comment s) "") + (define (mm-to-pt x) (* (/ 72.27 25.40) x) ) @@ -27,13 +99,11 @@ ) ) -(define (glue-2-strings a b) - (string-append a " " b)) (define (numbers->string l) - (reduce glue-2-strings (map number->string l))) + (apply string-append (map ly-number->string l))) -(define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x)) +; (define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x)) (define (number->octal-string x) (let* ((n (inexact->exact x)) @@ -49,12 +119,9 @@ (number->string n radix))) -(define - (control->string c) - (string-append - (string-append (number->string (car c)) " ") - (string-append (number->string (cdr c)) " "))) - +(define (control->string c) + (string-append (number->string (car c)) " " + (number->string (cdr c)) " ")) (define (font i) (string-append @@ -62,104 +129,28 @@ (make-string 1 (integer->char (+ (char->integer #\A) i))) )) - - (define (scm-scm action-name) 1) (define security-paranoia #f) -;; See documentation of Item::visibility_lambda_ -(define (postbreak-only-visibility d) (if (= d 1) '(#f . #f) '(#t . #t))) -(define (spanbar-non-postbreak-visibility d) (if (= d -1) '(#t . #t) '(#f . #f))) -(define (all-visibility d) '(#f . #f)) -(define (non-postbreak-visibility d) (if (= d 1) '(#t . #t) '(#f . #f))) -(define (non-prebreak-visibility d) (if (= d -1) '(#t . #t) '(#f . #f))) - - -;; Score_span_bars are only visible at start of line -;; i.e. if break_dir == RIGHT == 1 -(define Span_bar_engraver-visibility non-postbreak-visibility) -(define Base_span_bar_engraver-visibility non-postbreak-visibility) -(define mark-visibility non-prebreak-visibility) -(define Span_score_bar_engraver-visibility postbreak-only-visibility) -(define Piano_bar_engraver-visibility postbreak-only-visibility) -(define Staff_group_bar_engraver-visibility postbreak-only-visibility) - -;; Spacing constants for prefatory matter. -;; -;; rules for this spacing are much more complicated than this. See [Wanske] page 126 -- 134, [Ross] pg 143 -- 147 -;; -;; - -;; (Measured in staff space) -(define space-alist - '( - (("" "Clef_item") . (minimum-space 1.0)) - (("" "Staff_bar") . (minimum-space 0.0)) - (("" "Clef_item") . (minimum-space 1.0)) - (("" "Key_item") . (minimum-space 0.5)) - (("" "Span_bar") . (extra-space 0.0)) - (("" "Time_signature") . (extra-space 0.0)) - (("" "begin-of-note") . (minimum-space 1.5)) - (("Clef_item" "Key_item") . (minimum-space 4.0)) - (("Key_item" "Time_signature") . (extra-space 1.0)) - (("Clef_item" "Time_signature") . (minimum-space 3.5)) - (("Staff_bar" "Clef_item") . (minimum-space 1.0)) - (("Clef_item" "Staff_bar") . (minimum-space 3.7)) - (("Time_signature" "Staff_bar") . (minimum-space 2.0)) - (("Key_item" "Staff_bar") . (extra-space 1.0)) - (("Span_bar" "Clef_item") . (extra-space 1.0)) - (("Clef_item" "Span_bar") . (minimum-space 3.7)) - (("Time_signature" "Span_bar") . (minimum-space 2.0)) - (("Key_item" "Span_bar") . (minimum-space 2.5)) - (("Staff_bar" "Time_signature") . (minimum-space 1.5)) ;double check this. - (("Time_signature" "begin-of-note") . (extra-space 2.0)) ;double check this. - (("Key_item" "begin-of-note") . (extra-space 2.5)) - (("Staff_bar" "begin-of-note") . (extra-space 1.0)) - (("Clef_item" "begin-of-note") . (minimum-space 5.0)) - (("" "Breathing_sign") . (minimum-space 0.0)) - (("Breathing_sign" "Key_item") . (minimum-space 1.5)) - (("Breathing_sign" "begin-of-note") . (minimum-space 1.0)) - (("Breathing_sign" "Staff_bar") . (minimum-space 1.5)) - (("Breathing_sign" "Clef_item") . (minimum-space 2.0)) - ) -) - -(define (break-align-spacer this next) - (let ((entry (assoc `(,this ,next) space-alist))) - (if entry - (cdr entry) - (begin (ly-warn (string-append "Unknown spacing pair `" this "', `" next "'")) - '(minimum-space 0.0))))) - +;; silly, use alist? +(define (find-notehead-symbol duration style) + (case style + ((cross) "2cross") + ((harmonic) "0mensural") + ((baroque) + (string-append (number->string duration) + (if (< duration 0) "mensural" ""))) + ((default) (number->string duration)) + (else + (string-append (number->string duration) (symbol->string style)))) + ) ;;;;;;;; TeX -;; this is silly, can't we use something like -;; roman-0, roman-1 roman+1 ? -(define cmr-alist - '(("bold" . "cmbx") - ("brace" . "feta-braces") - ("default" . "cmr10") - ("dynamic" . "feta-din") - ("feta" . "feta") - ("feta-1" . "feta") - ("feta-2" . "feta") - ("finger" . "feta-nummer") - ("typewriter" . "cmtt") - ("italic" . "cmti") - ("roman" . "cmr") - ("script" . "cmr") - ("large" . "cmbx") - ("Large" . "cmbx") - ("mark" . "feta-nummer") - ("number" . "feta-nummer") - ("volta" . "feta-nummer")) -) - (define (string-encode-integer i) (cond ((= i 0) "o") @@ -167,73 +158,82 @@ (else (string-append (make-string 1 (integer->char (+ 65 (modulo i 26)))) (string-encode-integer (quotient i 26)) - ) + )) ) ) - ) - -(define (magstep i) - (cdr (assoc i '((-4 . 482) - (-3 . 579) - (-2 . 694) - (-1 . 833) - (0 . 1000) - (1 . 1200) - (2 . 1440) - (3 . 1728) - (4 . 2074)) - ) - ) - ) - -(define script-alist '()) -(define (articulation-to-scriptdef a) - (assoc a script-alist) - ) - -;; Map style names to TeX font names. Return false if -;; no font name found. -(define (style-to-cmr s) - (assoc s cmr-alist ) - ) - +(define default-script-alist '()) (define font-name-alist '()) -(define (font-command name-mag) - (cons name-mag - (string-append "magfont" - (string-encode-integer (hashq (car name-mag) 1000000)) +(define (tex-encoded-fontswitch name-mag) + (let* ( + (iname-mag (car name-mag)) + (ename-mag (cdr name-mag)) + ) + (cons iname-mag + (cons ename-mag + (string-append "magfont" + (string-encode-integer + (hashq (car ename-mag) 1000000)) "m" - (string-encode-integer (cdr name-mag))) + (string-encode-integer + (inexact->exact (* 1000 (cdr ename-mag)))) - ) - ) -(define (define-fonts names) - (set! font-name-alist (map font-command names)) + ) + ) + ))) + +(define (define-fonts internal-external-name-mag-pairs) + (set! font-name-alist (map tex-encoded-fontswitch + internal-external-name-mag-pairs)) (apply string-append (map (lambda (x) - (font-load-command (car x) (cdr x))) font-name-alist) - )) - + (font-load-command (car x) (cdr x))) + (map cdr font-name-alist) + + ))) + +(define (fontify name-mag-pair exp) + (string-append (select-font name-mag-pair) + exp) + ) + +;;;;;;;;;;;;;;;;;;;; + + +; Make a function that checks score element for being of a specific type. +(define (make-type-checker symbol) + (lambda (elt) + ;;(display symbol) + ;;(eq? #t (ly-get-elt-property elt symbol)) + (not (eq? #f (memq symbol (ly-get-elt-property elt 'interfaces)))) + )) +;;;;;;;;;;;;;;;;;;; TeX output (define (tex-scm action-name) (define (unknown) "%\n\\unknown%\n") - (define (select-font font-name-symbol) + (define (select-font name-mag-pair) (let* ( - (c (assoc font-name-symbol font-name-alist)) + (c (assoc name-mag-pair font-name-alist)) ) (if (eq? c #f) (begin + (display "FAILED\n") + (display (object-type (car name-mag-pair))) + (display (object-type (caaar font-name-alist))) + (ly-warn (string-append - "Programming error: No such font known " (car font-name-symbol))) - "") ; issue no command - (string-append "\\" (cdr c))) + "Programming error: No such font known " + (car name-mag-pair) " " + (number->string (cdr name-mag-pair)) + )) + "") ; issue no command + (string-append "\\" (cddr c))) )) @@ -253,24 +253,20 @@ (define (char i) (string-append "\\char" (inexact->string i 10) " ")) + (define (dashed-line thick on off dx dy) + (embedded-ps ((ps-scm 'dashed-line) thick on off dx dy))) + (define (decrescendo thick w h cont) (embedded-ps ((ps-scm 'decrescendo) thick w h cont))) - ;This sets CTM so that you get to the currentpoint - ; by executing a 0 0 moveto - - - - (define (font-load-command name-mag command) (string-append "\\font\\" command "=" - (symbol->string (car name-mag)) + (car name-mag) " scaled " - (number->string (magstep (cdr name-mag))) + (number->string (inexact->exact (* 1000 (cdr name-mag)))) "\n")) - (define (embedded-ps s) (string-append "\\embeddedps{" s "}")) @@ -278,7 +274,12 @@ (string-append "% " s)) (define (end-output) - "\n\\EndLilyPondOutput") + (begin +; uncomment for some stats about lily memory +; (display (gc-stats)) + (string-append "\n\\EndLilyPondOutput" + ; Put GC stats here. + ))) (define (experimental-on) "") @@ -294,12 +295,15 @@ (define (header-end) (string-append "\\special{! " - ; fixed in 1.3.4 - ;(ly-gulp-file "lily.ps") - (regexp-substitute/global #f "\n" (ly-gulp-file "lily.ps") 'pre " %\n" 'post) + ;; URG: ly-gulp-file: now we can't use scm output without Lily + (if use-regex + ;; fixed in 1.3.4 for powerpc -- broken on Windows + (regexp-substitute/global #f "\n" + (ly-gulp-file "lily.ps") 'pre " %\n" 'post) + (ly-gulp-file "lily.ps")) "}" - "\\input lilyponddefs \\turnOnPostScript")) + "\\input lilyponddefs\\newdimen\\outputscale \\outputscale=\\mudelapaperoutputscale pt\\turnOnPostScript")) (define (header creator generate) (string-append @@ -320,20 +324,24 @@ ;; (define (output-tex-string s) (if security-paranoia - (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post) + (if use-regex + (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post) + (begin (display "warning: not paranoid") (newline) s)) s)) (define (lily-def key val) (string-append "\\def\\" - ; fixed in 1.3.4 - (regexp-substitute/global #f "_" (output-tex-string key) 'pre "X" 'post) - ;(output-tex-string key) + (if use-regex + ;; fixed in 1.3.4 for powerpc -- broken on Windows + (regexp-substitute/global #f "_" + (output-tex-string key) 'pre "X" 'post) + (output-tex-string key)) "{" (output-tex-string val) "}\n")) (define (number->dim x) (string-append - (number->string (chop-decimal x)) " pt ")) + (ly-number->string x) " \\outputscale ")) (define (placebox x y s) (string-append @@ -347,7 +355,7 @@ (string-append"\\vbox to " (number->dim ht) "{\\hbox{%\n")) (define (stop-line) - "}\\vss}\\interscoreline") + "}\\vss}\\interscoreline\n") (define (stop-last-line) "}\\vss}") (define (filledbox breapth width depth height) @@ -366,6 +374,23 @@ (define (volta h w thick vert_start vert_end) (embedded-ps ((ps-scm 'volta) h w thick vert_start vert_end))) + (define (define-origin file line col) + ; use this for column positions + (string-append "\\special{src:" (number->string line) ":" + (number->string col) " " file "}" + ;; arg, the clueless take over the mailing list... +; "\\special{-****-These-warnings-are-harmless-***}" +; "\\special{-****-PLEASE-read-http://appel.lilypond.org/wiki/index.php3?PostProcessing-****}" + ) + + ; line numbers only: + ;(string-append "\\special{src:" (number->string line) " " file "}") +) + ; no origin info: return empty string + ; "" + ; no-origin not yet supported by Xdvi + (define (no-origin) "") + ;; TeX ;; The procedures listed below form the public interface of TeX-scm. ;; (should merge the 2 lists) @@ -377,6 +402,7 @@ (define bracket ,bracket) (define char ,char) (define crescendo ,crescendo) + (define dashed-line ,dashed-line) (define dashed-slur ,dashed-slur) (define decrescendo ,decrescendo) (define end-output ,end-output) @@ -397,12 +423,15 @@ (define text ,text) (define tuplet ,tuplet) (define volta ,volta) + (define define-origin ,define-origin) + (define no-origin ,no-origin) )) ((eq? action-name 'beam) beam) ((eq? action-name 'tuplet) tuplet) ((eq? action-name 'bracket) bracket) ((eq? action-name 'crescendo) crescendo) + ((eq? action-name 'dashed-line) dashed-line) ((eq? action-name 'dashed-slur) dashed-slur) ((eq? action-name 'decrescendo) decrescendo) ((eq? action-name 'end-output) end-output) @@ -429,7 +458,6 @@ ;;;;;;;;;;;; PS (define (ps-scm action-name) - ;; alist containing fontname -> fontcommand assoc (both strings) (define font-alist '()) (define font-count 0) @@ -441,32 +469,24 @@ "lilyfont" (make-string 1 (integer->char (+ 65 i))))) - (define (mag-to-size m) - (number->string (case m - (0 12) - (1 12) - (2 14) ; really: 14.400 - (3 17) ; really: 17.280 - (4 21) ; really: 20.736 - (5 24) ; really: 24.888 - (6 30) ; really: 29.856 - ))) - - - (define (select-font font-name-symbol) + + (define (select-font name-mag-pair) (let* ( - (c (assoc font-name-symbol font-name-alist)) + (c (assoc name-mag-pair font-name-alist)) ) (if (eq? c #f) (begin + (display name-mag-pair) + (display font-name-alist) (ly-warn (string-append - "Programming error: No such font known " (car font-name-symbol))) - "") ; issue no command + "Programming error: No such font known " (car name-mag-pair)) + (number->string (cdr name-mag-pair)) + ) + + "") ; issue no command (string-append " " (cdr c) " ")) - - )) (define (font-load-command name-mag command) @@ -475,7 +495,7 @@ " { /" (symbol->string (car name-mag)) " findfont " - (number->string (magstep (cdr name-mag))) + (number->string (cdr name-mag)) " 1000 div 12 mul scalefont setfont } bind def " "\n")) @@ -510,6 +530,19 @@ (number->string (* 10 thick)) ;UGH. 10 ? " ] 0 draw_dashed_slur")) + (define (dashed-line thick on off dx dy) + (string-append + (number->string dx) + " " + (number->string dy) + " " + (number->string thick) + " [ " + (number->string on) + " " + (number->string off) + " ] 0 draw_dashed_line")) + (define (decrescendo thick w h cont) (string-append (numbers->string (list w h (inexact->exact cont) thick)) @@ -537,6 +570,7 @@ (define (header-end) (string-append + ;; URG: now we can't use scm output without Lily (ly-gulp-file "lilyponddefs.ps") " {exch pop //systemdict /run get exec} " (ly-gulp-file "lily.ps") @@ -603,6 +637,9 @@ "\n unknown\n") + (define (define-origin a b c ) "") + (define (no-origin) "") + ;; PS (cond ((eq? action-name 'all-definitions) `(begin @@ -613,6 +650,7 @@ (define crescendo ,crescendo) (define volta ,volta) (define bezier-sandwich ,bezier-sandwich) + (define dashed-line ,dashed-line) (define dashed-slur ,dashed-slur) (define decrescendo ,decrescendo) (define end-output ,end-output) @@ -633,6 +671,8 @@ (define stop-line ,stop-line) (define stop-last-line ,stop-line) (define text ,text) + (define no-origin ,no-origin) + (define define-origin ,define-origin) )) ((eq? action-name 'tuplet) tuplet) ((eq? action-name 'beam) beam) @@ -640,6 +680,7 @@ ((eq? action-name 'bracket) bracket) ((eq? action-name 'char) char) ((eq? action-name 'crescendo) crescendo) + ((eq? action-name 'dashed-line) dashed-line) ((eq? action-name 'dashed-slur) dashed-slur) ((eq? action-name 'decrescendo) decrescendo) ((eq? action-name 'experimental-on) experimental-on) @@ -656,6 +697,7 @@ ((string? arg) (string-append "\"" arg "\"")) ((symbol? arg) (string-append "\"" (symbol->string arg) "\"")))) +; ugh: naming. (define (func name . args) (string-append "(" name @@ -668,275 +710,137 @@ (define (sign x) (if (= x 0) 1 - (inexact->exact (/ x (abs x))))) - -;;;; AsciiScript as -(define (as-scm action-name) - - (define (beam width slope thick) - (string-append - (func "set-line-char" "#") - (func "rline-to" width (* width slope)) - )) - - ; simple flat slurs - (define (bezier-sandwich l thick) - (let ( - (c0 (cadddr l)) - (c1 (cadr l)) - (c3 (caddr l))) - (let* ((x (car c0)) - (dx (- (car c3) x)) - (dy (- (cdr c3) (cdr c0))) - (rc (/ dy dx)) - (c1-dx (- (car c1) x)) - (c1-line-y (+ (cdr c0) (* c1-dx rc))) - (dir (if (< c1-line-y (cdr c1)) 1 -1)) - (y (+ -1 (* dir (max (* dir (cdr c0)) (* dir (cdr c3))))))) - (string-append - (func "rmove-to" x y) - (func "put" (if (< 0 dir) "/" "\\\\")) - (func "rmove-to" 1 (if (< 0 dir) 1 0)) - (func "set-line-char" "_") - (func "h-line" (- dx 1)) - (func "rmove-to" (- dx 1) (if (< 0 dir) -1 0)) - (func "put" (if (< 0 dir) "\\\\" "/")))))) - - (define (bracket arch_angle arch_width arch_height width height arch_thick thick) - (string-append - (func "rmove-to" (+ width 1) (- (/ height -2) 1)) - (func "put" "\\\\") - (func "set-line-char" "|") - (func "rmove-to" 0 1) - (func "v-line" (+ height 1)) - (func "rmove-to" 0 (+ height 1)) - (func "put" "/") - )) - - (define (char i) - (func "char" i)) - - (define (end-output) - (func "end-output")) - - (define (experimental-on) - "") - - (define (filledbox breapth width depth height) - (let ((dx (+ width breapth)) - (dy (+ depth height))) - (string-append - (func "rmove-to" (* -1 breapth) (* -1 depth)) - (if (< dx dy) - (string-append - (func "set-line-char" - (if (<= dx 1) "|" "#")) - (func "v-line" dy)) - (string-append - (func "set-line-char" - (if (<= dy 1) "-" "=")) - (func "h-line" dx)))))) - - (define (font-load-command name-mag command) - (func "load-font" (car name-mag) (magstep (cdr name-mag)))) - - (define (header creator generate) - (func "header" creator generate)) - - (define (header-end) - (func "header-end")) - - ;; urg: this is good for half of as2text's execution time - (define (xlily-def key val) - (string-append "(define " key " " (arg->string val) ")\n")) - - (define (lily-def key val) - (if - (equal? key "mudelapaperlinewidth") - (string-append "(define " key " " (arg->string val) ")\n") - "")) - - (define (placebox x y s) - (string-append (func "move-to" x y) s)) - - (define (select-font font-name-symbol) - (let* ((c (assoc font-name-symbol font-name-alist))) - (if (eq? c #f) - (begin - (ly-warn - (string-append - "Programming error: No such font known " - (car font-name-symbol))) - "") ; issue no command - (func "select-font" (car font-name-symbol))))) - - (define (start-line height) - (func "start-line" height)) - - (define (stop-line) - (func "stop-line")) - - (define (text s) - (func "text" s)) - - (define (volta h w thick vert-start vert-end) - ;; urg - (set! h 1) - (string-append - (func "set-line-char" "|") - (func "rmove-to" 0 -4) - ;; definition strange-way around - (if (= 0 vert-start) - (func "v-line" h) - "") - (func "rmove-to" 1 h) - (func "set-line-char" "_") - (func "h-line" (- w 1)) - (func "set-line-char" "|") - (if (= 0 vert-end) - (string-append - (func "rmove-to" (- w 1) (* -1 h)) - (func "v-line" (* -1 h))) - ""))) - - (cond ((eq? action-name 'all-definitions) - `(begin - (define beam ,beam) - (define bracket ,bracket) - (define char ,char) - ;;(define crescendo ,crescendo) - (define bezier-sandwich ,bezier-sandwich) - ;;(define dashed-slur ,dashed-slur) - ;;(define decrescendo ,decrescendo) - (define end-output ,end-output) - (define experimental-on ,experimental-on) - (define filledbox ,filledbox) - ;;(define font-def ,font-def) - (define font-load-command ,font-load-command) - ;;(define font-switch ,font-switch) - (define header ,header) - (define header-end ,header-end) - (define lily-def ,lily-def) - ;;(define invoke-char ,invoke-char) - ;;(define invoke-dim1 ,invoke-dim1) - (define placebox ,placebox) - (define select-font ,select-font) - (define start-line ,start-line) - ;;(define stem ,stem) - (define stop-line ,stop-line) - (define stop-last-line ,stop-line) - (define text ,text) - ;;(define tuplet ,tuplet) - (define volta ,volta) - )) - ;;((eq? action-name 'tuplet) tuplet) - ;;((eq? action-name 'beam) beam) - ;;((eq? action-name 'bezier-sandwich) bezier-sandwich) - ;;((eq? action-name 'bracket) bracket) - ((eq? action-name 'char) char) - ;;((eq? action-name 'crescendo) crescendo) - ;;((eq? action-name 'dashed-slur) dashed-slur) - ;;((eq? action-name 'decrescendo) decrescendo) - ;;((eq? action-name 'experimental-on) experimental-on) - ((eq? action-name 'filledbox) filledbox) - ((eq? action-name 'select-font) select-font) - ;;((eq? action-name 'volta) volta) - (else (error "unknown tag -- MUSA-SCM " action-name)) - ) - ) - + (if (< x 0) -1 1))) (define (gulp-file name) - (let* ((port (open-file name "r")) - (content (let loop ((text "")) - (let ((line (read-line port))) - (if (or (eof-object? line) - (not line)) - text - (loop (string-append text line "\n"))))))) - (close port) - content)) + (let* ((file (open-input-file name)) + (text (read-delimited "" file))) + (close file) + text)) +;; urg: Use when standalone, do: +;; (define ly-gulp-file scm-gulp-file) (define (scm-gulp-file name) (set! %load-path - (cons (string-append - (getenv 'LILYPONDPREFIX) "/ps") %load-path)) + (cons (string-append (getenv 'LILYPONDPREFIX) "/ly") + (cons (string-append (getenv 'LILYPONDPREFIX) "/ps") + %load-path))) (let ((path (%search-load-path name))) (if path (gulp-file path) (gulp-file name)))) (define (scm-tex-output) - (eval (tex-scm 'all-definitions))) + (ly-eval (tex-scm 'all-definitions))) (define (scm-ps-output) - (eval (ps-scm 'all-definitions))) + (ly-eval (ps-scm 'all-definitions))) (define (scm-as-output) - (eval (as-scm 'all-definitions))) - -; Russ McManus, -; -; I use the following, which should definitely be provided somewhere -; in guile, but isn't, AFAIK: -; -; - -(define (hash-table-for-each fn ht) - (do ((i 0 (+ 1 i))) - ((= i (vector-length ht))) - (do ((alist (vector-ref ht i) (cdr alist))) - ((null? alist) #t) - (fn (car (car alist)) (cdr (car alist)))))) - -(define (hash-table-map fn ht) - (do ((i 0 (+ 1 i)) - (ret-ls '())) - ((= i (vector-length ht)) (reverse ret-ls)) - (do ((alist (vector-ref ht i) (cdr alist))) - ((null? alist) #t) - (set! ret-ls (cons (fn (car (car alist)) (cdr (car alist))) ret-ls))))) - - - + (ly-eval (as-scm 'all-definitions))) + (define (index-cell cell dir) (if (equal? dir 1) (cdr cell) (car cell))) -; -; How should a bar line behave at a break? -; -(define (break-barline glyph dir) - (let ((result (assoc glyph - '((":|:" . (":|" . "|:")) - ("|" . ("|" . "")) - ("|s" . (nil . "|")) - ("|:" . ("|" . "|:")) - ("|." . ("|." . nil)) - (":|" . (":|" . nil)) - ("||" . ("||" . nil)) - (".|." . (".|." . nil)) - ("scorebar" . (nil . "scorepostbreak")) - ("brace" . (nil . "brace")) - ("bracket" . (nil . "bracket")) - ) - ))) +(define major-scale + '( + (0 . 0) + (1 . 0) + (2 . 0) + (3 . 0) + (4 . 0) + (5 . 0) + (6 . 0) + ) + ) - (if (equal? result #f) - (ly-warn (string-append "Unknown bar glyph: `" glyph "'")) - (index-cell (cdr result) dir)) - ) - ) - - -(define (slur-ugly ind ht) - (if (and -; (< ht 4.0) - (< ht (* 4 ind)) - (> ht (* 0.4 ind)) - (> ht (+ (* 2 ind) -4)) - (< ht (+ (* -2 ind) 8))) - #f - (cons ind ht) - )) +(begin + (eval-string (ly-gulp-file "interface.scm")) + (eval-string (ly-gulp-file "beam.scm")) + (eval-string (ly-gulp-file "slur.scm")) + (eval-string (ly-gulp-file "font.scm")) + (eval-string (ly-gulp-file "auto-beam.scm")) + (eval-string (ly-gulp-file "generic-property.scm")) + (eval-string (ly-gulp-file "basic-properties.scm")) + (eval-string (ly-gulp-file "chord-names.scm")) + (eval-string (ly-gulp-file "element-descriptions.scm")) + ) + + +;; +;; (name . (glyph clef-position octavation)) +;; -- the name clefOctavation is misleading the value 7 is 1 octave not 7 Octaves. +;; +(define supported-clefs '( + ("treble" . ("clefs-G" -2 0)) + ("violin" . ("clefs-G" -2 0)) + ("G" . ("clefs-G" -2 0)) + ("G2" . ("clefs-G" -2 0)) + ("french" . ("clefs-G" -4 0)) + ("soprano" . ("clefs-C" -4 0)) + ("mezzosoprano" . ("clefs-C" -2 0)) + ("alto" . ("clefs-C" 0 0)) + ("tenor" . ("clefs-C" 2 0)) + ("baritone" . ("clefs-C" 4 0)) + ("varbaritone" . ("clefs-F" 0 0)) + ("bass" . ("clefs-F" 2 0)) + ("F" . ( "clefs-F" 2 0)) + ("subbass" . ("clefs-F" 4 0)) + + ;; should move mensural stuff to separate file? + ("vaticana_do1" . ("clefs-vaticana_do" -1 0)) + ("vaticana_do2" . ("clefs-vaticana_do" 1 0)) + ("vaticana_do3" . ("clefs-vaticana_do" 3 0)) + ("vaticana_fa1" . ("clefs-vaticana_fa" -1 0)) + ("vaticana_fa2" . ("clefs-vaticana_fa" 1 0)) + ("medicaea_do1" . ("clefs-medicaea_do" -1 0)) + ("medicaea_do2" . ("clefs-medicaea_do" 1 0)) + ("medicaea_do3" . ("clefs-medicaea_do" 3 0)) + ("medicaea_fa1" . ("clefs-medicaea_fa" -1 0)) + ("medicaea_fa2" . ("clefs-medicaea_fa" 1 0)) + ("hufnagel_do1" . ("clefs-hufnagel_do" -1 0)) + ("hufnagel_do2" . ("clefs-hufnagel_do" 1 0)) + ("hufnagel_do3" . ("clefs-hufnagel_do" 3 0)) + ("hufnagel_fa1" . ("clefs-hufnagel_fa" -1 0)) + ("hufnagel_fa2" . ("clefs-hufnagel_fa" 1 0)) + ("hufnagel" . ("clefs-hufnagel_do_fa" 4 0)) + ("mensural1_c1" . ("clefs-mensural1_c" -4 0)) + ("mensural1_c2" . ("clefs-mensural1_c" -2 0)) + ("mensural1_c3" . ("clefs-mensural1_c" 0 0)) + ("mensural1_c4" . ("clefs-mensural1_c" 2 0)) + ("mensural2_c1" . ("clefs-mensural2_c" -4 0)) + ("mensural2_c2" . ("clefs-mensural2_c" -2 0)) + ("mensural2_c3" . ("clefs-mensural2_c" 0 0)) + ("mensural2_c4" . ("clefs-mensural2_c" 2 0)) + ("mensural2_c5" . ("clefs-mensural2_c" 4 0)) + ("mensural3_c1" . ("clefs-mensural3_c" -2 0)) + ("mensural3_c2" . ("clefs-mensural3_c" 0 0)) + ("mensural3_c3" . ("clefs-mensural3_c" 2 0)) + ("mensural3_c4" . ("clefs-mensural3_c" 4 0)) + ("mensural_f" . ("clefs-mensural_f" 2 0)) + ) +) + +(define (clef-name-to-properties cl) + (let ((e (assoc cl supported-clefs)) + ) + (if (pair? e) + `(((symbol . clefGlyph) + (type . property-set) + (value . ,(cadr e)) + ) + ((symbol . clefPosition) + (type . property-set) + (value . ,(caddr e)) + ) + ((symbol . clefOctavation) + (type . property-set) + (value . ,(caddr (cdr e))) + ) + ) + (begin + (ly-warn (string-append "Unknown clef type `" cl "'\nSee scm/lily.scm for supported clefs")) + '()) + )))