S8) Patterns, captures et templates

Les mécanismes avancés de filtrage de motifs

Les règles simples (S -> A B C) sont le pain quotidien. Mais quand la musique demande des transformations structurelles — inversions, permutations, motifs récurrents avec variations — il faut des outils plus puissants.

Où se situe cet article ?

Cet article couvre les mécanismes avancés de BPscript, tous hérités de BP3. Pour les fondements dans BP3, voir B6. Ici on voit comment BPscript les expose avec sa propre syntaxe.


Avant d’entrer dans le détail, une mise au point sur trois mécanismes que l’on confond facilement, car les trois ressemblent à des « variables ». Ils répondent en fait à trois besoins distincts — et n’agissent pas au même moment par rapport à la dérivation :

  • ? (wildcard)capturer ce qui est déjà là et le réinjecter. Agit sur une chaîne déjà produite par une dérivation précédente.
  • |x| (variable)dériver un contenu une fois pendant la dérivation, puis le répéter à l’identique.
  • $ / & (homomorphisme) — répéter un motif en le transformant : la structure est posée pendant la dérivation, la transformation s’applique ensuite au motif dérivé.

On les voit dans cet ordre.


Wildcards ? — capturer ce qui est là, le réinjecter

Parfois, on veut qu’une règle s’applique quel que soit le symbole concret, ou déplacer un fragment sans avoir à le nommer. C’est le rôle des wildcards (jokers) ?, numérotés ?1, ?2… Ils fonctionnent comme les groupes de capture d’une expression régulière : à gauche de ->, ?1 capture ce qui est présent ; à droite, il le réinjecte.

Écho — une scène complète où l’on capture un motif entre deux bornes et on le rejoue :

 

@mode:ord
S -> debut motif fin
motif -> Sa Re Ga
-----
@mode:ord
debut ?1 fin -> ?1 ?1

 

Produit : Sa Re Ga Sa Re Ga?1 capture ce qui a été dérivé entre debut et fin (ici Sa Re Ga) et le rejoue ; les bornes sont consommées.

Un même numéro désigne le même contenu : ?1 à droite vaut ce que ?1 a capturé à gauche. Une permutation, par exemple, s’écrit ?1 ?2 -> ?2 ?1 (« Sa Re » → « Re Sa », quelles que soient les deux notes). Le compilateur traduit ?n vers les métavariables (variables de réécriture) de BP3.

Quand ? Le wildcard agit comme une règle de réécriture appliquée à une chaîne déjà produite par une dérivation précédente : il capture et réinjecte, sans rien dériver lui-même. C’est l’outil des transformations locales : permuter, remplacer, ajuster un paramètre quel que soit le symbole concerné.


Variables |x| — dériver une fois, répéter à l’identique

Une grammaire hors-contexte (CFG) ne sait pas dire « refais exactement la même chose ». Or c’est partout en musique : le tihāī (un motif répété trois fois pour conclure un cycle), un refrain, une réponse en écho. C’est le rôle de la variable |x|.

|x| n’est ni un terminal ni un non-terminal : c’est une liaison. Quand ? Tout se passe pendant la dérivation : la première occurrence est dérivée (via la grammaire), son résultat est figé, et chaque |x| suivant rejoue ce contenu à l’identique.

 

@mode:ord
S -> |x| - |x| - |x|
|x| -> Sa Re Ga

 

Produit : Sa Re Ga - Sa Re Ga - Sa Re Ga|x| est dérivé une fois en Sa Re Ga, puis rejoué deux fois à l’identique, séparé par des silences : un tihāī.

Variable ≠ non-terminal — un non-terminal (S, A) se redérive indépendamment à chaque apparition : trois A peuvent donner trois résultats différents. Une variable |x| se dérive une seule fois ; les occurrences suivantes en sont des copies exactes. Et les pipes |…| s’écrivent à chaque occurrence — il n’y a pas de « déclaration » suivie d’un nom nu.

C’est précisément ce qui dépasse le context-free : exiger une copie exacte (le langage ww, un mot suivi de sa copie) n’est pas exprimable par une CFG (voir B6).


Homomorphismes $ et & — répéter en transformant

Là où la variable |x| répète à l’identique, l’homomorphisme répète en transformant. Un homomorphisme, c’est une transformation qui préserve la structure et s’applique symbole par symbole.

En BPscript : $X est le motif maître, &X sa reprise, et on attache à la reprise une table de substitution avec [sub:table]. La table — dans lib/sub.json — dit comment transformer chaque symbole :

 

@mode:ord
S -> $X tin &X[sub:abc]
X -> a b c

 

