Subject: Variables variées...

From: Jean-Christophe D <[email-masked]>
Date: Wed, 1 Sep 2010 13:50:16 -0700 (PDT)

Bonsoir,

Comment mettre en variable des indications de transposition ?
Hors notes et lyrics bien évidemment, cela fonctionne pour l'armure
(pourtant non suivi d'une expression musicale) :
	ARMURE = {
		\set Score.tempoHideNote = ##t \tempo 4=110 % (pour donner le tempo au
midi)
		\clef treble
		\key fa \major
		\time 4/4
	} %%% peut être repris ensuite en tant que \ARMURE

...mais pas pour autre chose, en tout cas pas pour cela :
	SINGHI   = { \transpose do  do' }   %%% pour rendre écoutable le midi d'un
canon à 4 voix...
	SINGMID  = { \transpose do  do  } %%% à utiliser devant chaque voix genre :
	SINGLOW  = { \transpose do' do  } %%% \new Voice \SINGLOW { musique... }
	SINGBASS = { \transpose do' do, }
(avec ou sans parenthèses c'est du pareil au même...)

(j'ai l'impression que je devrais écrire, pour ce simple besoin de
simplification, une fonction en SCHEME, langage que je ne connais pas, et je
vais devoir abandonner avant même de commencer...)

Merci de vote aide !

Jean-Christophe
-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/Variables-variees-tp5488765p5488765.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Eluze <[email-masked]>
Date: Wed, 1 Sep 2010 14:40:59 -0700 (PDT)

là même moi j'y arrive - ou n'est-ce qu'un coup de chance?!

SINGHI   = #(define-music-function (parser location music) (ly:music? )
  #{ \transpose c  c' { $music } 
#})

et l'évocation ce fait par

{
  \SINGHI {a b c d }
}

le tout sans garantie!!!
-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/Variables-variees-tp5488765p5488951.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Jean-Christophe D <[email-masked]>
Date: Thu, 2 Sep 2010 08:24:53 -0700 (PDT)

Merci BEAUCOUP : "même ça", je n'y serai jamais arrivé tout seul, ou bien
avec trois semaines de tests et d'essais dans tous les sens. J'ai bien
essayé de regarder un peu dans les docs, mais tout cela reste du charabia à
mes yeux...

Je testerai... et te tiendrai au courant (pour la "garantie"  ;o).

Ciao,
Jean-Christophe
-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/Variables-variees-tp5488765p5491581.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Jean-Christophe D <[email-masked]>
Date: Thu, 2 Sep 2010 14:45:56 -0700 (PDT)

C'est super, cela fonctionne parfaitement !

Merci encore,
Jean-Christophe.

Remarque personnelle

Il s'agit néanmoins de programmation, et je crois que ce n'est pas forcément
évident pour tout le monde.
Pour déclarer ce qui est une simple VARIABLE dans d'autre environnements
codés (programmation), il faut ici procéder à l'écriture d'une routine ou
fonction dans un langage qui dépasse le cadre de Lilypond.

Je trouverai personnellement pratique un moyen simple de déclarer en
variable un bout de code musical hors contexte, que l'on pourrait ensuite
placer n'importe où dans la partition...

par exemple : FORMA = [ \bold \italic ]   (ou {} ou autre...)
dans le texte, ensuite : \format "Mot ou expression" (sans les " pour un
simple mot) donnerait Mot ou expression

Cela rendrait accessible l'automatisation de codes souvent utilisés à un
plus large public.

Je ne suis pas à hauteur pour faire pareille chose, aussi je me contente de
partager mon idée... si cela peut donner de l'inspiration à l'un ou l'autre
!... (si cela n'existe pas déjà, évidemment...)

Bonne soirée !
-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/Variables-variees-tp5488765p5492976.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Jean-Jacques Rétorré <[email-masked]>
Date: Fri, 03 Sep 2010 09:01:38 +0200

Le 02/09/2010 23:45, Jean-Christophe D a écrit :

Merci encore,
Jean-Christophe.

Remarque personnelle

Si je puis me permettre de m'immiscer dans ce fil, ça ne doit pas poser de problème particulier, la dernière version fournit un moyen élégant d'inclure du code «tout prêt»

New features in 2.13 since 2.12

New option -dinclude-settings=INCLUDEFILE.ly, which causes lilypond to include the given file before the score is processed.

Il faut toutefois être suffisamment rigoureux pour gérer ces ajouts, surtout si l'on travaille sur plusieurs machines, ou si l'on change de machine (ça peut être rendu obligatoire par une défaillance).
Quoi de plus énervant de vouloir compiler un source composé quelques années auparavant, et de voir cette compilation échouer à cause d'un fichier nécessaire qu'on n'arrive pas à retrouver...
Il arrive qu'on ait envie de reprendre un travail après plusieurs années.

--
JJR.

---

From: Jean-Christophe D <[email-masked]>
Date: Fri, 3 Sep 2010 05:55:18 -0700 (PDT)

Bonjour,

Jean-Jacques Rétorré-2 wrote:
>  Si je puis me permettre de m'immiscer dans ce fil, ...

Pas de problème, bien évidemment !

Jean-Jacques Rétorré-2 wrote:
>  ...ça ne doit pas poser de problème particulier, la dernière version
> fournit un moyen élégant d'inclure du code «tout prêt» 
> 
>   New option -dinclude-settings=INCLUDEFILE.ly, which causes lilypond to
> include the given file before the score is processed. 

Cela ressemble à une option de compilation, dans le but d'insérer
systématiquement des variables ou paramètres globaux sans avoir à les
déclarer dans chaque source... A mon niveau, la fonction \include le fait
également, et je m'en contente.

Je précise donc ma question : il ne s'agit pas d'inclure du code, mais de
mettre en variable un extrait quelconque de code LilyPond (peu importe s'il
est ensuite inclu en local ou en global).

Pour reprendre ma question de départ en exemple, je trouverais pratique de
pouvoir écrire :
SingHI = [ \transpose do do' ]     % crochets...
 --ou bien--
SingLow = { \transpose do do, }     % ...ou parenthèses, ou n'importe quoi
d'autre...
 --ou encore --
SingBass = \transpose do' do,     % ...voire rien du tout !

...sans avoir à développer une fonction en SCHEME... euh, j'aurais du écrire
:
...sans avoir à faire développer une fonction en SCHEME par ELUZE... 

Bon après-midi à tous,
Jean-Christophe
-- 
View this message in context: http://lilypond-french-users.1298960.n2.nabble.com/Variables-variees-tp5488765p5495232.html
Sent from the LilyPond French Users mailing list archive at Nabble.com.

---

From: Cile <[email-masked]>
Date: Fri, 03 Sep 2010 16:02:31 +0200

Bonjour !

On 03/09/2010 14:55, Jean-Christophe D wrote:
> Cela ressemble à une option de compilation, dans le but d'insérer systématiquement des variables ou paramètres globaux sans avoir à les déclarer dans chaque source... A mon niveau, la fonction \include le fait
Je suis assez d'accord, cette option peut être bien pratique mais écrire 
un \include pour les fonctions utilisées dans la partition est plus 
ingénieux. Après c'est vrai que cela peut être pratique pour changer la 
présentation par exemple sans avoir à toucher au fichier d'origine.
> est ensuite inclu en local ou en global).
Ce que tu demandes est très clairement impossible. Tu voudrais qu'une 
variable soit une fonction, hors ce sont 2 choses différentes répondant 
à des besoins différents.
> SingBass = \transpose do' do,     % ...voire rien du tout !
La fonction transpose prend 3 arguments pour fonctionner. Les 2 premiers 
sont la note de départ et la note d'arrivée. Le 3e est la musique. Ces 
arguments ne sont pas optionnels, ils doivent impérativement être 
précisés à la suite de \transpose
Je pense qu'il faut vraiment garder à l'esprit les déficitions de 
"variable" et "fonction" :

- Qu'est ce qu'une variable ?
Une variable c'est une valeur, un objet, c'est un raccourcis vers une 
information. Imagine que tu écrives un dictionnaire, il comporte plein 
d'entrées (= variables), chacune d'elles associée à une définition (= 
contenu de la variable). Tu peux ajouter de nouveau mots à ton 
dictionnaire, tu peux modifier des définitions, etc. Mais tu ne peux pas 
dire à ton dictionnaire de créer quelque chose. La définition que tu 
écris dans ton dictionnaire doit être complète, tu ne peux pas écrire 
que les 3 premiers mots de la définition, ce serait incompréhensible. Ta 
définition doit se suffire à elle-même.

- Qu'est ce qu'une fonction ?
Une fonction exécute une action, une tâche, produit un résultat. Elle 
traite une ou des informations et renvoie un résultat qui lui-même peut 
être une information. C'est comme un petit programme qui transforme des 
données en d'autres données.

Imaginons :
Je souhaite ajouter 3 à un nombre, nous disposons du "+" qui prend 
impérativement 2 arguments.

Solution 1 :Je crée la variable \ajouteTrois
ajouteTrois = 3 +
resultat = \ajouteTrois 5
Lilypond exécute ton code, il arrive sur la définition de ajouteTrois. 
"3 +", mais trois plus quoi ??? Pris séparément (donc comme un mot dans 
le dictionnaire) cela ne veut rien dire ! Il est impossible d'écrire une 
définition comme cela, il y a erreur.

Solution 2 : Créer une fonction \ajouteTrois
Le code scheme doit expliquer ceci : "Je suis une nouvelle fonction qui 
nécessite un nombre x, mon résultat est 3 + x"
Ensuite quand on utilisera resultat = \ajouteTrois 5 Lilypond va 
reconnaître qu'il s'agit d'une fonction, exécuter l'action demandée, et 
renvoyer le résultat dans la variable resultat. Dans notre dictionnaire, 
en cherchant à resultat nous auront 8

Je ne suis pas sûre d'être très claire avec mes histoires de 
dictionnaires...
Enfin, gardons les 2 règles d'or :
- Quand une fonction utilise des arguments obligatoires ces arguments 
doivent impérativement être spécifiés en même temps que l'on appelle la 
fonction. Sinon ce serait comme donner une recette de cuisine sans les 
ingrédients.
- Une variable est "inerte", elle n'exécute rien et ne prends pas de 
paramètres.
Cela est valable dans tous les langages de programmation.

Bon après-midi
Cécile

---

From: Jean-Charles Malahieude <[email-masked]>
Date: Fri, 03 Sep 2010 19:37:09 +0200

Le 03/09/2010 16:02, Cile disait :
>> [...]
>> mettre en variable un extrait quelconque de code LilyPond (peu importe
>> s'il est ensuite inclus en local ou en global).

C'est la raison pour laquelle je préfère  IDENTIFICATEUR à variable :

Le code barre 1234567890123 est un identificateur
\1234567890123 = { camembert au lait cru suffisamment crémeux }
\9873513210987 = { bol rempli de panure bien sèche et jaune d'œuf }

\score {
   \new Staff = "camembert pané <<
     \new Voice = "enrobage" { \987651321987 }
     \new lyrics \lyricsto "enrobage" { \1234567890123 }
   \layout {
     \context {
       \four_à_chaleur_tournante
       \override Thermostat #'grill = #250
      }
     \context {
       \four_à_chaleur_tournante
       \override Minuterie #'durée = #15
      }
   }
}

À servir sur quelques feuilles de salade, et un petit coup de rouge !

Quand le temps variable n'est ni beau ni pourri !

@+
Jean-Charles