fonction scheme pour basculer un conducteur des sons réels aux parties transposées

Bonjour,
Je n'imagine pas que quelqu'un n'ait pas déjà fait ça mais j’aimerais bien comprendre pourquoi ma petite fonction plante quand je veux les parties transposées.
L'idée est d'avoir une variable globale \oreille qui, quand elle est vraie, laisse toutes les parties en sons réels, et quand elle est fausse, transpose celles où c'est indiqué à l'intervalle propre à l'instrument.

version "2.24.0"
transposezmoi = #(define-music-function (depart arrivee non)
                                        (ly:pitch? ly:pitch? boolean?)
  (if non
      #{ #}
      #{\transpose $depart $arrivee #}
      )
  )
oreille =  ##f
\score { 
  \new Staff {\transposezmoi c f, \oreille {c''}}
}

Au moins pour les sons réels ça fonctionne, mais ça plante quand ça doit transposer.
J'ai vu une discussion sur les spécificités de la fonction transpose mais j'avoue que ce qui est dit me passe très nettement au-dessus.

Merci d'avance
Olivier

Bonjour Olivier,
Si j'ai bien compris, ça fonctionne en intégrant la musique que tu souhaites manipuler à l'intérieur de ta fonction:

\version "2.25.7"

transposezmoi = #(define-music-function (depart arrivee non musique)
                                        (ly:pitch? ly:pitch? boolean? ly:music?)
  (if non
      musique
      (transpose depart arrivee musique)
      )
  )
oreille =  ##f
\score { 
  \new Staff { \transposezmoi c f, \oreille { c'' } }
}

Je voulais juste rajouter ou pas la commande transpose avant la musique mais effectivement, en faisant carrément plus ambitieux ça fonctionne.
Chapeau!
C'est donc bien la spécificité de \transpose qui bloquait et pas une erreur de syntaxe Scheme (enfin, au final, c'était quand même une erreur de syntaxe).
Merci beaucoup

Ce n'est pas vraiment une spécificité de \transpose, c'est surtout que \transpose est une fonction à trois arguments (hauteur de départ, hauteur d'arrivée, musique). Et donc \transpose x y n'est pas valide, il manque le troisième argument.

Merci Jean pour cette précision que me fait découvrir à quel point j'étais à côté de la plaque. Je croyais que ma petite fonction écrivait du code qui serait interprété "plus tard"...

Oui, c'est une erreur fréquente de croire que LilyPond a des « macros », un peu comme LaTeX, qui insèrent un bout de code quelque part, alors qu'il n'y a que des vraies fonctions, qui prennent des arguments et renvoient une valeur.