Produit : a b c tin a' b' c' — le motif maître a b c, un tin, puis sa reprise où chaque symbole est substitué selon la table abc (a→a', b→b', c→c'). Sans [sub:…], la reprise serait identique au maître (a b c tin a b c).

Une table encode n’importe quelle transformation symbole-à-symbole : transposition, inversion, ou — cas classique au tabla — le passage des bols résonants aux bols secs (dha→ta, dhin→tin).

État actuel : la substitution [sub:…] est définie dans le langage (tables dans lib/sub.json) mais pas encore câblée dans le pipeline — aujourd’hui la reprise rejoue à l’identique. On en expose ici le principe.

$X et &X sont des éléments du RHS : ils s’écrivent dans n’importe quelle règle, indépendamment de la flèche (->, <-, <>). Le maître peut aussi être un groupe inline (${a b c} / &{a b c}) ; les parenthèses ne servent qu’aux paramètres d’une reprise (&X(tempo:60)).

Règles :

  • $X est toujours le motif maître, où qu’il soit ;
  • &X est toujours une reprise (esclave) ; plusieurs &X peuvent reprendre le même $X.

Quand ? La structure — où le motif se répète — est posée pendant la dérivation ; la transformation qui distingue la reprise de l’original (transposer, inverser, rétrograder) s’applique au motif une fois dérivé. Dans le design de BPscript, cette résolution est déléguée à l’aval (voir B6).

C’est l’outil des formes musicales — ABA, rondo, thème et variations — où un même motif réapparaît, transformé. (Formellement, un morphisme de monoïdes libres : une transformation qui respecte la concaténation.)


Contextes () et #() — conditions sur les voisins

Un contexte est une condition d’application de la règle. Pendant la dérivation, quand le moteur cherche à appliquer une règle, il vérifie d’abord le contexte : la règle ne s’applique que si les voisins du symbole correspondent. Le contexte est seulement testé — jamais modifié ni produit.

Contexte positif

 

@mode:ord
S -> Pa Dha Re Dha
-----
@mode:ord
(Pa) Dha -> Dha Ni Sa

 

Produit : Pa Dha Ni Sa Re Dhaseul le premier Dha (précédé de Pa) se développe en Dha Ni Sa ; le second (précédé de Re) reste inchangé. Pa est testé, pas consommé : il demeure dans la sortie. C’est la sensibilité au contexte d’un raga — une même note se prolonge différemment selon ce qui précède.

Contexte négatif

 

@mode:ord
S -> Sa Ga Re Ga
-----
@mode:ord
#(Sa) Ga -> Ga Pa

 

Produit : Sa Ga Re Ga Pa#(Sa) signifie « sauf si précédé de Sa » : le Ga juste après la tonique est laissé tel quel ; l’autre Ga se développe en Ga Pa.

Combinaison

On peut cumuler les deux côtés : (Pa) Dha #(Sa) -> Dha Ni n’applique la règle que si Dha est précédé de Pa et pas suivi de Sa.

Les contextes sont l’outil de la sensibilité au contexte (context-sensitivity, voir L1). Ils permettent de construire des grammaires dont les règles dépendent de l’environnement local — ce qui rend les grammaires BP3 plus puissantes que les simples grammaires hors-contexte (CFG, Type 2 de Chomsky).


Récapitulatif : quel outil pour quel besoin ?

Besoin Outil Exemple
Capturer un symbole présent, le réinjecter wildcard ? ?1 ?2 -> ?2 ?1
Répéter un motif à l’identique variable $\vert$x$\vert$ S -> $\vert$x$\vert$ - $\vert$x$\vert$
Répéter un motif en le transformant

