summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Puttock <n.puttock@gmail.com>2011-07-21 18:41:49 +0100
committerNeil Puttock <n.puttock@gmail.com>2011-07-21 18:41:49 +0100
commit14632519690052980d19fc75e4dbc759c480aac2 (patch)
treef056d10e715347bd2d7c008f23bd6f3c7d0fffc9
parentfda5ce3457daa5326985d032b9b8bf191cf6e129 (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.ly9
-rw-r--r--ly/festival.ly17
-rw-r--r--scm/song.scm39
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)))