lilypond-1.1.7
[lilypond.git] / init / lily.scm
blobe045426a26641b52d6c02ca385740e0ae3a04cc3
1 ; lily.scm -- implement Scheme output routines for TeX and PostScript
3 ;  source file of the GNU LilyPond music typesetter
4
5 ; (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
7 ; TODO
8 ;   - naming
9 ;   - ready ps code (draw_bracket) vs tex/ps macros/calls (pianobrace),
10 ;     all preparations from ps,tex to scm
12 ;;; library funtions
13 (define
14   (xnumbers->string l)
15   (string-append 
16    (map (lambda (n) (string-append (number->string n ) " ")) l)))
18 (define
19   (numbers->string l)
20   (apply string-append 
21   (map (lambda (n) (string-append (number->string n) " ")) l)))
23 (define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x))
25 (define (number->octal-string x)
26   (let* ((n (inexact->exact x))
27          (n64 (quotient n 64))
28          (n8 (quotient (- n (* n64 64)) 8)))
29         (string-append
30          (number->string n64)
31          (number->string n8)
32          (number->string (remainder (- n (+ (* n64 64) (* n8 8))) 8)))))
34 (define (inexact->string x radix)
35   (let ((n (inexact->exact x)))
36        (number->string n radix)))
39 (define
40   (control->string c)
41   (string-append
42     (string-append (number->string (car c)) " ")
43     (string-append (number->string (cadr c)) " ")))
45 ;;;;;;;; TeX
46 ; (define (tex action)
48 (define 
49   (beam-tex width slope thick)
50   (embedded-ps-tex (beam-ps width slope thick)))
52 (define 
53   (bracket-tex h)
54   (embedded-ps-tex (bracket-ps h)))
56 (define 
57   (dashed-slur-tex thick dash l)
58   (embedded-ps-tex (dashed-slur-ps thick dash l)))
60 (define 
61   (crescendo-tex w h cont)
62   (embedded-ps-tex (crescendo-ps w h cont)))
64 (define 
65   (decrescendo-tex w h cont)
66   (embedded-ps-tex (decrescendo-ps w h cont)))
68 (define 
69   (embedded-ps-tex s)
70   (string-append "\\embeddedps{" s "}"))
73 (define 
74   (end-output-tex) 
75   "\n\\EndLilyPondOutput")
77 (define 
78   (empty-tex) 
79   "%\n\\empty%\n")
81 (define
82   (experimental-on-tex) "\\turnOnExperimentalFeatures")
84 (define 
85   (extender o h)
86   ((invoke-output o "invoke-dim1") "extender" h))
88 (define 
89   (font-switch-tex i)
90   (string-append
91    "\\" (font i) "\n"))
93 (define 
94   (font-def-tex i s)
95   (string-append
96    "\\font" (font-switch-tex i) "=" s "\n"))
98 (define 
99   (generalmeter-tex num den)
100   (string-append 
101    "\\generalmeter{" (number->string (inexact->exact num)) "}{" (number->string (inexact->exact den)) "}"))
103 (define
104   (header-end-tex) "\\turnOnPostScript")
106 (define 
107   (header-tex creator generate) 
108   (string-append
109    "%created by: " creator generate "\n"))
111 (define 
112   (invoke-char-tex s i)
113   (string-append 
114    "\n\\" s "{" (inexact->string i 10) "}" ))
116 (define 
117   (invoke-dim1-tex s d)
118   (string-append
119    "\n\\" s "{" (number->dim-tex d) "}"))
121 (define
122   (lily-def-tex key val)
123   (string-append
124    "\\def\\" key "{" val "}\n"))
126 (define 
127   (number->dim-tex x)
128   (string-append 
129    (number->string (chop-decimal x)) "pt "))
131 (define 
132   (placebox-tex x y s) 
133   (string-append 
134    "\\placebox{"
135    (number->dim-tex y) "}{" (number->dim-tex x) "}{" s "}"))
137 (define 
138   (rulesym-tex h w) 
139   (string-append 
140    "\\vrule height " (number->dim-tex (/ h 2))
141    " depth " (number->dim-tex (/ h 2))
142    " width " (number->dim-tex w)
143    )
144   )
146 (define 
147   (slur-tex l)
148   (embedded-ps-tex (slur-ps l)))
150 (define 
151   (start-line-tex) 
152   (string-append 
153    "\\hbox{%\n")
154   )
156 (define 
157   (stem-tex kern width height depth) 
158   (string-append 
159    "\\kern" (number->dim-tex kern)
160    "\\vrule width " (number->dim-tex width)
161    "depth " (number->dim-tex depth)
162    "height " (number->dim-tex height) " "))
164 (define 
165   (stop-line-tex) 
166   "}\\interscoreline")
168 (define
169   (text-tex f s)
170   (string-append "\\set" f "{" s "}"))
174 ;;;;;;;;;;;; PS
176 (define 
177   (beam-ps width slope thick)
178   (string-append
179    (numbers->string (list width slope thick)) " draw_beam " ))
181 (define 
182   (bracket-ps h)
183   (invoke-dim1-ps "draw_bracket" h))
185 (define 
186   (crescendo-ps w h cont)
187   (string-append 
188    (numbers->string (list w h (inexact->exact cont)))
189    "draw_crescendo"))
191 (define 
192   (dashed-slur-ps thick dash l)
193   (string-append 
194     (apply string-append (map control->string l)) 
195     (number->string thick) 
196    " [ "
197    (if (> 1 dash) (number->string (- (* thick dash) thick)) "0") " "
198    (number->string (* 2 thick))
199    " ] 0 draw_dashed_slur"))
201 (define 
202   (decrescendo-ps w h cont)
203   (string-append 
204    (numbers->string (list w h (inexact->exact cont)))
205    "draw_decrescendo"))
207 (define 
208   (empty-ps) 
209   "\n empty\n")
211 (define 
212   (end-output-ps)
213   "\nshowpage\n")
215 (define
216   (experimental-on-ps) "")
218 (define 
219   (font-def-ps i s)
220   (string-append
221    "\n/" (font i) " {/" 
222    (substring s 0 (- (string-length s) 4))
223    " findfont 12 scalefont setfont} bind def\n"))
225 (define 
226   (font-switch-ps i)
227   (string-append (font i) " "))
229 (define 
230   (generalmeter-ps num den)
231   (string-append (number->string (inexact->exact num)) " " (number->string (inexact->exact den)) " generalmeter "))
233 (define
234   (header-end-ps) "")
235 (define
236   (lily-def-ps key val)
237   (string-append
238    "/" key " {" val "} bind def\n"))
240 (define 
241   (header-ps creator generate) 
242   (string-append
243    "%!PS-Adobe-3.0\n"
244    "%%Creator: " creator generate "\n"))
246 (define 
247   (invoke-char-ps s i)
248   (string-append 
249    "(\\" (inexact->string i 8) ") " s " " ))
251 (define 
252   (invoke-dim1-ps s d) 
253   (string-append
254    (number->string d) " " s ))
256 (define 
257   (placebox-ps x y s) 
258   (string-append 
259    (number->string x) " " (number->string y) " {" s "} placebox "))
261 (define 
262   (rulesym-ps x y) 
263   (string-append 
264    (number->string x) " "
265    (number->string y) " "
266    "rulesym"))
268 (define 
269   (slur-ps l)
270   (string-append 
271    (apply string-append (map control->string l)) 
272    " draw_slur"))
274 (define 
275   (start-line-ps) 
276    "\nstart_line {\n")
278 (define 
279   (stem-ps kern width height depth) 
280   (string-append (numbers->string (list kern width height depth))
281                  "draw_stem" ))
283 (define 
284   (stop-line-ps) 
285   "}\nstop_line\n")
287 (define
288   (text-ps f s)
289   (string-append "(" s ") set" f " "))
292 ;;; output definitions
294 (define 
295   (beam o width slope thick) 
296   ((invoke-output o "beam") width slope thick))
298 (define 
299   (bracket o h)
300   ((invoke-output o "bracket") h))
302 (define 
303   (char o n) 
304   ((invoke-output o "invoke-char") "show" n))
306 (define 
307   (crescendo o w h cont)
308   ((invoke-output o "crescendo") w h cont))
310 (define 
311   (dashed-slur o thick dash l) 
312   ((invoke-output o "dashed-slur") thick dash l))
314 (define 
315   (decrescendo o w h cont)
316   ((invoke-output o "decrescendo") w h cont))
318 (define 
319   (doublebar o h)
320   ((invoke-output o "invoke-dim1") "doublebar" h))
322 (define 
323   (empty o) 
324   ((invoke-output o "empty")))
326 (define 
327   (emptybar o h) (empty o))
329 (define 
330   (end-output o) 
331   ((invoke-output o "end-output")))
333 (define 
334   (experimental-on o) 
335   ((invoke-output o "experimental-on")))
337 (define
338   (fatdoublebar o h)
339   ((invoke-output o "invoke-dim1") "fatdoublebar" h))
341 (define
342   (finishbar o h)
343   ((invoke-output o "invoke-dim1") "finishbar" h))
345 (define
346   (font i)
347   (string-append
348    "font"
349    (make-string 1 (integer->char (+ (char->integer #\A) i)))
350    ))
352 (define 
353   (font-def o i s) 
354   ((invoke-output o "font-def") i s))
356 (define 
357   (font-switch o i) 
358   ((invoke-output o "font-switch") i))
360 (define 
361   (generalmeter o num den)
362    ((invoke-output o "generalmeter") num den))
364 (define 
365   (header o creator generate) 
366   ((invoke-output o "header") creator generate))
368 (define 
369   (header-end o) 
370   ((invoke-output o "header-end")))
372 (define
373   (invoke-output o s)
374    (eval-string (string-append s "-" o)))
376 (define
377   (lily-def o key val)
378   ((invoke-output o "lily-def") key val))
380 (define 
381   (maatstreep o h) 
382   ((invoke-output o "invoke-dim1") "maatstreep" h))
384 (define 
385   (pianobrace o i)
386   ((invoke-output o "invoke-char") "pianobrace" i))
388 (define 
389   (placebox o x y b) 
390   ((invoke-output o "placebox") x y (b o)))
392 (define
393   (repeatbar o h)
394   ((invoke-output o "invoke-dim1") "repeatbar" h))
396 (define
397   (repeatbarstartrepeat o h)
398   ((invoke-output o "invoke-dim1") "repeatbarstartrepeat" h))
400 (define 
401   (rulesym o x y) 
402   ((invoke-output o "rulesym") x y))
404 (define 
405   (setbold o s) 
406   ((invoke-output o "text") "bold" s))
408 (define
409   (setdynamic o s) (empty o))
411 (define 
412   (setfinger o s) 
413   ((invoke-output o "text") "finger" s))
415 (define 
416   (sethuge o s) 
417   ((invoke-output o "text") "huge" s))
419 (define 
420   (setitalic o s) 
421   ((invoke-output o "text") "italic" s))
423 (define 
424   (setlarge o s) 
425   ((invoke-output o "text") "large" s))
427 (define 
428   (setLarge o s) 
429   ((invoke-output o "text") "Large" s))
431 (define 
432   (setnumber o s) 
433   ((invoke-output o "text") "number" s))
435 (define 
436   (settext o s) 
437   ((invoke-output o "text") "text" s))
439 (define 
440   (settypewriter o s) 
441   ((invoke-output o "text") "typewriter" s))
443 (define 
444   (slur o l) 
445   ((invoke-output o "slur") l))
447 (define 
448   (tuplet o dx dy dir)
449   ((invoke-output o "tuplet") dx dy dir))
451 (define 
452   (tuplet-ps dx dy dir)
453   (string-append 
454    (numbers->string (list dx dy (inexact->exact dir)))
455    "draw_tuplet"))
457 (define 
458   (tuplet-tex dx dy dir)
459   (embedded-ps-tex (tuplet-ps dx dy dir)))
461 (define 
462   (stem o kern width height depth) 
463   ((invoke-output o "stem") kern width height depth))
467 (define 
468   (start-line o) 
469   ((invoke-output o "start-line")))
471 (define
472   (startbar o h)
473   ((invoke-output o "invoke-dim1") "startbar" h))
475 (define
476   (startrepeat o h)
477   ((invoke-output o "invoke-dim1") "startrepeat" h))
480 (define 
481   (stop-line o) 
482   ((invoke-output o "stop-line")))
485 (define
486   (stoprepeat o h)
487   ((invoke-output o "invoke-dim1") "stoprepeat" h))