Subject: Transposition avec nom de notes perso

From: Éric <[email-masked]>
Date: Thu, 27 Jun 2019 03:20:31 -0700 (MST)

Bonjour,
j'ai édité le fichier define-note-names.scm dans 
~/lilypond/usr/share/lilypond/current/scm
pour pouvoir utiliser des nom de notes perso avec modification de la liste
des noms (espanol . (

Par exemple, pour do# :
ligne d'origine : (dos . ,(ly:make-pitch -1 0 SHARP))
remplacée par : (de . ,(ly:make-pitch -1 0 SHARP))

Ça marche très bien pour la saisie mais,
dans Frescobaldi, l'outil  Outils > Hauteurs > Transposer
(qui fonctionne très bien par ailleurs avec un \language  
où les noms de notes n'ont pas été personnalisés)
ne prend pas en compte les noms modifiés.
Les noms auquel je n'ai pas touché sont eux bien transposés.

Pensez-vous que cela soit un pb purement Frescobaldien ?
Dans ce cas, ce forum est-il le bon endroit pour poster ?

Bonne journée
Éric

P.S. par ailleurs :
Un problème voisin existe aussi avec le \language "français" 
Là, Frescobaldi ne semble carrément pas savoir de quoi on parle.
Les utilisateurs concernés se rabattent sans doute sur "italiano" où seul le
ré 
 est différent du "français" par l'absence d'accent.
Lien avec issue 288290043 ??

--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: Jean-Paul Quelen <[email-masked]>
Date: Thu, 27 Jun 2019 15:19:53 +0200

Il s'agit en effet d'un problème lié à Frescobaldi. J'ai fait des essais 
avec des partitions complexes ne comportant que des notes à 
l'anglo-saxonne et là aussi il peut avoir des problèmes. Par contre sous 
lilypond il y a la macro \transpose qui elle ne modifie pas le code 
source et qui fonctionne très bien.

cordialement
Jean-Paul

Le 27/06/2019 à 12:20, Éric a écrit :
> _______________________________________________
> liste de diffusion lilypond-user-fr
> [email-masked]
> https://lists.gnu.org/mailman/listinfo/lilypond-user-fr

---

From: Éric <[email-masked]>
Date: Thu, 27 Jun 2019 15:21:00 -0700 (MST)

Merci Jean-Paul, mais la fonction \transpose de Lilypond n'est pas ce que je
cherche, 
car justement dans le cadre de travaux d'arrangements avec transpositions et
transformation importante de la saisie initiale, 
j'ai besoin de pouvoir lire facilement les noms de notes correspondant à la
partition, dans le code.

Le problème exposé ne concerne que les noms de notes du code.

Bien cordialement,
Éric

---

From: Jean-Paul Quelen <[email-masked]>
Date: Fri, 28 Jun 2019 11:13:59 +0200

On peut alors tenter une méthode manuelle avec des "remplacer" sur 
chacune des 12 notes de la gamme (c'est ce que devrait faire normalement 
Frescobaldi) voir utiliser une expression rationnelle mais c'est assez 
pénible à faire.

Cordialement
Jean-Paul

---

From: Éric <[email-masked]>
Date: Fri, 28 Jun 2019 02:44:27 -0700 (MST)

Effectivement, surtout quand c'est fréquent comme quand on en train
d'arranger (nbx transpo d'octaves par exemple).
Il doit y avoir une regex appropriée mais je n'y connais pas grand chose.

Bonne journée,
Éric

---

From: Olivier Miakinen <[email-masked]>
Date: Fri, 28 Jun 2019 21:55:12 +0200

> Il doit y avoir une regex appropriée mais je n'y connais pas grand chose.

Si tu donnes la liste des noms de notes (le plus simple étant de donner
la partie correspondante à la langue dans define-note-names.scm), je
veux bien te faire la liste de regexp qui va bien.

Plutôt que de faire directement les transpositions de n'importe quelle
tonalité à n'importe quelle autre, je te propose de traduire de ta
langue vers celle par défaut (nederlands), et retour, et de laisser
Frescobaldi faire la transposition en nederlands.

---

From: Éric <[email-masked]>
Date: Sat, 29 Jun 2019 11:18:50 -0700 (MST)

Olivier,
merci pour la proposition !

Voici ma nomenclature :

ces     di
c       do
cis     de
cisis   deo

deses   roe
des     ro
d       re
dis     ri
disis   rie

eses    mei
es      me
e       mi
eis     ma

fes     fi
f       fa
fis     fo
fisis   foa

geses   zaol
ges     za
g       sol
gis     sa
gisis   saol

aeses   loa
aes     lo
a       la
ais     li
aisis   lia

beses   tai
bes     ta
b       ti
bis     to   

Pour info :
Noms de notes latins chromatiques.
Éric Bellocq 2018

Par le passé de très nombreux systèmes ont été proposés sans succès, 
sans doute car il est difficile d'allier logique et compatibilité avec le
préexistant.

C'est ce que prétend faire la présente nomenclature :
- touches "blanches" : italien sauf si —> ti ( comme dans "mobile do"
américain).
- altérations : voyelle est remplacée par celle de la note voisine (sauf sol
bémol —> za)
- doubles altérations : altération + voyelle originale.

Bien cordialement
Éric

---

From: Olivier Miakinen <[email-masked]>
Date: Sat, 29 Jun 2019 22:49:38 +0200

Le 29/06/2019 20:18, Éric a écrit :
> [...]

Ok.

> - altérations : voyelle est remplacée par celle de la note voisine (sauf sol

C'est génial... et complètement barré à la fois ! :-)

Avant de lire cette explication, j'essayais de comprendre pourquoi
on a dans l'ordre fi/fa/fo mais lo/la/li. Ça semblait complètement
incohérent, mais c'est logique si on pense que c'est à cause de :
 (mi)->fi / fa / (sol)->fo
 (sol)->lo / la / (si)->li

> - doubles altérations : altération + voyelle originale.

Ok. du coup, on pourrait éventuellement compléter ceux que tu n'as
pas mis parce que (je suppose) trop rares :
 ceses  dio
 eisis  mai
 feses  fia
 bisis  toi

> Bien cordialement

Quoi qu'il en soit, je ne vois pas de moyen de factoriser plusieurs
regexp en une seule, mais ce n'est pas grave : on fera une ligne par
traduction.

Mais je ne t'ai pas demandé quels outils tu peux utiliser le plus
facilement pour les regexp. Par exemple le langage perl ?

---

From: Olivier Miakinen <[email-masked]>
Date: Sat, 29 Jun 2019 23:33:12 +0200

> facilement pour les regexp. Par exemple le langage perl ?

Par ailleurs, est-ce que tu pourrais me donner un exemple de fichier
Lilypond utilisant ces noms latins des notes ?

---

From: Éric <[email-masked]>
Date: Sun, 30 Jun 2019 06:24:42 -0700 (MST)

Olivier Miakinen-3 wrote
> Je ne sais rien de ce côté là.
> L'outil "chercher/remplacer" de Frescobaldi a une option Regex que l'on
> peux
> cocher directement dans sa fenêtre d'interaction.
> Frescobaldi est en Python si je comprends bien.
> 
> La page : 
> http://frescobaldi.org/uguide.html#help_snippet_help
> au chapitre The editor / Search and replace
> a des conseils que je découvre.
> Est-ce que :
> ( )
>     group characters. This also saves the matched text in the group. When
> replacing, you can use characters like \1, \2 etcetera, to write the text
> of the corresponding group in the replacement text. 
> 
> pourrait correspondre a un remplacement multiple ??
> 
> Ci-joint. 
> Alternative à décommenter avec bcp d'altérations pour test
> si modif du fichier .scm du Lilypond/User
> 
> Éric
> MontDor_v2.ly
> <http://lilypond-french-users.1298960.n2.nabble.com/file/t395665/MontDor_v2.ly>  

> lilypond-user-fr@

---

From: Éric <[email-masked]>
Date: Sun, 30 Jun 2019 07:14:24 -0700 (MST)

problème de citation dans le précédent message.
Lire l'ensemble.
Désolé.
Éric

---

From: Olivier Miakinen <[email-masked]>
Date: Sun, 30 Jun 2019 19:28:08 +0200

>> cocher directement dans sa fenêtre d'interaction.

Oui, mais tu ne peux faire qu'un seul type de recherche/remplacement à
la fois. Par exemple tu devras le faire pour tous les /do/, puis tous
les /di/, tous les /de/, tous les /re/, etc.

>> pourrait correspondre a un remplacement multiple ??

Multiple oui, mais pas dans le sens que l'on cherche. Il s'agit dans
*un* remplacement de remplacer *plusieurs parties* de la chaîne de
départ ; il ne s'agit pas de programmer en une seule fois plusieurs
sortes de remplacements indépendants les uns des autres.

>> <http://lilypond-french-users.1298960.n2.nabble.com/file/t395665/MontDor_v2.ly>  

J'ai écrit deux scripts pour perl (que tu peux trouver sur plusieurs
systèmes d'exploitation parmi lesquels GNU/Linux et Windows). Je les
ai appelés la2nl.pl (latin to nederlands) et nl2la.pl (l'inverse).

Voici quelques extraits de résultats sur MontDor_v2.ly

nl2la donne :
------------------------------------------------------------------
% noms "nederlands"
mus = {
  \mark "A"
  sol2. fo mi re2 do4 |
  ti,2. do re sol, |
  \mark "B"
  sol2. fo mi la2 sol4 |
  fo2. sol la re \bar ":|.|:"
  \mark "C"
  re2 do4 ti,2. do ti,2 la,4 |
  sol,2. la, ti, mi2 re4 |
  \mark "D"
  do2. ti, la, re2 do4 |
  ti,2. do re sol, \bar ":|."
}
%}
------------------------------------------------------------------

mais aussi :
------------------------------------------------------------------
  title = "Le  Mont  re'Or"
------------------------------------------------------------------

et :
------------------------------------------------------------------
      % 141 ^€$ Bach maîtrisait reéjà Regex !!
------------------------------------------------------------------

Parce que le « d » quand il n'est pas précédé ou suivi d'une autre
lettre non accentuée est remplacé par « re ». Je pourrais au moins
corriger le cas d'une lettre accentuée (pour que « déjà » ne devienne
pas « reéjà ») mais je ne peux rien faire pour « d' » car on peut
trouver une apostrophe dans une expression musicale.

Dans l'autre sens, la2nl donne :
------------------------------------------------------------------
%{ noms en "espanol" customisé en Gb major
musEsp = {
  \mark "A"
  ges2. f es des2 ces4
  bes,2. ces des ges,
  \mark "B"
  ges2. f es as2 ges4
  f2. ges as des\bar ":|.|:"
  \mark "C"
  des2 ces4 bes,2. ces bes,2 as,4
  ges,2. as, bes, es2 des4
  \mark "D"
  ces2. bes, as, des2 ces4
  bes,2. ces des ges, \bar ":|."
}
%}

Mais aussi :
------------------------------------------------------------------
      % 141 ^€$ Bach eisîtrisait déjà Regex !!
------------------------------------------------------------------

Et là, c'est pareil, je pourrais m'arranger pour qu'il ne traduise
pas « ma » dans « maîtrisait », mais je ne peux rien faire pour
le mot « ma » tout seul.

Je corrige l'histoire des accents, puis je reviens.

---

From: Olivier Miakinen <[email-masked]>
Date: Sun, 30 Jun 2019 19:56:04 +0200

> Je corrige l'histoire des accents, puis je reviens.

C'est OK pour les accents. Je joins les deux scripts perl, et les
fichiers résultant de la traduction de MontDor_v2.ly. Étant sur
GNU/Linux avec perl installé, j'ai lancé les commandes suivantes :
  ./la2nl.pl < MontDor_v2.ly > MontDor_nl.ly
  ./nl2la.pl < MontDor_v2.ly > MontDor_la.ly

Mes scripts reconnaissent les noms de note quand ils ne sont ni
précédés ni suivis d'une lettre (accentuée ou non), mais bien
sûr ils peuvent être suivis d'un chiffre (la durée de la note),
d'une virgule ou d'une apostrophe, etc.

Attention cependant, ils ne savent pas faire la différence entre
du vrai code musical, un commentaire, ou le contenu d'une chaîne
de caractères. Cela dit, ce n'est gênant que si ce nom se trouve
être celui d'une note en néerlandais. J'explique pourquoi :

Supposons que tu veuille transposer « la2^"c'est la note" » d'un
ton en dessous.
1) Tu traduis par la2nl, ce qui donne : « a2^"c'est a note" ».
2) Tu transposes en nl, ce qui donne : « g2^"c'est a note" ».
3) Tu traduis dans l'autre sens, ce qui donne « sol2^"do'est la note" ».
L'article « la » dans « la note » a été faussement traduit en « a »,
mais vu que Frescobaldi ne le transpose pas, il redevient « la » qui
est correct. En revanche, le « c » dans « c'est » devient un « do ».

