X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily.scm;h=ded3b1ff301edabb4406e3e07b041b2dd2581ab9;hb=4b54303fe9248242e8e74804c394e45570df23db;hp=d18cdbf12f6287ee7f000abd281afeaec4a66746;hpb=bb36bac02a64770871780231ecc709cb18b20932;p=lilypond.git diff --git a/scm/lily.scm b/scm/lily.scm index d18cdbf12f..ded3b1ff30 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -5,21 +5,29 @@ ; (c) 1998 Jan Nieuwenhuizen +; +; This file contains various routines in Scheme that are easier to +; do here than in C++. At present it is an unorganised mess. Sorry. +; + + ;(debug-enable 'backtrace) ;;; library funtions (use-modules (ice-9 regex)) -;; do nothing in .scm output -(define (comment s) - "" - ) +;; The regex module may not be available, or may be broken. +;; If you have trouble with regex, define #f +;;(define use-regex #t) +;;(define use-regex #f) -(define - (xnumbers->string l) - (string-append - (map (lambda (n) (string-append (number->string n ) " ")) l))) +(define use-regex + (let ((os (string-downcase (vector-ref (uname) 0)))) + (not (equal? "cygwin" (substring os 0 (min 6 (string-length os))))))) + +;; do nothing in .scm output +(define (comment s) "") (define (mm-to-pt x) (* (/ 72.27 25.40) x) @@ -35,13 +43,10 @@ ) -(define (glue-2-strings a b) (string-append a " " b)) - -(define - (numbers->string l) - (reduce glue-2-strings (map number->string l))) +(define (numbers->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)) @@ -57,11 +62,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) @@ -79,21 +82,15 @@ ;; 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) +(define (begin-of-line-visible d) (if (= d 1) '(#f . #f) '(#t . #t))) +(define (spanbar-begin-of-line-invisible d) (if (= d -1) '(#t . #t) '(#f . #f))) +(define (all-visible d) '(#f . #f)) +(define (all-invisible d) '(#t . #t)) +(define (begin-of-line-invisible d) (if (= d 1) '(#t . #t) '(#f . #f))) +(define (end-of-line-invisible d) (if (= d -1) '(#t . #t) '(#f . #f))) + + +(define mark-visibility end-of-line-invisible) ;; Spacing constants for prefatory matter. ;; @@ -101,47 +98,54 @@ ;; ;; -;; (Measured in interlines? -- jcn) +;; (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)) + ((none Instrument_name) . (extra-space 1.0)) + ((Instrument_name Left_edge_item) . (extra-space 1.0)) + ((Left_edge_item Clef_item) . (extra-space 1.0)) + ((Left_edge_item Key_item) . (extra-space 0.0)) + ((Left_edge_item begin-of-note) . (extra-space 1.0)) + ((none Left_edge_item) . (extra-space 0.0)) + ((Left_edge_item Staff_bar) . (extra-space 0.0)) +; ((none Left_edge_item) . (extra-space -15.0)) +; ((none Left_edge_item) . (extra-space -15.0)) + ((none Clef_item) . (minimum-space 1.0)) + ((none Staff_bar) . (minimum-space 0.0)) + ((none Clef_item) . (minimum-space 1.0)) + ((none Key_item) . (minimum-space 0.5)) + ((none Time_signature) . (extra-space 0.0)) + ((none 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)) + ((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)) + ((none 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))))) - + +(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 @@ -150,18 +154,22 @@ ;; 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") + ("msam" . "msam") ("roman" . "cmr") ("script" . "cmr") ("large" . "cmbx") ("Large" . "cmbx") ("mark" . "feta-nummer") + ("finger" . "feta-nummer") + ("timesig" . "feta-nummer") ("number" . "feta-nummer") ("volta" . "feta-nummer")) ) @@ -193,17 +201,6 @@ ) (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 font-name-alist '()) (define (font-command name-mag) @@ -221,8 +218,22 @@ (map (lambda (x) (font-load-command (car x) (cdr x))) font-name-alist) )) - +(define (fontify name exp) + (string-append (select-font name) + exp) + ) + +;;;;;;;;;;;;;;;;;;;; + + +; Make a function that checks score element for being of a specific type. +(define (make-type-checker name) + (lambda (elt) + (not (not (memq name (ly-get-elt-property elt 'interfaces)))))) + + +;;;;;;;;;;;;;;;;;;; TeX output (define (tex-scm action-name) (define (unknown) "%\n\\unknown%\n") @@ -259,15 +270,12 @@ (define (char i) (string-append "\\char" (inexact->string i 10) " ")) + (define (dashed-line thick dash w) + (embedded-ps ((ps-scm 'dashed-line) thick dash w))) + (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 "=" @@ -276,7 +284,6 @@ (number->string (magstep (cdr name-mag))) "\n")) - (define (embedded-ps s) (string-append "\\embeddedps{" s "}")) @@ -284,7 +291,11 @@ (string-append "% " s)) (define (end-output) - "\n\\EndLilyPondOutput") + (begin + (display (gc-stats)) + (string-append "\n\\EndLilyPondOutput" + ; Put GC stats here. + ))) (define (experimental-on) "") @@ -300,16 +311,19 @@ (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")) (define (header creator generate) (string-append - "%created by: " creator generate)) + "%created by: " creator generate "\n")) (define (invoke-char s i) (string-append @@ -326,36 +340,36 @@ ;; (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) " pt ")) (define (placebox x y s) (string-append "\\placebox{" (number->dim y) "}{" (number->dim x) "}{" s "}\n")) - - (define (bezier-sandwich l thick) (embedded-ps ((ps-scm 'bezier-sandwich) l thick))) - (define (start-line ht) - (begin (string-append"\\vbox to " (number->dim ht) "{\\hbox{%\n")) - ) + (define (stop-line) "}\\vss}\\interscoreline") (define (stop-last-line) @@ -387,6 +401,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) @@ -413,6 +428,7 @@ ((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) @@ -439,7 +455,6 @@ ;;;;;;;;;;;; PS (define (ps-scm action-name) - ;; alist containing fontname -> fontcommand assoc (both strings) (define font-alist '()) (define font-count 0) @@ -509,18 +524,28 @@ (numbers->string (list w h (inexact->exact cont) thick)) " draw_crescendo")) + ;; what the heck is this interface ? (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") + (number->string dash) " " - (number->string (* 2 thick)) + (number->string (* 10 thick)) ;UGH. 10 ? " ] 0 draw_dashed_slur")) + (define (dashed-line thick dash width) + (string-append + (number->string width) + " " + (number->string thick) + " [ " + (number->string dash) + " " + (number->string dash) + " ] 0 draw_dashed_line")) + (define (decrescendo thick w h cont) (string-append (numbers->string (list w h (inexact->exact cont) thick)) @@ -548,6 +573,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") @@ -586,8 +612,7 @@ " draw_bezier_sandwich")) (define (start-line height) - (begin - "\nstart_line {\n")) + "\nstart_line {\n") (define (stem breapth width depth height) (string-append (numbers->string (list breapth width depth height)) @@ -625,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) @@ -652,6 +678,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) @@ -663,6 +690,206 @@ ) +(define (arg->string arg) + (cond ((number? arg) (inexact->string arg 10)) + ((string? arg) (string-append "\"" arg "\"")) + ((symbol? arg) (string-append "\"" (symbol->string arg) "\"")))) + +(define (func name . args) + (string-append + "(" name + (if (null? args) + "" + (apply string-append + (map (lambda (x) (string-append " " (arg->string x))) args))) + ")\n")) + +(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 + (or (equal? key "mudelapaperlinewidth") + (equal? key "mudelapaperstaffheight")) + (string-append "(define " key " " (arg->string val) ")\n") + "")) + + (define (placebox x y s) + (let ((ey (inexact->exact y))) + (string-append "(move-to " (number->string (inexact->exact x)) " " + (if (= 0.5 (- (abs y) (abs ey))) + (number->string y) + (number->string ey)) + ")\n" 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 + (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)) + ) + ) + + (define (gulp-file name) (let* ((port (open-file name "r")) (content (let loop ((text "")) @@ -674,10 +901,13 @@ (close port) content)) +;; 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) @@ -689,61 +919,13 @@ (define (scm-ps-output) (eval (ps-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))))) - - -;; guile-1.3.4 has list->string -(define (scmlist->string exp) - (list->string exp)) - -;; obsolete, maybe handy for testing -;; print a SCM expression. Isn't this part of the std lib? -(define (xxscmlist->string exp) - (cond - ((null? (car exp)) (begin (display ("urg:") (newline)))) - ((pair? (cdr exp)) (string-append (scm->string (car exp)) " " (scmlist->string (cdr exp)))) - ((eq? '() (cdr exp)) (string-append (scm->string (car exp)) ")")) - ;; howto check for quote? - (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 "\"")) - ;; probably: #@quote - (else (begin (display "programming error: scm->string: ") (newline) "'")) - )) - +(define (scm-as-output) + (eval (as-scm 'all-definitions))) + (define (index-cell cell dir) (if (equal? dir 1) (cdr cell) - (car cell)) - ) - + (car cell))) ; ; How should a bar line behave at a break? @@ -755,6 +937,7 @@ ("|s" . (nil . "|")) ("|:" . ("|" . "|:")) ("|." . ("|." . nil)) + (".|" . (nil . ".|")) (":|" . (":|" . nil)) ("||" . ("||" . nil)) (".|." . (".|." . nil)) @@ -771,3 +954,14 @@ ) +(define major-scale + '( + (0 . 0) + (1 . 0) + (2 . 0) + (3 . 0) + (4 . 0) + (5 . 0) + (6 . 0) + ) + )