Scheme : Musikalisches Würfelspiel

Bonjour,

Je cherche à réaliser avec Lilypond des morceaux de musique suivant
les règles de « jeux de dés musicaux », par exemple celui-ci :

https://imslp.org/wiki/Musikalisches_Würfelspiel,_K.516f_(Mozart,_Wolfgang_Amadeus)
https://imslp.eu/files/imglnks/euimg/e/ed/IMSLP985911-PMLP47543-Mozart_Musikalisches_Würfelspiel_KV_516f.pdf

J'ai déjà créé les 176 mesures (en 352 variables, main droite et
main gauche), et aussi leur correspondance (en 352 autres variables)
selon le numéro de mesure et le tirage de dés de 2 à 12.

Par exemple, si on tire un 2 pour la toute première mesure, je trouve
dans la première colonne et la deuxième ligne le numéro 96, et donc
j'ai dans mes fichiers :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
"r96" = \relative do'' { mi8 do sol }
"l96" = \relative do { do4 r8 }
"A2r" = "r96"
"A2l" = "l96"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

J'ai aussi défini des valeurs par défaut en supposant que le tirage
de dés donne 7 à chaque fois, puis des variables à utiliser dans mon
\score pour faire la partition complète :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ar = "A7r" Al = "A7l"
Br = "B7r" Bl = "B7l"
Cr = "C7r" Cl = "C7l"
Dr = "D7r" Dl = "D7l"
Er = "E7r" El = "E7l"
Fr = "F7r" Fl = "F7l"
Gr = "G7r" Gl = "G7l"
Hr = "H7r" Hl = "H7l"

ar = "a7r" al = "a7l"
br = "b7r" bl = "b7l"
cr = "c7r" cl = "c7l"
dr = "d7r" dl = "d7l"
er = "e7r" el = "e7l"
fr = "f7r" fl = "f7l"
gr = "g7r" gl = "g7l"
hr = "h7r" hl = "h7l"

rightI = { \Ar \Br \Cr \Dr \Er \Fr \Gr \Hr }
rightII = { \ar \br \cr \dr \er \fr \gr \hr }
leftI = { \Al \Bl \Cl \Dl \El \Fl \Gl \Hl }
leftII = { \al \bl \cl \dl \el \fl \gl \hl }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Il ne me reste plus qu'à remplacer tous ces « 7 » par des nombres
aléatoires entre 2 et 12. Je sais comment générer un nombre aléatoire
en Scheme, je sais même former une chaîne en concaténant une lettre
(A à H en majuscule ou minuscule) avec ce nombre puis la lettre "r"
ou "l", mais je n'arrive pas à transformer ces chaînes en noms de
variables.

Par exemple, si pour la lettre F le tirage donne 11, je voudrais
pouvoir générer quelque chose comme :
(define Fr F11r)
(define Fl F11l)
ou en syntaxe lilypond :
Fr = "F11r"
Fl = "F11l"

Est-ce que quelqu'un pourrait m'aider ?

Cordialement,

Olivier Miakinen

Bonjour,

Je m'aperçois qu'en voulant être exhaustif j'ai écrit un très long
message qui pourrait décourager les lecteurs. Alors voici un résumé.

Le 03/01/2026 à 21:46, Olivier Miakinen via LilyPond a écrit :

[...]

Par exemple, si pour la lettre F le tirage donne 11, je voudrais
pouvoir générer quelque chose comme :
(define Fr F11r)
(define Fl F11l)
ou en syntaxe lilypond :
Fr = "F11r"
Fl = "F11l"

Pour simplifier, supposons que j'aie le code suivant :

(define colonne "F")
(define ligne (number->string (+ (random 11) 2))) ; par exemple "11"
(define ori (string-append colonne ligne "r")) ; donc "F11r"
(define dest (string-append colonne "r")) ; donc "Fr"

Je voudrais pouvoir faire :

(define « contenu de dest » « contenu de ori »)

c'est-à-dire, étant entendu que ori="F11r" et dest="Fr" :

(define Fr F11r)

Eurêka !

En cherchant sur la toile des exemples en lisp vu que je ne trouvais
rien avec Scheme ou Guile, j'ai vu (eval ...) qui ne fonctionne pas
comme ça en Scheme, mais qui m'a permis de trouver (eval-string ...).

Le 04/01/2026 à 15:33, Olivier Miakinen a écrit :