Bref, c'est très imparfait comme solution, mais ça fait quand même le
plus gros du boulot.

---

From: Éric <[email-masked]>
Date: Sun, 30 Jun 2019 13:41:27 -0700 (MST)

Merci bcp, je vais étudier tout ça et voir la pratique.

De mon côté, j'ai me suis décidé à commencer à travailler pour pouvoir
utiliser l'outil rechercher/remplacer directement dans l'éditeur de
Frescobaldi. 
Plutôt en Regex Unicode Python car il me semble que c'est ce qui convient
dans cet outll.
Côté pratique, vu que l'appel d'un fragment (snippet) dans la fenêtre de
recherche ne fonctionne pas,
(ni par raccourci ni par double-clic), je ne vois pour l'instant que le
copier/coller manuel ce qui n'est pas optimum.

Vu mon niveau (c-à-d absence de) je n'ai pour l'instant  fait le
remplacement que d'un nom de note à la fois.
Ça donne, pour "traduire" de "latin" à "nederlands"  un do# ("de" —> "cis")
:

- Rechercher :  \bde\b|(de)([0-9]+)
- Remplacer :  cis\g<2>

Ça marche bien sur ce fichier test : modifications uniquement sur
les notes en conservant le rythme et les octaves, sans toucher au reste :

de
de (avec 1 espace avant retour chariot)
de,
de'
de2
de32
deo
do
d
d'
deux
odeur
override