homomorphisme `

S8) Patterns, captures et templates

Les mécanismes avancés de filtrage de motifs

Les règles simples (S -> A B C) sont le pain quotidien. Mais quand la musique demande des transformations structurelles — inversions, permutations, motifs récurrents avec variations — il faut des outils plus puissants.

Où se situe cet article ?

Cet article couvre les mécanismes avancés de BPscript, tous hérités de BP3. Pour les fondements dans BP3, voir B6. Ici on voit comment BPscript les expose avec sa propre syntaxe.


Avant d’entrer dans le détail, une mise au point sur trois mécanismes que l’on confond facilement, car les trois ressemblent à des « variables ». Ils répondent en fait à trois besoins distincts — et n’agissent pas au même moment par rapport à la dérivation :

  • ? (wildcard)capturer ce qui est déjà là et le réinjecter. Agit sur une chaîne déjà produite par une dérivation précédente.
  • |x| (variable)dériver un contenu une fois pendant la dérivation, puis le répéter à l’identique.
  • $ / & (homomorphisme) — répéter un motif en le transformant : la structure est posée pendant la dérivation, la transformation s’applique ensuite au motif dérivé.

On les voit dans cet ordre.


Wildcards ? — capturer ce qui est là, le réinjecter

Parfois, on veut qu’une règle s’applique quel que soit le symbole concret, ou déplacer un fragment sans avoir à le nommer. C’est le rôle des wildcards (jokers) ?, numérotés ?1, ?2… Ils fonctionnent comme les groupes de capture d’une expression régulière : à gauche de ->, ?1 capture ce qui est présent ; à droite, il le réinjecte.

Écho — une scène complète où l’on capture un motif entre deux bornes et on le rejoue :

 

 

Produit : Sa Re Ga Sa Re Ga?1 capture ce qui a été dérivé entre debut et fin (ici Sa Re Ga) et le rejoue ; les bornes sont consommées.

Un même numéro désigne le même contenu : ?1 à droite vaut ce que ?1 a capturé à gauche. Une permutation, par exemple, s’écrit ?1 ?2 -> ?2 ?1 (« Sa Re » → « Re Sa », quelles que soient les deux notes). Le compilateur traduit ?n vers les métavariables (variables de réécriture) de BP3.

Quand ? Le wildcard agit comme une règle de réécriture appliquée à une chaîne déjà produite par une dérivation précédente : il capture et réinjecte, sans rien dériver lui-même. C’est l’outil des transformations locales : permuter, remplacer, ajuster un paramètre quel que soit le symbole concerné.


Variables |x| — dériver une fois, répéter à l’identique

Une grammaire hors-contexte (CFG) ne sait pas dire « refais exactement la même chose ». Or c’est partout en musique : le tihāī (un motif répété trois fois pour conclure un cycle), un refrain, une réponse en écho. C’est le rôle de la variable |x|.

|x| n’est ni un terminal ni un non-terminal : c’est une liaison. Quand ? Tout se passe pendant la dérivation : la première occurrence est dérivée (via la grammaire), son résultat est figé, et chaque |x| suivant rejoue ce contenu à l’identique.

 

 

Produit : Sa Re Ga - Sa Re Ga - Sa Re Ga|x| est dérivé une fois en Sa Re Ga, puis rejoué deux fois à l’identique, séparé par des silences : un tihāī.

Variable ≠ non-terminal — un non-terminal (S, A) se redérive indépendamment à chaque apparition : trois A peuvent donner trois résultats différents. Une variable |x| se dérive une seule fois ; les occurrences suivantes en sont des copies exactes. Et les pipes |…| s’écrivent à chaque occurrence — il n’y a pas de « déclaration » suivie d’un nom nu.

C’est précisément ce qui dépasse le context-free : exiger une copie exacte (le langage ww, un mot suivi de sa copie) n’est pas exprimable par une CFG (voir B6).


Homomorphismes $ et & — répéter en transformant

Là où la variable |x| répète à l’identique, l’homomorphisme répète en transformant. Un homomorphisme, c’est une transformation qui préserve la structure et s’applique symbole par symbole.

En BPscript : $X est le motif maître, &X sa reprise, et on attache à la reprise une table de substitution avec [sub:table]. La table — dans lib/sub.json — dit comment transformer chaque symbole :

 

 

Produit : a b c tin a' b' c' — le motif maître a b c, un tin, puis sa reprise où chaque symbole est substitué selon la table abc (a→a', b→b', c→c'). Sans [sub:…], la reprise serait identique au maître (a b c tin a b c).

Une table encode n’importe quelle transformation symbole-à-symbole : transposition, inversion, ou — cas classique au tabla — le passage des bols résonants aux bols secs (dha→ta, dhin→tin).

État actuel : la substitution [sub:…] est définie dans le langage (tables dans lib/sub.json) mais pas encore câblée dans le pipeline — aujourd’hui la reprise rejoue à l’identique. On en expose ici le principe.

$X et &X sont des éléments du RHS : ils s’écrivent dans n’importe quelle règle, indépendamment de la flèche (->, <-, <>). Le maître peut aussi être un groupe inline (${a b c} / &{a b c}) ; les parenthèses ne servent qu’aux paramètres d’une reprise (&X(tempo:60)).

Règles :

  • $X est toujours le motif maître, où qu’il soit ;
  • &X est toujours une reprise (esclave) ; plusieurs &X peuvent reprendre le même $X.

Quand ? La structure — où le motif se répète — est posée pendant la dérivation ; la transformation qui distingue la reprise de l’original (transposer, inverser, rétrograder) s’applique au motif une fois dérivé. Dans le design de BPscript, cette résolution est déléguée à l’aval (voir B6).

C’est l’outil des formes musicales — ABA, rondo, thème et variations — où un même motif réapparaît, transformé. (Formellement, un morphisme de monoïdes libres : une transformation qui respecte la concaténation.)


Contextes () et #() — conditions sur les voisins

Un contexte est une condition d’application de la règle. Pendant la dérivation, quand le moteur cherche à appliquer une règle, il vérifie d’abord le contexte : la règle ne s’applique que si les voisins du symbole correspondent. Le contexte est seulement testé — jamais modifié ni produit.

Contexte positif

 

 

Produit : Pa Dha Ni Sa Re Dhaseul le premier Dha (précédé de Pa) se développe en Dha Ni Sa ; le second (précédé de Re) reste inchangé. Pa est testé, pas consommé : il demeure dans la sortie. C’est la sensibilité au contexte d’un raga — une même note se prolonge différemment selon ce qui précède.

Contexte négatif

 

 

Produit : Sa Ga Re Ga Pa#(Sa) signifie « sauf si précédé de Sa » : le Ga juste après la tonique est laissé tel quel ; l’autre Ga se développe en Ga Pa.

Combinaison

On peut cumuler les deux côtés : (Pa) Dha #(Sa) -> Dha Ni n’applique la règle que si Dha est précédé de Pa et pas suivi de Sa.

Les contextes sont l’outil de la sensibilité au contexte (context-sensitivity, voir L1). Ils permettent de construire des grammaires dont les règles dépendent de l’environnement local — ce qui rend les grammaires BP3 plus puissantes que les simples grammaires hors-contexte (CFG, Type 2 de Chomsky).


Récapitulatif : quel outil pour quel besoin ?

Besoin Outil Exemple
Capturer un symbole présent, le réinjecter wildcard ? ?1 ?2 -> ?2 ?1
Répéter un motif à l’identique variable $\vert$x$\vert$ S -> $\vert$x$\vert$ - $\vert$x$\vert$
Répéter un motif en le transformant homomorphisme / &[sub:…] | S -> $X &X[sub:abc]`
Conditionner par les voisins contexte () (A) C -> D E
Exclure un voisin négation #() #(X) Z -> W

