X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily.scm;h=f1431284bce8d48ddcfe92bf91701169f89bf231;hb=29d1ad412ee48aa7a3a1666c7ab7af8fd2e2b1bf;hp=9c57c962c9905f6f56ecb9247074372fbb06596f;hpb=d36e8ced83cfeabcf4ec3840ffe93a717a17ac4d;p=lilypond.git diff --git a/scm/lily.scm b/scm/lily.scm index 9c57c962c9..f1431284bc 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -13,10 +13,18 @@ (string-append (map (lambda (n) (string-append (number->string n ) " ")) l))) +(define (reduce operator list) + (if (null? (cdr list)) (car list) + (operator (car list) (reduce operator (cdr list))) + ) + ) + + +(define (glue-2-strings a b) (string-append a " " b)) + (define (numbers->string l) - (apply string-append - (map (lambda (n) (string-append (number->string n) " ")) l))) + (reduce glue-2-strings (map number->string l))) (define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x)) @@ -41,8 +49,7 @@ (string-append (number->string (cadr c)) " "))) -(define - (font i) +(define (font i) (string-append "font" (make-string 1 (integer->char (+ (char->integer #\A) i))) @@ -72,8 +79,53 @@ (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 +;; +;; + +(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))))) + + ;;;;;;;; TeX @@ -121,12 +173,11 @@ (string-append "\\lilyfont" (make-string 1 (integer->char (+ 65 i))))) - - (define (select-font font-name) + + (define (select-font font-name magnification) (if (not (equal? font-name current-font)) - (begin + (let* ((font-cmd (assoc font-name font-alist))) (set! current-font font-name) - (define font-cmd (assoc font-name font-alist)) (if (eq? font-cmd #f) (begin (set! font-cmd (cached-fontname font-count)) @@ -134,7 +185,12 @@ (set! font-count (+ 1 font-count)) (if (equal? font-name "") (error "Empty fontname -- SELECT-FONT")) - (string-append "\\font" font-cmd "=" font-name font-cmd)) + (if (> magnification 0) + (string-append "\\font" font-cmd "=" font-name + " scaled \\magstep " + (number->string magnification) font-cmd) + (string-append "\\font" font-cmd "=" font-name font-cmd))) + (cdr font-cmd))) "" ;no switch needed )) @@ -148,15 +204,18 @@ (define (dashed-slur thick dash l) (embedded-ps ((ps-scm 'dashed-slur) thick dash l))) - (define (crescendo w h cont) - (embedded-ps ((ps-scm 'crescendo) w h cont))) + (define (crescendo thick w h cont) + (embedded-ps ((ps-scm 'crescendo) thick w h cont))) (define (char i) - (string-append "\\show{" (inexact->string i 10) "}")) + (string-append "\\char" (inexact->string i 10) " ")) - (define (decrescendo w h cont) - (embedded-ps ((ps-scm 'decrescendo) w h cont))) + (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 (embedded-ps s) (string-append "\\embeddedps{" s "}")) @@ -164,7 +223,7 @@ "\n\\EndLilyPondOutput") (define (experimental-on) - "\\turnOnExperimentalFeatures") + "") (define (font-switch i) (string-append @@ -174,11 +233,14 @@ (string-append "\\font" (font-switch i) "=" s "\n")) - (define (generalmeter num den) - (string-append - "\\generalmeter{" (number->string (inexact->exact num)) "}{" (number->string (inexact->exact den)) "}")) - - (define (header-end) "\\turnOnPostScript") + (define (header-end) + (string-append + "\\special{! " + (ly-gulp-file "lily.ps") + ;; breaks on ppc +;; (regexp-substitute/global #f "\n" (ly-gulp-file "lily.ps") 'pre " %\n" 'post) + "}" + "\\input lilyponddefs \\turnOnPostScript")) (define (header creator generate) (string-append @@ -197,10 +259,11 @@ ;; ;; need to do something to make this really safe. ;; - (if security-paranoia - (define (output-tex-string s) - (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post)) - (define (output-tex-string s) s)) + (define (output-tex-string s) + (if security-paranoia + (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post) + s)) + (define (lily-def key val) (string-append @@ -208,34 +271,28 @@ (define (number->dim x) (string-append - (number->string (chop-decimal x)) "pt ")) + (number->string (chop-decimal x)) " pt ")) (define (placebox x y s) (string-append "\\placebox{" (number->dim y) "}{" (number->dim x) "}{" s "}")) - (define (pianobrace y) - (define step 1.0) - (define minht (* 2 mudelapaperstaffheight)) - (define maxht (* 7 minht)) - (string-append - "{\\bracefont " (char (max - 0 - (/ (- (min y (- maxht step)) minht) step))) "}")) - - - - (define (rulesym h w) - (string-append - "\\vrule height " (number->dim (/ h 2)) - " depth " (number->dim (/ h 2)) - " width " (number->dim w) - ) + ;;;; + (define (pianobrace y staffht) + (let* ((step 1.0) + (minht (* 2 staffht)) + (maxht (* 7 minht)) + ) + (string-append + (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))) 0) + (char (max 0 (/ (- (min y (- maxht step)) minht) step)))) + ) ) - (define (bezier-sandwich l) - (embedded-ps ((ps-scm 'bezier-sandwich) l))) + + (define (bezier-sandwich l thick) + (embedded-ps ((ps-scm 'bezier-sandwich) l thick))) (define (start-line ht) @@ -245,7 +302,8 @@ ) (define (stop-line) "}\\vss}\\interscoreline") - + (define (stop-last-line) + "}\\vss}") (define (filledbox breapth width depth height) (string-append "\\kern" (number->dim (- breapth)) @@ -253,16 +311,14 @@ "depth " (number->dim depth) "height " (number->dim height) " ")) - - (define (text s) (string-append "\\hbox{" (output-tex-string s) "}")) - (define (tuplet dx dy thick dir) - (embedded-ps ((ps-scm 'tuplet) dx dy thick dir))) + (define (tuplet ht gapx dx dy thick dir) + (embedded-ps ((ps-scm 'tuplet) ht gapx dx dy thick dir))) - (define (volta w thick last) - (embedded-ps ((ps-scm 'volta) w thick last))) + (define (volta h w thick vert_start vert_end) + (embedded-ps ((ps-scm 'volta) h w thick vert_start vert_end))) ;; TeX ;; The procedures listed below form the public interface of TeX-scm. @@ -281,7 +337,6 @@ (define filledbox ,filledbox) (define font-def ,font-def) (define font-switch ,font-switch) - (define generalmeter ,generalmeter) (define header-end ,header-end) (define lily-def ,lily-def) (define header ,header) @@ -289,10 +344,10 @@ (define invoke-dim1 ,invoke-dim1) (define pianobrace ,pianobrace) (define placebox ,placebox) - (define rulesym ,rulesym) (define select-font ,select-font) (define start-line ,start-line) (define stop-line ,stop-line) + (define stop-last-line ,stop-last-line) (define text ,text) (define tuplet ,tuplet) (define volta ,volta) @@ -308,18 +363,17 @@ ((eq? action-name 'experimental-on) experimental-on) ((eq? action-name 'font-def) font-def) ((eq? action-name 'font-switch) font-switch) - ((eq? action-name 'generalmeter) generalmeter) ((eq? action-name 'header-end) header-end) ((eq? action-name 'lily-def) lily-def) ((eq? action-name 'header) header) ((eq? action-name 'invoke-char) invoke-char) ((eq? action-name 'invoke-dim1) invoke-dim1) ((eq? action-name 'placebox) placebox) - ((eq? action-name 'rulesym) rulesym) ((eq? action-name 'bezier-sandwich) bezier-sandwich) ((eq? action-name 'start-line) start-line) ((eq? action-name 'stem) stem) ((eq? action-name 'stop-line) stop-line) + ((eq? action-name 'stop-last-line) stop-last-line) ((eq? action-name 'volta) volta) (else (error "unknown tag -- PS-TEX " action-name)) ) @@ -343,8 +397,19 @@ (string-append "lilyfont" (make-string 1 (integer->char (+ 65 i))))) - - (define (select-font font-name) + + (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 magnification) (if (not (equal? font-name current-font)) (begin (set! current-font font-name) @@ -355,8 +420,9 @@ (set! font-alist (acons font-name font-cmd font-alist)) (set! font-count (+ 1 font-count)) (string-append "\n/" font-cmd " {/" - font-name - " findfont 12 scalefont setfont} bind def \n" + font-name " findfont " + (mag-to-size magnification) + " scalefont setfont} bind def \n" font-cmd " \n")) (string-append (cdr font-cmd) " "))) ; font-name == current-font no switch needed @@ -365,32 +431,35 @@ (define (beam width slope thick) (string-append - (numbers->string (list width slope thick)) " draw_beam " )) + (numbers->string (list width slope thick)) " draw_beam" )) (define (bracket h) - (invoke-dim1 "draw_bracket" h)) + (invoke-dim1 " draw_bracket" h)) (define (char i) - (invoke-char "show" i)) + (invoke-char " show" i)) - (define (crescendo w h cont) + (define (crescendo thick w h cont ) (string-append - (numbers->string (list w h (inexact->exact cont))) - "draw_crescendo")) + (numbers->string (list w h (inexact->exact cont) thick)) + " draw_crescendo")) (define (dashed-slur thick dash l) (string-append (apply string-append (map control->string l)) (number->string thick) " [ " - (if (> 1 dash) (number->string (- (* thick dash) thick)) "0") " " + (if (> 1 dash) + (number->string (- (* thick dash) thick)) + "0") + " " (number->string (* 2 thick)) " ] 0 draw_dashed_slur")) - (define (decrescendo w h cont) + (define (decrescendo thick w h cont) (string-append - (numbers->string (list w h (inexact->exact cont))) - "draw_decrescendo")) + (numbers->string (list w h (inexact->exact cont) thick)) + " draw_decrescendo")) (define (end-output) @@ -400,7 +469,7 @@ (define (filledbox breapth width depth height) (string-append (numbers->string (list breapth width depth height)) - "draw_stem" )) + " draw_box" )) ;; obsolete? (define (font-def i s) @@ -412,13 +481,21 @@ (define (font-switch i) (string-append (font i) " ")) - (define (generalmeter num den) - (string-append (number->string (inexact->exact num)) " " (number->string (inexact->exact den)) " generalmeter ")) - - (define (header-end) "") - (define (lily-def key val) + (define (header-end) (string-append - "/" key " {" val "} bind def\n")) + (ly-gulp-file "lilyponddefs.ps") + " {exch pop //systemdict /run get exec} " + (ly-gulp-file "lily.ps") + "{ exch pop //systemdict /run get exec } " + )) + + (define (lily-def key val) + + (if (string=? (substring key 0 (min (string-length "mudelapaper") (string-length key))) "mudelapaper") + (string-append "/" key " {" val "} bind def\n") + (string-append "/" key " (" val ") def\n") + ) + ) (define (header creator generate) (string-append @@ -436,29 +513,33 @@ (define (placebox x y s) (string-append (number->string x) " " (number->string y) " {" s "} placebox ")) - (define (pianobrace y) - "" + + (define (pianobrace y staffht) + (let* ((step 1.0) + (minht (* 2 staffht)) + (maxht (* 7 minht)) + ) + (string-append + (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))) 0) + (char (max 0 (/ (- (min y (- maxht step)) minht) step)))) + ) ) - (define (rulesym x y) - (string-append - (number->string x) " " - (number->string y) " " - "rulesym")) - (define (bezier-sandwich l) + (define (bezier-sandwich l thick) (string-append - (apply string-append (map control->string l)) + (apply string-append (map control->string l)) + (number->string thick) " draw_bezier_sandwich")) - (define (start-line) + (define (start-line height) (begin (clear-fontcache) "\nstart_line {\n")) (define (stem breapth width depth height) (string-append (numbers->string (list breapth width depth height)) - "draw_stem" )) + " draw_box" )) (define (stop-line) "}\nstop_line\n") @@ -467,15 +548,15 @@ (string-append "(" s ") show ")) - (define (volta w thick last) + (define (volta h w thick vert_start vert_end) (string-append - (numbers->string (list w thick (inexact->exact last))) - "draw_volta")) + (numbers->string (list h w thick (inexact->exact vert_start) (inexact->exact vert_end))) + " draw_volta")) - (define (tuplet dx dy thick dir) + (define (tuplet ht gap dx dy thick dir) (string-append - (numbers->string (list dx dy thick (inexact->exact dir))) - "draw_tuplet")) + (numbers->string (list ht gap dx dy thick (inexact->exact dir))) + " draw_tuplet")) (define (unknown) @@ -499,7 +580,6 @@ (define filledbox ,filledbox) (define font-def ,font-def) (define font-switch ,font-switch) - (define generalmeter ,generalmeter) (define pianobrace ,pianobrace) (define header-end ,header-end) (define lily-def ,lily-def) @@ -507,11 +587,11 @@ (define invoke-char ,invoke-char) (define invoke-dim1 ,invoke-dim1) (define placebox ,placebox) - (define rulesym ,rulesym) (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) )) ((eq? action-name 'tuplet) tuplet) @@ -553,3 +633,34 @@ ((null? alist) #t) (set! ret-ls (cons (fn (car (car alist)) (cdr (car alist))) ret-ls))))) + +;;;; print a SCM expression. Isn't this part of the std lib? + +(define (scmlist->string exp) + (cond + ((pair? (cdr exp)) (string-append (scm->string (car exp)) " " (scmlist->string (cdr exp)))) + ((eq? '() (cdr exp)) (string-append (scm->string (car exp)) ")")) + (else (string-append (scm->string (car exp)) " . " (scm->string (cdr exp)) ")")) + )) + +(define (scm->string exp) + (cond + ((pair? exp) (string-append "(" (scmlist->string exp))) + ((number? exp) (number->string exp)) + ((symbol? exp) (symbol->string exp)) + ((string? exp) (string-append "\"" exp "\"")) + )) + +(define (test-scm->string) +(list (scmlist->string '(a)) +(scmlist->string '(a b)) +(scmlist->string '(a b . c)) + + +(scm->string '(a)) +(scm->string '(a b )) +(scm->string '(a b . c)) +(scm->string '(a b (c . d))) +(scm->string '(a "bla" (c . 1.5))) +) +)