"""
source_09.py — s09 · MUSICOTHÉRAPIE — RAGAS & INSTRUMENTS PAR CHAKRA
Série SOURCE ANNEXE FIABLE · généré depuis l'analyse gravée (Fable, 12 juil 2026).
Règle : zéro invention — tout champ provient de la planche ou d'un recoupement daté.
"""
from dataclasses import dataclass, field, asdict
import json
# ── SOCLE COMMUN (passe U6b — imbrication, GO Ben 13 juil 2026, 23h29) ────
# socle_corpus.py = clé de voûte du paquet corpus/ (types partagés · registre
# · GRAPHE des jonctions · VERDICTS D1-D6). Loi 2 du contrat : les jonctions
# CANONIQUES entre pièces (dNN/sNN) vivent UNE SEULE FOIS dans GRAPHE — la
# liste locale `jonctions` (cible/nature) reste une NOTE DE LECTURE de la
# planche (elle seule garde les liens hors-graphe : ici le talk daté
# 1983-02-02 Delhi, source primaire de la citation, pas une pièce dNN/sNN).
# Loi 3 : aucun verdict recopié — pointer VERDICTS[id].
ID_CORPUS = "s09"
try:
from socle_corpus import GRAPHE, VERDICTS, SOURCES as REGISTRE_SOURCES
JONCTIONS_SOCLE = [j for j in GRAPHE if ID_CORPUS in (j.a, j.b)]
MODE_ILOT = False
except ImportError: # exécution isolée : le module reste lisible en îlot
GRAPHE, VERDICTS, REGISTRE_SOURCES = [], {}, {}
JONCTIONS_SOCLE, MODE_ILOT = [], True
@dataclass
class Inscription:
texte: str
zone: str
statut: str = "\U0001f7e2"
@dataclass
class Jonction:
cible: str
nature: str
@dataclass
class Source:
sid: str = "s09"
titre: str = "MUSICOTHÉRAPIE — RAGAS & INSTRUMENTS PAR CHAKRA ET CANAL"
type_source: str = "tableau de musicothérapie SY — ragas/instruments par chakra et canal (LEFT/CENTER/RIGHT)"
origine: str = "compilation dévotionnelle francophone ('et' français dans le tableau) · photo Shri Mataji à l'harmonium en en-tête"
auteur_shri_mataji: bool = False
fiabilite: str = "\U0001f7e2 citation de Shri Mataji datée et sourcée (Vishuddhi, Delhi, 2 fév. 1983) · \U0001f7e1 tableau = compilation non officielle, orthographes fluctuantes (Bishmillah, Ramnat)"
inscriptions: list = field(default_factory=lambda: [
Inscription("…Music … has come out of God's love for us… in India, is based on AUM, and is "
"scientific…", "citation en-tête — verbatim"),
Inscription('"Vishuddhi Chakra" Delhi, India, 2nd February 1983', "source de la citation"),
Inscription("LEFT · CENTER · RIGHT", "colonnes du tableau — les 3 canaux"),
])
table_ragas: dict = field(default_factory=lambda: {
"Mooladhara": "Raga Shyam Kalyan — shennai (Ustad Bishmillah Khan, D)",
"Swadhistan": "G: Raga Gurjari Todi, sarangi · C/D: Raga Yaman, sarangi, Pandit Ram Narayan",
"Nabhi": "G: Raga Bhatyaar, violon, Kala Ramnat · C/D: Raga Abhogi, santoor, Pandit Shiv Kumar Sharma",
"Void": "Raga Malkhauns, sitar (Vilayat Khan, D)",
"Anahata": "G: Raga Bhairav, vocal, Gabriel Ion · C/D: Raga Durga, vocal, Rajan Sajan Mishra",
"Vishuddhi": "Raga Jaijaiwanti — flûte, Pt. Hariprasad Chaurasia (D)",
"Agnya": "G: Raga Bageshri, mohan vina, Pandit Vishwa Mohan Bhat · C/D: Raga Bhoopali, sarangi et violon, Ram Narayan et Krishnamurti",
"Sahasrara": "G: Raga Bhairavi, sitar, Ustad Vilayat Khan · C/D: Raga Darbari, sitar",
"Nadis": "G: Raga Miyan ki Todi, sarod, Amjad Ali Khan · C: Raga Jog, sitar, Shahid Parvez · D: Raga Maru Bihag, sarangi, Sultan Khan et Kamal Sabri",
})
caracteristiques: list = field(default_factory=lambda: [
"structure complète du système : 7 chakras + Void + Nadis × 3 canaux",
"application : musique classique indienne comme thérapie par centre",
"citation datée VÉRIFIABLE (conférence Vishuddhi, Delhi, 1983-02-02)",
])
jonctions: list = field(default_factory=lambda: [
Jonction("d04", "carte-mère — mêmes étages (7 chakras + Void)"),
Jonction("d08", "IDA & PINGALA — même logique gauche/centre/droite"),
Jonction("s18", "guide SY France — autre table de correspondances par chakra (jour/planète/pierre)"),
Jonction("talk 1983-02-02 Delhi", "source primaire de la citation — à vérifier sur amruta.org"),
])
en_attente: list = field(default_factory=lambda: [
"\U0001f7e1 auteur de la compilation non identifié",
"\U0001f7e1 orthographes des musiciens à normaliser (Bishmillah→Bismillah, Ramnat→Ramnath)",
])
def rapport(self) -> str:
etat_socle = ("îlot (socle_corpus non chargé)" if MODE_ILOT
else f"imbriqué — {len(JONCTIONS_SOCLE)} jonction(s) canoniques au GRAPHE")
return "\n".join([
f"[{self.sid}] {self.titre}",
f" origine : {self.origine}",
f" de la main de Shri Mataji : {self.auteur_shri_mataji}",
f" fiabilité : {self.fiabilite}",
f" lignes ragas : {len(self.table_ragas)} · jonctions : {len(self.jonctions)}",
f" SOCLE : {etat_socle}",
])
def to_json(self) -> str:
data = asdict(self)
data["id_corpus"] = ID_CORPUS
data["jonctions_canoniques"] = [asdict(j) for j in JONCTIONS_SOCLE]
data["mode_ilot"] = MODE_ILOT
return json.dumps(data, ensure_ascii=False, indent=2)
if __name__ == "__main__":
print(Source().rapport())