\version "2.15.13" #(set-default-paper-size "a4") #(set-global-staff-size 22) % Fonctions Scheme adaptées à partir du travail de Nicolas Sceaux #(define-markup-command (when-property layout props symbol markp) (symbol? markup?) (if (chain-assoc-get symbol props) (interpret-markup layout props markp) (ly:make-stencil '() '(1 . -1) '(1 . -1)))) #(define-markup-command (line-width-ratio layout props width-ratio arg) (number? markup?) (interpret-markup layout props (markup #:override (cons 'line-width (* width-ratio (chain-assoc-get 'line-width props))) arg))) %%% Guile does not deal with accented letters #(use-modules (ice-9 regex)) %%;; actually defined below, in a closure #(define-public string-upper-case #f) #(define accented-char-upper-case? #f) #(define accented-char-lower-case? #f) %%;; an accented character is seen as two characters by guile #(let ((lower-case-accented-string "éèêëáàâäíìîïóòôöúùûüçœæ") (upper-case-accented-string "ÉÈÊËÁÀÂÄÍÌÎÏÓÒÔÖÚÙÛÜÇŒÆ")) (define (group-by-2 chars result) (if (or (null? chars) (null? (cdr chars))) (reverse! result) (group-by-2 (cddr chars) (cons (string (car chars) (cadr chars)) result)))) (let ((lower-case-accented-chars (group-by-2 (string->list lower-case-accented-string) (list))) (upper-case-accented-chars (group-by-2 (string->list upper-case-accented-string) (list)))) (set! string-upper-case (lambda (str) (define (replace-chars str froms tos) (if (null? froms) str (replace-chars (regexp-substitute/global #f (car froms) str 'pre (car tos) 'post) (cdr froms) (cdr tos)))) (string-upcase (replace-chars str lower-case-accented-chars upper-case-accented-chars)))) (set! accented-char-upper-case? (lambda (char1 char2) (member (string char1 char2) upper-case-accented-chars string=?))) (set! accented-char-lower-case? (lambda (char1 char2) (member (string char1 char2) lower-case-accented-chars string=?))))) #(define-markup-command (smallCaps layout props text) (markup?) "Turn @code{text}, which should be a string, to small caps. @example \\markup \\small-caps \"Text between double quotes\" @end example" (define (string-list->markup strings lower) (let ((final-string (string-upper-case (apply string-append (reverse strings))))) (if lower (markup #:fontsize -2 final-string) final-string))) (define (make-small-caps rest-chars currents current-is-lower prev-result) (if (null? rest-chars) (make-concat-markup (reverse! (cons (string-list->markup currents current-is-lower) prev-result))) (let* ((ch1 (car rest-chars)) (ch2 (and (not (null? (cdr rest-chars))) (cadr rest-chars))) (this-char-string (string ch1)) (is-lower (char-lower-case? ch1)) (next-rest-chars (cdr rest-chars))) (cond ((and ch2 (accented-char-lower-case? ch1 ch2)) (set! this-char-string (string ch1 ch2)) (set! is-lower #t) (set! next-rest-chars (cddr rest-chars))) ((and ch2 (accented-char-upper-case? ch1 ch2)) (set! this-char-string (string ch1 ch2)) (set! is-lower #f) (set! next-rest-chars (cddr rest-chars)))) (if (or (and current-is-lower is-lower) (and (not current-is-lower) (not is-lower))) (make-small-caps next-rest-chars (cons this-char-string currents) is-lower prev-result) (make-small-caps next-rest-chars (list this-char-string) is-lower (if (null? currents) prev-result (cons (string-list->markup currents current-is-lower) prev-result))))))) (interpret-markup layout props (if (string? text) (make-small-caps (string->list text) (list) #f (list)) text))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Markup commands for page headers %%% #(define-public add-odd-page-header-text #f) #(define-public add-even-page-header-text #f) #(define header-markup-aux #f) #(let ((odd-label-header-table (list)) (odd-page-header-table (list)) (even-label-header-table (list)) (even-page-header-table (list))) (set! header-markup-aux (lambda (layout props odd) (define (page-text page-number table) (if (null? table) "" (let* ((elment (car table)) (p (car elment)) (text (cadr elment)) (display-1st (caddr elment))) (cond ((and (= page-number p) (not display-1st)) #f) ((>= page-number p) text) (else (page-text page-number (cdr table))))))) (ly:make-stencil `(delay-stencil-evaluation ,(delay (ly:stencil-expr (begin (if (or (and odd (null? odd-page-header-table)) (and (not odd) (null? even-page-header-table))) (let ((page-header-table (list))) (for-each (lambda (label-header) (let* ((label (car label-header)) (text-disp (cdr label-header)) (table (ly:output-def-lookup layout 'label-page-table)) (label-page (and (list? table) (assoc label table))) (page-number (and label-page (cdr label-page))) (prev-value (and page-number (assoc page-number page-header-table)))) (if (not prev-value) (set! page-header-table (cons (cons page-number text-disp) page-header-table)) (set! page-header-table (assoc-set! page-header-table page-number (list (car text-disp) (caddr prev-value))))))) (reverse (if odd odd-label-header-table even-label-header-table))) (if odd (set! odd-page-header-table page-header-table) (set! even-page-header-table page-header-table)))) (interpret-markup layout props (let* ((page-number (chain-assoc-get 'page:page-number props -1)) (text (page-text page-number (if odd odd-page-header-table even-page-header-table))) (text-markup (markup #:italic (or text ""))) (page-number-markup (number->string page-number))) (cond ((or (= 1 page-number) (not text)) (markup #:null)) (odd (markup #:fill-line (#:null text-markup))); page-number-markup))) ;pour virer le num de page (else (markup #:fill-line (text-markup #:null))))))))));(page-number-markup text-markup #:null)))))))))) (cons 0 0) (ly:stencil-extent (interpret-markup layout props "XXX") Y)))) (set! add-odd-page-header-text (lambda (parser text display-1st) (let ((label (gensym "header"))) (set! odd-label-header-table (cons (list label text display-1st) odd-label-header-table)) (collect-music-for-book parser (make-music 'Music 'page-marker #t 'page-label label))))) (set! add-even-page-header-text (lambda (parser text display-1st) (let ((label (gensym "header"))) (set! even-label-header-table (cons (list label text display-1st) even-label-header-table)) (collect-music-for-book parser (make-music 'Music 'page-marker #t 'page-label label)))))) #(define-markup-command (odd-header layout props) () (header-markup-aux layout props #t)) #(define-markup-command (even-header layout props) () (header-markup-aux layout props #f)) \paper { evenHeaderMarkup = \markup \even-header oddHeaderMarkup = \markup \odd-header } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Utilities for adding (no-)page breaks, toplevel markups %%% #(define (add-page-break parser) (collect-music-for-book parser (make-music 'Music 'page-marker #t 'line-break-permission 'force 'page-break-permission 'force))) #(define (add-no-page-break parser) (collect-music-for-book parser (make-music 'Music 'page-marker #t 'page-break-permission 'forbid))) #(define (add-toplevel-markup parser text) (collect-scores-for-book parser (list text))) #(define (add-toc-item parser markup-symbol text) (collect-music-for-book parser (add-toc-item! markup-symbol text))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Rehearsal numbers %%% #(define-public rehearsal-number #f) #(define-public increase-rehearsal-major-number #f) #(let ((major-number 0) (minor-number 0)) (set! increase-rehearsal-major-number (lambda () (set! major-number (1+ major-number)) (set! minor-number 0))) (set! rehearsal-number (lambda () (set! minor-number (1+ minor-number)) (format #f "~a-~a" major-number minor-number)))) #(define-public (add-rehearsal-number parser) (collect-scores-for-book parser (list (markup #:huge #:bold (rehearsal-number))))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Commands %%% #(use-modules (srfi srfi-39)) #(define *book-title* (make-parameter "")) #(define *use-rehearsal-numbers* (make-parameter #f)) useRehearsalNumbers = #(define-music-function (parser location use-numbers) (boolean?) (*use-rehearsal-numbers* use-numbers) (make-music 'Music 'void #t)) bookTitle = #(define-music-function (parser location title) (string?) (*book-title* title) (make-music 'Music 'void #t)) %{chapter = #(define-music-function (parser location title) (string?) (increase-rehearsal-major-number) (add-page-break parser) ; (add-toc-item parser 'tocChapterMarkup title) (add-even-page-header-text parser (string-upper-case (*book-title*)) #f) (add-odd-page-header-text parser (string-upper-case title) #f) (add-toplevel-markup parser (markup #:chapter-title (string-upper-case title))) (add-no-page-break parser) (make-music 'Music 'void #t)) %} piece = #(define-music-function (parser location title) (string?) (increase-rehearsal-major-number) ; (add-page-break parser) %; ajoute un saut de page ; (add-even-page-header-text parser (*book-title*) #t) ;(string-upper-case (*book-title*)) (add-odd-page-header-text parser (markup #:fill-line ((*book-title*) title)) #t) (add-even-page-header-text parser (markup #:fill-line (title (*book-title*))) #t) ; (add-even-page-header-text parser title #t) ; (add-toplevel-markup parser (markup #:piece-title title )) ;(string-upper-case title) (add-no-page-break parser) (make-music 'Music 'void #t)) #(define-markup-command (piece-title layout props piece) (markup?) (interpret-markup layout props (markup #:column (#:vspace 3 #:pad-markup 1 #:fill-line (#:fontsize 3 piece))))) %; c'est ici qu'on règle la mise en forme du titre des pièces \paper { ragged-bottom = ##t %évite d'étaler trop la musique verticalement left-margin = 1\cm right-margin = 1\cm top-margin = 1\cm print-first-page-number = ##t oddFooterMarkup = \markup { \fill-line { \null \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string } } evenFooterMarkup = \markup { \fill-line { \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string \null } } } nc = { \once \override LyricText #'self-alignment-X = #-1 } % = aligner les paroles sous les \breve titre = "Titre principal" %Définition du titre principal \bookTitle \titre %Imprime le titre principal dans l'entête \header { title = \titre %Imprime le titre principal en début composer = "Le compositeur" } \piece "Pièce 1" \score { \new Staff { \relative c'{ \cadenzaOn a'\breve g4 g \breathe a\breve \bar "" f4 g2 g g4 g g f a2\fermata \bar "||" } } \addlyrics { \nc "la la la la la la la la la la" la la \nc "la la la la la la la la la" la la la la la la la la } \layout { indent = 0.0 ragged-right = ##f ragged-last = ##t \context { \Score \remove "Bar_number_engraver" } \context { \Staff \remove "Time_signature_engraver" } } } \pageBreak \piece "Pièce 2" \score { \new Staff { \relative c'{ \repeat unfold 10 { e4 e e e e e } } } \layout { } } \pageBreak \piece "Pièce 3" \score { \new Staff { \relative c'{ \repeat unfold 10 { f4 f f f f f } } } \layout { } } \piece "Pièce 4" \score { \new Staff { \relative c'{ \repeat unfold 10 { g'4 g g g g g } } } \layout { } }