diff options
author | Neil Puttock <n.puttock@gmail.com> | 2011-07-21 18:41:49 +0100 |
---|---|---|
committer | Neil Puttock <n.puttock@gmail.com> | 2011-07-21 18:41:49 +0100 |
commit | 14632519690052980d19fc75e4dbc759c480aac2 (patch) | |
tree | f056d10e715347bd2d7c008f23bd6f3c7d0fffc9 | |
parent | fda5ce3457daa5326985d032b9b8bf191cf6e129 (diff) |
Fix #1507: Inconsistent \festival output.
* input/regression/song-skip-noword.ly
reset *skip-word* to default at end of file to prevent override leaking
into other regression tests
* ly/festival.ly (festivalsyl):
use paramaterize to set *syllabify* and limit its scope locally to the
music function's body
* scm/song.scm:
make global configuration variables srfi-39 paramaters
-rw-r--r-- | input/regression/song-skip-noword.ly | 9 | ||||
-rw-r--r-- | ly/festival.ly | 17 | ||||
-rw-r--r-- | scm/song.scm | 39 |
3 files changed, 35 insertions, 30 deletions
diff --git a/input/regression/song-skip-noword.ly b/input/regression/song-skip-noword.ly index b683410d5f..267e20588f 100644 --- a/input/regression/song-skip-noword.ly +++ b/input/regression/song-skip-noword.ly @@ -1,17 +1,20 @@ \version "2.14.0" \header { - texidoc="Festival song synthesis output supports + texidoc = "Festival song synthesis output supports lyrics which are not complete words. " } \include "festival.ly" -#(set! *skip-word* #f) +#(*skip-word* #f) \festival #"song-skip-noword.xml" { \tempo 4 = 100 } -\relative c' { c c g' } +\relative c' { c4 c g' } \addlyrics { twin -- \skip 4 kle } + #(ly:progress "song-skip-noword") #(ly:progress "~a" (ly:gulp-file "song-skip-noword.xml")) + +#(*skip-word* "-skip-") diff --git a/ly/festival.ly b/ly/festival.ly index cbe88d67c8..1c60b019cf 100644 --- a/ly/festival.ly +++ b/ly/festival.ly @@ -20,16 +20,19 @@ \version "2.14.0" #(use-modules (scm song)) +#(use-modules (srfi srfi-39)) % \festival #"filename" { \tempo N = X } { music } festival = -#(define-music-function (parser location filename tempo music) (string? ly:music? ly:music?) - (output-file music tempo filename) - music) +#(define-music-function (parser location filename tempo music) + (string? ly:music? ly:music?) + (output-file music tempo filename) + music) % \festivalsyl #"filename" { \tempo N = X } { music } festivalsyl = -#(define-music-function (parser location filename tempo music) (string? ly:music? ly:music?) - (set! *syllabify* #t) - (output-file music tempo filename) - music) +#(define-music-function (parser location filename tempo music) + (string? ly:music? ly:music?) + (parameterize ((*syllabify* #t)) + (output-file music tempo filename)) + music) diff --git a/scm/song.scm b/scm/song.scm index 9dbca9fd62..9655e321e4 100644 --- a/scm/song.scm +++ b/scm/song.scm @@ -19,14 +19,13 @@ ;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>. -(define-module (scm song)) - -(use-modules (srfi srfi-1)) -(use-modules (ice-9 optargs)) -(use-modules (ice-9 receive)) - -(use-modules (lily)) -(use-modules (scm song-util)) +(define-module (scm song) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-39) + #:use-module (ice-9 optargs) + #:use-module (ice-9 receive) + #:use-module (lily) + #:use-module (scm song-util)) ;;; Configuration @@ -34,23 +33,23 @@ ;; The word to be sung in places where notes are played without lyrics. ;; If it is #f, the places without lyrics are omitted on the output. -(define-public *skip-word* "-skip-") +(define-public *skip-word* (make-parameter "-skip-")) ;; If true, use syllables in the Festival XML file. ;; If false, use whole words instead; this is necessary in languages like ;; English, were the phonetic form cannot be deduced from syllables well enough. -(define-public *syllabify* #f) +(define-public *syllabify* (make-parameter #f)) ;; Base Festival octave to which LilyPond notes are mapped. -(define-public *base-octave* 5) +(define-public *base-octave* (make-parameter 5)) ;; The resulting base octave is sum of *base-octave* and ;; *base-octave-shift*. This is done to work around a Festival bug ;; causing Festival to segfault or produce invalid pitch on higher pitches. ;(define *base-octave-shift* -2) -(define *base-octave-shift* 0) +(define *base-octave-shift* (make-parameter 0)) ;; The coeficient by which the notes just before \breath are shortened. -(define-public *breathe-shortage* 0.8) +(define-public *breathe-shortage* (make-parameter 0.8)) ;;; LilyPond interface @@ -162,7 +161,7 @@ (set! *default-tempo* (property-value (find-child tempo-spec (lambda (elt) (music-property? elt 'tempoWholesPerMinute))))) - (round (* tempo (expt 2 (+ 2 *base-octave-shift*))))))) + (round (* tempo (expt 2 (+ 2 (*base-octave-shift*)))))))) (defstruct music-context music @@ -220,7 +219,7 @@ (push! (make-lyrics #:text (ly:music-property lyric-event 'text) #:duration (* (duration->number (ly:music-property lyric-event 'duration)) 4) - #:unfinished (and (not *syllabify*) (find-child-named music 'HyphenEvent)) + #:unfinished (and (not (*syllabify*)) (find-child-named music 'HyphenEvent)) #:ignore-melismata ignore-melismata #:context current-voice) lyrics-list)) @@ -393,9 +392,9 @@ ((music-name? music 'BreathingEvent) (if last-note-spec (let* ((note-duration (note-duration last-note-spec)) - (rest-spec (make-rest #:duration (* note-duration (- 1 *breathe-shortage*)) + (rest-spec (make-rest #:duration (* note-duration (- 1 (*breathe-shortage*))) #:origin (ly:music-property music 'origin)))) - (set-note-duration! last-note-spec (* note-duration *breathe-shortage*)) + (set-note-duration! last-note-spec (* note-duration (*breathe-shortage*))) (add! (make-score-notes #:note/rest-list (list rest-spec)) result-list)) (warning music "\\\\breathe without previous note known"))) ;; anything else @@ -603,7 +602,7 @@ last-verse (append (verse-notelist/rests last-verse) (list notelist/rest)))))) ((pair? notelist/rest) - (add! (make-verse #:text *skip-word* #:notelist/rests (list notelist/rest)) + (add! (make-verse #:text (*skip-word*) #:notelist/rests (list notelist/rest)) verse-list)) (else (error "Unreachable branch reached"))) @@ -662,7 +661,7 @@ ((< duration (- epsilon)) (warning (if (null? note-list) (safe-last consumed) (safe-car note-list)) "Skip misalignment: ~a ~a ~a ~a" context skip duration consumed))) - (values (if *skip-word* + (values (if (*skip-word*) consumed '()) note-list))) @@ -784,7 +783,7 @@ (octave (inexact->exact (floor (/ semitones 12)))) (tone (modulo semitones 12))) (format #f "~a~a" (car (assoc-get tone festival-note-mapping)) - (+ octave *base-octave* *base-octave-shift*)))) + (+ octave (*base-octave*) (*base-octave-shift*))))) (define (write-header port tempo) (let ((beats (or (tempo->beats tempo) 100))) |