Subject: [long] Code lilypond conditionnel dans une fonction Scheme

From: Olivier Miakinen <[email-masked]>
Date: Thu, 12 Oct 2017 00:24:33 +0200

Bonjour,

Comme dit dans un autre fil de discussion, j'essaye de personnaliser
certains points de l'assistant de création de Frescobaldi.

Entre autres choses, quand je crée une section de chœur, Frescobaldi
crée une fonction telle que celle-ci (j'ai supprimé des choses inutiles
à ma question) :

==================================================================
rehearsalMidi = #
(define-music-function
 (parser location name midiInstrument lyrics)
 (string? string? ly:music?)
 #{
   \unfoldRepeats <<
     \new Staff = "soprano" \new Voice = "soprano" { \soprano }
     \new Staff = "alto" \new Voice = "alto" { \alto }
     \context Staff = $name {
       \set Score.tempoWholesPerMinute = #(ly:make-moment 100 4)
       \set Staff.midiInstrument = $midiInstrument
     }
     \new Lyrics \lyricsto $name $lyrics
 #})
==================================================================

Cette fonction est appelée plusieurs fois pour créer les fichiers MIDI
d'aide à l'apprentissage, en l'occurrence deux fois ici. Par exemple
pour la voix de soprano :

==================================================================
\book {
  \bookOutputSuffix "soprano"
  \score {
    \rehearsalMidi "soprano" "soprano sax" \sopranoVerse
    \midi { }
  }
}
==================================================================

L'effet de \rehearsalMidi "soprano" "soprano sax" \sopranoVerse
est d'inclure le code suivant :
==================================================================
   \unfoldRepeats <<
     \new Staff = "soprano" \new Voice = "soprano" { \soprano }
     \new Staff = "alto" \new Voice = "alto" { \alto }
     \context Staff = "soprano" {
       \set Score.tempoWholesPerMinute = #(ly:make-moment 100 4)
       \set Staff.midiInstrument = "soprano sax"
     }
     \new Lyrics \lyricsto "soprano" \sopranoVerse
==================================================================

Mais je voudrais ajouter un appel possible de la fonction
rehearsalMidi, avec des paramètres nuls (ou omis, je ne sais
pas ce qui est possible), qui fasse la même chose mais sans
traitement particulier pour une voix donnée.

En gros j'ajouterais un \book ressemblant à ceci :
==================================================================
\book {
  \bookOutputSuffix "tutti"
  \score {
    \rehearsalMidi (nil) (nil) (nil)
    \midi { }
  }
}
==================================================================

Et j'aimerais que l'effet soit alors le suivant :
==================================================================
   \unfoldRepeats <<
     \new Staff = "soprano" \new Voice = "soprano" { \soprano }
     \new Staff = "alto" \new Voice = "alto" { \alto }
     \context Staff {
       \set Score.tempoWholesPerMinute = #(ly:make-moment 100 4)
     }
==================================================================

EN RÉSUMÉ, j'aimerais que la fonction soit un truc du genre suivant,
sauf que ma syntaxe est sûrement incorrecte :

==================================================================
rehearsalMidi = #
(define-music-function
 (parser location name midiInstrument lyrics)
 (string? string? ly:music?)
  #{
    \unfoldRepeats <<
      \new Staff = "soprano" \new Voice = "soprano" { \soprano }
      \new Staff = "alto" \new Voice = "alto" { \alto }
  #}
  (if $name
    #{
        \context Staff = $name {
          \set Score.tempoWholesPerMinute = #(ly:make-moment 100 4)
          \set Staff.midiInstrument = $midiInstrument
        }
        \new Lyrics \lyricsto $name $lyrics
    #}
  ; else
    #{
        \context Staff {
          \set Score.tempoWholesPerMinute = #(ly:make-moment 100 4)
        }
    #}
  )
  #{
  #}
 )
==================================================================

Cordialement,
-- 
Olivier Miakinen