Reste à gérer plusieurs notes à la fois, en espérant que la numération des
groupes capturant et leur backreferences ( \g<2> dans l'exemple), marchent
aussi avec remplacements alternatives |  
Mais là j'ai le cerveau qui a suffisamment chauffé pour aujourd'hui…

Éric

---

From: Olivier Miakinen <[email-masked]>
Date: Mon, 1 Jul 2019 01:21:50 +0200

> Plutôt en Regex Unicode Python car il me semble que c'est ce qui convient

Sauf erreur, la syntaxe est donc celle décrite ici :
<https://docs.python.org/3/library/re.html#regular-expression-syntax>.

> - Rechercher :  \bde\b|(de)([0-9]+)

Donc rechercher
- soit « de » comme un mot tout seul (premier cas)
- soit « de » suivi d'un ou plusieurs chiffres (deuxième cas)

> - Remplacer :  cis\g<2>

Et tu remplaces par « cis » suivi de la deuxième chaîne capturée, soit
rien dans le premier cas, et la suite de chiffres dans le second.

Je me permets quelques remarques car je suis assez spécialiste des
regexp.

1) Dans le second cas, il est inutile de capturer « de » en le mettant
   entre parenthèses, puisque tu ne recopies que la deuxième capture
   (les chiffres). Du coup on recopiera ce qui deviendra la première
   capture, avec \g<1> au lieu de \g<2>, que l'on peut même simplifier
   en \1 puisqu'il n'y a rien derrière. Ce qui donne :

   - Rechercher :  \bde\b|de([0-9]+)
   - Remplacer :  cis\1