Ce qu’il faut retenir

  1. ? wildcards — capturent un symbole déjà présent et le réinjectent (groupes de capture) ; transformations locales
  2. |x| variables — dérivent un contenu une seule fois et le répètent à l’identique (tihāī) ; à distinguer du non-terminal, qui se redérive à chaque fois
  3. $/& homomorphismes — répètent un motif en le transformant (maître/esclave → (=)/(:)) ; formes musicales (ABA, thème et variations)
  4. () est une condition d’application de la règle (voisinage positif), #() sa négation — testée pendant la dérivation
  5. Ces mécanismes rendent les grammaires BPscript plus puissantes que les CFG — elles sont context-sensitive (Type 1+)

Glossaire

  • Wildcard : joker ? / ?n qui capture un symbole déjà présent (à gauche) et le réinjecte (à droite) — comme un groupe de capture d’expression régulière
  • Variable : |x| — liaison dont la première occurrence dérive un contenu et le fige ; les occurrences suivantes le répliquent à l’identique. Distincte du non-terminal, qui se redérive indépendamment à chaque fois
  • Homomorphisme : transformation préservant la structure, notée $ (maître) et & (reprise) → (=) / (:) en BP3 ; la reprise applique une table de substitution via [sub:table] (lib/sub.json) qui transforme chaque symbole (transposition, minorisation, bols résonants→secs…)
  • Contexte : condition d’application d’une règle, fondée sur les symboles voisins — positif (A B) ou négatif #(A B) — testée pendant la dérivation, jamais modifiée
  • Context-sensitive : grammaire dont les règles dépendent de l’environnement local du symbole réécrit (Type 1 de Chomsky)

Liens dans la série

  • S5 — Les directions de dérivation et la prolongation _
  • S6 — Guards [] comme autre mécanisme conditionnel (sur l’état global, pas les voisins)
  • B6 — Homomorphismes, variables et contexte dans BP3
  • L1 — Context-free vs context-sensitive dans la hiérarchie de Chomsky

Prérequis : S5, B6
Temps de lecture : 12 min
Tags : #BPscript #filtrage-motifs #homomorphismes #templates #BP3


Prochain article : S9 (à venir) — Les six couches : de la note au son


Retour à l’index