From: David Kastrup Date: Thu, 1 Dec 2011 19:27:06 +0000 (+0100) Subject: Give \displayLilyMusic and \displayMusic optional port arguments. X-Git-Tag: release/2.15.22-1~33 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a9829dd9576b665961c395cc501f004ddd3b858d;p=lilypond.git Give \displayLilyMusic and \displayMusic optional port arguments. --- diff --git a/Documentation/extending/scheme-tutorial.itely b/Documentation/extending/scheme-tutorial.itely index ef6c435e49..7951cbe790 100644 --- a/Documentation/extending/scheme-tutorial.itely +++ b/Documentation/extending/scheme-tutorial.itely @@ -1039,23 +1039,30 @@ will display By default, LilyPond will print these messages to the console along with all the other messages. To split up these messages and save -the results of @code{\display@{STUFF@}}, redirect the output to -a file. +the results of @code{\display@{STUFF@}}, you can specify an optional +output port to use: @example -lilypond file.ly >display.txt +@{ + \displayMusic #(open-output-file "display.txt") @{ c'4\f @} +@} @end example -With a combined bit of Lilypond and Scheme magick, you can actually -let Lilypond direct just this output to a file of its own: - +This will overwrite a previous output file whenever it is called; if you +need to write more than one expression, you would use a variable for +your port and reuse it: @example @{ - $(with-output-to-file "display.txt" - (lambda () #@{ \displayMusic @{ c'4\f @} #@})) + port = #(open-output-file "display.txt") + \displayMusic \port @{ c'4\f @} + \displayMusic \port @{ d'4 @} + #(close-output-port port) @} @end example +Guile's manual describes ports in detail. Closing the port is actually +only necessary if you need to read the file before Lilypond finishes; in +the first example, we did not bother to do so. A bit of reformatting makes the above information easier to read: diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 038f2ef6ac..90cae893c6 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -273,18 +273,23 @@ in a CueVoice oriented by @var{dir}.") displayLilyMusic = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (parser location port music) ((port?) ly:music?) (_i "Display the LilyPond input representation of @var{music} -to the console.") - (newline) - (display-lily-music music parser) +to @var{port}, defaulting to the console.") + (if (not port) + (set! port (current-output-port))) + (newline port) + (display-lily-music music parser port) music) displayMusic = -#(define-music-function (parser location music) (ly:music?) - (_i "Display the internal representation of @var{music} to the console.") - (newline) - (display-scheme-music music) +#(define-music-function (parser location port music) ((port?) ly:music?) + (_i "Display the internal representation of @var{music} to +@var{port}, default to the console.") + (if (not port) + (set! port (current-output-port))) + (newline port) + (display-scheme-music music port) music) diff --git a/scm/music-functions.scm b/scm/music-functions.scm index 250defcdd2..6beff26744 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -98,24 +98,23 @@ First it recurses over the children, then the function is applied to music (make-music 'Music))) ;must return music. -(define-public (display-music music) +(define*-public (display-music music #:optional (port (current-output-port))) "Display music, not done with @code{music-map} for clarity of presentation." - - (display music) - (display ": { ") + (display music port) + (display ": { " port) (let ((es (ly:music-property music 'elements)) (e (ly:music-property music 'element))) - (display (ly:music-mutable-properties music)) + (display (ly:music-mutable-properties music) port) (if (pair? es) - (begin (display "\nElements: {\n") - (map display-music es) - (display "}\n"))) + (begin (display "\nElements: {\n" port) + (for-each (lambda (m) (display-music m port)) es) + (display "}\n" port))) (if (ly:music? e) (begin - (display "\nChild:") - (display-music e)))) - (display " }\n") + (display "\nChild:" port) + (display-music e port)))) + (display " }\n" port) music) ;;; @@ -211,7 +210,7 @@ which often can be read back in order to generate an equivalent expression. Returns `obj'. " (pretty-print (music->make-music obj) port) - (newline) + (newline port) obj) ;;; @@ -220,14 +219,15 @@ Returns `obj'. (use-modules (srfi srfi-39) (scm display-lily)) -(define*-public (display-lily-music expr parser #:key force-duration) +(define*-public (display-lily-music expr parser #:optional (port (current-output-port)) + #:key force-duration) "Display the music expression using LilyPond syntax" (memoize-clef-names supported-clefs) (parameterize ((*indent* 0) (*previous-duration* (ly:make-duration 2)) (*force-duration* force-duration)) - (display (music->lily-string expr parser)) - (newline))) + (display (music->lily-string expr parser) port) + (newline port))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;