2) À partir du moment où tu détectes un chiffre, ce n'est pas la peine
   de chercher s'il y en a d'autres après, on peut donc remplacer
   [0-9]+ par [0-9], et même par \d :

   - Rechercher :  \bde\b|de(\d)
   - Remplacer :  cis\1

3) En fait, plutôt que de rechercher *et capturer* un chiffre puis le
   recopier avec \1, on peut juste regarder s'il y en a un mais ne pas
   le consommer (c'est une assertion, comme les \b), auquel cas on n'a
   pas besoin de \1 dans le remplacement :

   - Rechercher :  \bde\b|de(?=\d)
   - Remplacer :  cis

Sauf erreur de ma part, ce à quoi je suis arrivé doit faire *exactement*
la même chose que ce que tu proposais. Mais il y a quelques problèmes
avec ça.

4) Par exemple, je pense que le \b après le mot ne fonctionnera pas si
   ton do# est suivi d'un underscore, par exemple « de_\markup{...} ».
   Il faudrait alors le tester en plus des chiffres, et du coup
   l'écriture redevient plus simple avec [0-9] en écrivant [0-9_] :

   - Rechercher :  \bde\b|de(?=[0-9_])
   - Remplacer :  cis

5) Autre problème, dans le second cas tu ne testes plus de \b *avant*
   le mot. Il faudrait le rajouter, et du coup on peut factoriser
   l'écriture :

   - Rechercher :  \bde(\b|(?=[0-9_]))
   - Remplacer :  cis

> de (avec 1 espace avant retour chariot)

Je suppose que les six premiers ont été remplacés, mais aucun des sept
suivants (ce qui est bien).

En revanche ça devrait moins bien fonctionner avec :
- de_\pp       (non remplacé à mon avis, à tort)
- override2    (remplacé à mon avis, à tort)
... et je crois que ma proposition corrige les deux problèmes

> aussi avec remplacements alternatives |  

Avec ma proposition, il n'y a plus de groupes capturants et donc plus de
backreference. Seulement ça ne résoud pas le problème, qui est que /de/
doit devenir /cis/ mais qu'en même temps /di/ doit devenir /ces/, etc.

> Mais là j'ai le cerveau qui a suffisamment chauffé pour aujourd'hui…

;-)