(define colonne "F")
(define ligne (number->string (+ (random 11) 2))) ; par exemple "11"
(define ori (string-append colonne ligne "r")) ; donc "F11r"
(define dest (string-append colonne "r")) ; donc "Fr"

Je voudrais pouvoir faire :

(define « contenu de dest » « contenu de ori »)

Et donc :
(eval-string (string-append "(define " dest " " ori ")"))

Cela dit, il y a peut-être plus élégant. Je suis toujours preneur de
vos avis.

Cordialement,

Olivier Miakinen

Le 03/01/2026 à 21:43, Olivier Miakinen a écrit :

Je cherche à réaliser avec Lilypond des morceaux de musique suivant
les règles de « jeux de dés musicaux », par exemple celui-ci :

https://imslp.org/wiki/Musikalisches_Würfelspiel,_K.516f_(Mozart,_Wolfgang_Amadeus)
https://imslp.eu/files/imglnks/euimg/e/ed/IMSLP985911-PMLP47543-Mozart_Musikalisches_Würfelspiel_KV_516f.pdf

Ça marche ! À chaque recompilation j'obtiens une nouvelle valse.

:smiley:

1 « J'aime »

Je m'étais amusé à la même chose il y a des années…

mzt.ly (11,8 Ko)

Et apparemment Nicolas Sceaux aussi : Variables, aléatoire et jeu musical (Mozart)

1 « J'aime »

Bonjour Jean, et meilleurs vœux pour 2026 !

Le 05/01/2026 à 15:52, Jean Abou Samra via LilyPond a écrit :

Je m'étais amusé à la même chose il y a des années…

mzt.ly (11,8 Ko)

Ah, bravo, ton code est beaucoup plus compact que le mien. Et je
constate que comme moi tu saisis les notes en français... enfin
c'est encore mieux que moi, car j'ai choisi l'italien avec /re/
au lieu de /ré/.

En revanche, cela ne fonctionne pas bien en MIDI car la 8e mesure
(qui est toujours la même) ne fait pas la distinction entre première
et deuxième fois.

Moi j'ai ceci dans la saisie des notes :

"r5" = \rr{ 4 r8 }
"l5" = <<
\tag #'1st \rl{ sol8 sol'16 fa mi re }
\tag #'2nd \rl{ sol8 si'16 sol fad mi }
\tag #'print <<
\rl{ sol8^\markup "2." si'16 sol fad mi }
\
\rl{ sol8_\markup "1." sol'16 fa! mi re }
>>

Puis comme résultat :

leftPrint = \keepWithTag #'print {
\global
\repeat volta 2 \leftI
\repeat volta 2 \leftII
}
leftMidi = {
\global
\keepWithTag #'1st \leftI
\keepWithTag #'2nd \leftI
\keepWithTag #'1st \leftII
\keepWithTag #'2nd \leftII
}

Et apparemment Nicolas Sceaux aussi : Variables, aléatoire et jeu musical (Mozart)

Idem. Sauf qu'en plus son code ne fonctionne pas :frowning:

je suis impressionné !

Le 05/01/2026 à 23:27, MartialR via LilyPond a écrit :

je suis impressionné !

Je ne sais pas si je peux inclure des fichiers dans le message
(j'utilise le forum en mode courriel). Si ça marche, compiler
seulement 4_Walzer.ly pour avoir une valse en PDF et en MIDI,
ou seulement 5_Notentafel.ly pour retrouver la liste de notes
du document d'origine.

(pièces jointes)

1_Noten.ly (10.9 KB)
2_Zahlen.ly (7.8 KB)
3_Random.ly (1 KB)
4_Walzer.ly (1.79 KB)
5_Notentafel.ly (3.81 KB)

Tu as raison. J'ai corrigé ce problème, simplifié le code, converti les noms des notes en néerlandais et mis le tout sur le wiki LilyPond :

1 « J'aime »

Le 07/01/2026 à 15:48, Jean Abou Samra via LilyPond a écrit :

Tu as raison. J'ai corrigé ce problème, simplifié le code, converti les noms des notes en néerlandais et mis le tout sur le wiki LilyPond :

Mozart's Musikalisches Würfelspiel - LilyPond wiki

Bravo ! En plus j'allais te signaler que tu avais interverti les volta 1
et 2 mais je vois que tu l'as déjà corrigé. :slight_smile: