// =====================================================================
//  00_load.scd  --  Loader / index du projet
//
//  STRUCTURE
//
//    setup.scd                Verification + init complete
//                             (~check / ~setupAll / ~setupLive /
//                              ~ensureLive / ~teardown)
//    engine.scd               Moteur (SynthDef base + Pdef + sidechain bus)
//    synth/                   SynthDef instruments (auto-loader _index.scd)
//                             drums/, bass/, lead/, pad/, world/, master/
//    fx/                      SynthDef effets (auto-loader _index.scd)
//                             bus/, insert/, trick/
//    palette/
//      scales.scd             Scales (mineur/dorian/.../hijaz/vietnam) +
//                             helpers genMelody/mutate/octavate/transpose/
//                             retrograde/densify/sparsify/jitter/
//                             genAcidNotes/Accents/Slides/genKickPattern/
//                             randomTweak (SOURCE UNIQUE)
//      melodies/              MODULE melodies (loader = melodies/index.scd)
//        helpers.scd            stretch/chain/mirror/sequenceUp/callResponse/...
//        short.scd              ~m1..~m78    (32 pas)
//        long.scd               ~ml1..~ml30  (64 pas)
//        xlong.scd              ~mxl1..~mxl15(96 pas)
//        epic.scd               ~mepic1..~mepic10 (128 pas)
//        bank.scd               ~melodyBank par genre + selecteurs
//        tracks.scd             multi-pistes melodiques (~melTrackAdd/On/...)
//      harmonics/             MODULE harmonie (loader = harmonics/index.scd)
//        helpers.scd            genThirdHarmony / genFifthHarmony / genCounter / ...
//        presets.scd            ~enableHarmony.(\preset) -- 10 presets (SOURCE UNIQUE)
//      rhythm/                MODULE rythmes / kicks / percussions
//        _index.scd             Auto-loader (charge fills/ + sequences/)
//        kicks/                 25 patterns + 12 timbres kick (1 fichier/preset)
//        percussions/           ~25 patterns clap/perc (1 fichier/preset)
//        drum_kits/             21 kits complets (1 fichier/kit)
//        patterns_genre/        40 patterns signature par genre (1 fichier/preset)
//        sequences/             Macros de sequences (~seqIntro/Buildup/Drop...)
//        fills/                 Snare fill / tom fill
//      timbres.scd            26 timbres melodie (L1-L26)
//      styles.scd             5 styles complets (Acid Rave, Dub, Hard...)
//      chords_progressions.scd ~35 progressions d'accords (auto + ~progXxx)
//      fx.scd                 Riser/sweep/impact/crash/vinyl
//      fx_genre.scd           Combos FX prets a l'emploi par genre
//      tweaks_template.scd    Templates de tweaks par genre
//    live/
//      _load.scd              Mini-loader API live (charge les 5 wrappers)
//      kicks.scd              WRAPPER ~k / ~kk -- combos kick (pattern+timbre)
//      melodies.scd           WRAPPER ~m / ~mm -- short/long/xlong/epic + harmonie
//      fx.scd                 WRAPPER ~fx / ~ff -- presets / drop / VCF / LFO
//      chains.scd             WRAPPER ~ch / ~cc -- intro/drop/breakdown/loops
//      patterns.scd           WRAPPER ~p -- kits + presets de genre rythmiques
//      live.scd               Boite a outils live (LFO, VCF, drops, tricks)
//      mixer.scd              Faders / mute / solo par voie + master
//      loops.scd              Gestionnaire de boucles / pistes (live)
//      fx_bus.scd             9 bus FX reverb/delay/chorus/... + presets
//      live_fx_panel.scd      PANNEAU FX LIVE tout-en-un (Cmd+Entree par bloc)
//      scenes.scd             Save / recall etat global (snapshot)
//      tweaks.scd             Tweaks live (cutoff, drive, mute, sidechain...)
//    control/
//      midi.scd               Mapping controller MIDI (CC + notes)
//      playlist.scd           11 playlists prefefinies + auto-fade
//      jump.scd               Lance n'importe quelle section de track directement
//    tracks/
//      A_acid_journey.scd ... W_dub_techno.scd  (23 tracks A->W)
//    examples/                Mini-tutoriels Cmd+Entree pas-a-pas (16 fichiers)
//      00_index.scd           Catalogue + parcours recommande
//      01_quickstart.scd      Premier "Hello, sound_algo"
//      02_first_track.scd     Lancer une track autonome
//      ...                    voir examples/00_index.scd
//
//  WORKFLOW
//    1. Cmd+Entree sur "CHARGER TOUT" -> tout est charge automatiquement
//       (engine + synthdefs + scales + melodies + harmonics + setup
//        helpers + boot serveur + live/* + rhythm/fills + sequences +
//        jump). Le bloc affiche un ~check.() final pour voir l'etat.
//    2. Lance une track (tracks/*.scd) ou les Pdef (PLAY VIDE / PLAY KICK
//       / PLAY DEFAULT plus bas dans ce fichier).
//    3. Cmd+Entree sur ( ~check.() ) a tout moment pour voir l'etat.
//    4. ( ~teardown.() ) pour stopper et liberer proprement.
//
//  Pour decouvrir le projet : ouvre examples/00_index.scd et suis le
//  parcours pas-a-pas.
// =====================================================================



// --- CHARGER TOUT (charge TOUT en un seul Cmd+Entree) ----------------
//   engine + synthdefs + scales + melodies + harmonics + setup helpers,
//   puis ~setupAll.() qui charge fx_bus + live + mixer + scenes + loops
//   + fills + sequences + jump apres boot serveur, puis ~check.() final.
//
//   Ce bloc est AUTONOME et sert aussi d'entree principale via .load.
(
// Auto-detect ~base from this file's location so the project is portable
// across machines (GrosMac dev path vs MBP /Users/electron/AV-Live/sound_algo/
// vs anywhere else). Falls back to the legacy hard-coded path only if the
// file isn't being executed from disk (rare — Cmd+Enter on a buffer).
~base = (thisProcess.nowExecutingPath !? { |p| p.dirname ++ "/" })
        ?? "/Users/electron/Documents/Projets_Creatifs/sound_algo-refonte-v2/";
"~base = ".post; ~base.postln;
(~base ++ "engine.scd").load;
(~base ++ "synth/_index.scd").load;
(~base ++ "fx/_index.scd").load;
(~base ++ "palette/scales.scd").load;
(~base ++ "palette/melodies/index.scd").load;
(~base ++ "palette/harmonics/index.scd").load;
(~base ++ "setup.scd").load;       // ~check / ~setupAll / ~setupLive / ~teardown
// NOTE : ~setupAll.() est appele par live/_load.scd ci-dessous (qui gere
// l'idempotence via ~setupAll_done). L'appeler ici en plus declenchait
// un DOUBLE BOOT : 1er ~setupAll lance s.waitForBoot async, puis le
// .load de live/_load.scd voit ~setupAll_done = nil et relance ~setupAll
// -> "address in use" + zombie scsynth. Fix : un seul appel via _load.
(~base ++ "live/_load.scd").load;   // boot + tous modules + wrappers API live
)


// --- CHARGER MINIMAL (engine + synthdefs + scales seulement) ---------
//   Pour debugger ou demarrer sans live/mixer/fx. Pas de boot serveur
//   automatique, pas de helpers ~check / ~setupAll.
(
// Auto-detect ~base from this file's location so the project is portable
// across machines (GrosMac dev path vs MBP /Users/electron/AV-Live/sound_algo/
// vs anywhere else). Falls back to the legacy hard-coded path only if the
// file isn't being executed from disk (rare — Cmd+Enter on a buffer).
~base = (thisProcess.nowExecutingPath !? { |p| p.dirname ++ "/" })
        ?? "/Users/electron/Documents/Projets_Creatifs/sound_algo-refonte-v2/";
(~base ++ "engine.scd").load;
(~base ++ "synth/_index.scd").load;
(~base ++ "fx/_index.scd").load;
(~base ++ "palette/scales.scd").load;
)


// --- CHARGER ENGINE SEUL (minimum vital) -----------------------------
(
(~base ++ "engine.scd").load;
)


// --- CHARGER SYNTH (tous les SynthDef instruments) -------------------
(
(~base ++ "synth/_index.scd").load;
)


// --- CHARGER FX (tous les SynthDef effets) ---------------------------
(
(~base ++ "fx/_index.scd").load;
)


// --- OUVRIR FICHIERS dans l'IDE -------------------------------------
//   Plusieurs blocs cibles : choisis celui dont tu as besoin (Cmd+Entree).
//   NB : les fichiers charges via CHARGER TOUT (engine, synthdefs, scales,
//        melodies/, harmonics/, rhythm/fills) ne sont PAS proposes ici --
//        leur contenu est interne et tu n'as pas a les editer en live.
// --------------------------------------------------------------------

// --- OUVRIR ESSENTIEL LIVE (outils performance + entree examples) ----
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
[
    "setup.scd",                       // ~check / ~setupAll / ~teardown
    "live/tweaks.scd",                 // tweaks live (cutoff/drive/mute/SC)
    "live/live_fx_panel.scd",          // PANNEAU FX tout-en-un
    "live/mixer.scd",                  // faders / mute / solo / master
    "live/scenes.scd",                 // save / recall snapshots
    "palette/rhythm/_index.scd",       // ~snareFill / ~tomFill / ~seqPlay (auto)
    "control/jump.scd",                // sauter dans une section
    "examples/00_index.scd",           // catalogue tutoriels
].do { |p| Document.open(root +/+ p) };
)


// --- OUVRIR OUTILS LIVE AVANCES (LFO/VCF/loops/FX bus/MIDI) ----------
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
[
    "live/live.scd",                   // LFO / VCF / drops / tricks
    "live/loops.scd",                  // gestionnaire de boucles
    "live/fx_bus.scd",                 // 9 bus FX + presets + tap tempo
    "control/midi.scd",                // mapping MIDI controller
    "control/playlist.scd",            // playlists auto-fade
].do { |p| Document.open(root +/+ p) };
)


// --- OUVRIR PALETTES PRESETS (Cmd+Entree sur un preset) --------------
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
[
    "palette/styles.scd",
    "palette/timbres.scd",
    "palette/chords_progressions.scd",
    "palette/fx_genre.scd",
    "palette/tweaks_template.scd",
    "palette/rhythm/_index.scd",       // loader recursif fills+sequences
    // NB : les presets rythmiques sont eclates en sous-dossiers
    //   palette/rhythm/{drum_kits,patterns_genre,kicks,percussions,sequences,fills}/
    //   1 fichier = 1 preset Cmd+Entree. Ouvre-les a la demande dans l'IDE.
].do { |p| Document.open(root +/+ p) };
)


// --- OUVRIR TRACKS (23 tracks A->W) ----------------------------------
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
PathName(root +/+ "tracks").files
    .select { |f| f.extension == "scd" }
    .sort   { |a, b| a.fileName < b.fileName }
    .do     { |f| Document.open(f.fullPath) };
)


// --- OUVRIR EXAMPLES (16 tutoriels Cmd+Entree pas-a-pas) -------------
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
PathName(root +/+ "examples").files
    .select { |f| f.extension == "scd" }
    .sort   { |a, b| a.fileName < b.fileName }
    .do     { |f| Document.open(f.fullPath) };
)


// --- OUVRIR TOUT (ancien comportement -- ~60 onglets, lourd) ---------
//   A eviter au quotidien -- prefere les blocs cibles ci-dessus.
(
var root = if (thisProcess.nowExecutingPath.notNil) { thisProcess.nowExecutingPath.dirname } { "/Users/electron/Documents/Projets_Creatifs/sound_algo" };
[
    "engine.scd",
    "synth/_index.scd", "fx/_index.scd",
    "palette/scales.scd",
    "palette/melodies/helpers.scd", "palette/melodies/short.scd",
    "palette/melodies/long.scd",    "palette/melodies/xlong.scd",
    "palette/melodies/epic.scd",    "palette/melodies/bank.scd",
    "palette/melodies/tracks.scd",
    "palette/harmonics/helpers.scd","palette/harmonics/presets.scd",
    "palette/rhythm/_index.scd",    "palette/fx.scd",
].do { |p| Document.open(root +/+ p) };
)


// --- PLAY VIDE -- demarre les sequencers en silence ------------------
//   Tous les patterns sont vides : tu construis au fur et a mesure.
//   Ex : ( ~kickSteps = [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]; ~reload.value; )
(
TempoClock.default.tempo = ~bpm / 60;
~kickSteps    = (0 ! 16);
~hatSteps     = (0 ! 16);
~snareSteps   = (0 ! 16);
~clapSteps    = (0 ! 16);
~percSteps    = (0 ! 16);
~acidNotes    = (0 ! 16);
~acidAccents  = (0 ! 16);
~acidSlides   = (0 ! 16);
~melodyNotes  = (0 ! 32);
~harmonyNotes = (0 ! 32);
~reload.value;
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq, \acidSeq, \melodySeq, \harmonySeq]
    .do { |k| Pdef(k).play };
"=== PLAY VIDE -- ajoute des steps puis ~reload.value ===".postln;
)


// --- PLAY KICK -- demarre avec juste un kick 4/4 ---------------------
//   Ajoute hat/snare/melody en tweakant les ~xxxSteps puis ~reload.value
(
TempoClock.default.tempo = ~bpm / 60;
~kickSteps    = [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0];
~hatSteps     = (0 ! 16);
~snareSteps   = (0 ! 16);
~clapSteps    = (0 ! 16);
~percSteps    = (0 ! 16);
~acidNotes    = (0 ! 16);
~acidAccents  = (0 ! 16);
~acidSlides   = (0 ! 16);
~melodyNotes  = (0 ! 32);
~harmonyNotes = (0 ! 32);
~reload.value;
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq, \acidSeq, \melodySeq, \harmonySeq]
    .do { |k| Pdef(k).play };
"=== PLAY KICK 4/4 ===".postln;
)


// --- PLAY DEFAULT -- ancien comportement (kick + hat + snare + acid) -
//   Lance avec les patterns par defaut definis dans engine.scd
(
TempoClock.default.tempo = ~bpm / 60;
~reload.value;
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq, \acidSeq, \melodySeq, \harmonySeq]
    .do { |k| Pdef(k).play };
"=== PLAY DEFAULT ===".postln;
)


// --- STOP -- coupe les sequencers (garde le master limiter) ----------
(
~track !? { ~track.stop };
~filterSweep !? { ~filterSweep.stop };
~randomLoop !? { ~randomLoop.stop };
~melodyEvolve !? { ~melodyEvolve.stop };
~lRotate !? { ~lRotate.stop };
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq, \acidSeq, \melodySeq, \harmonySeq]
    .do { |k| Pdef(k).stop };
"=== STOP ===".postln;
)


// --- ARRET TOTAL (libere bus + master) -------------------------------
(
~track !? { ~track.stop };
~filterSweep !? { ~filterSweep.stop };
~randomLoop !? { ~randomLoop.stop };
~melodyEvolve !? { ~melodyEvolve.stop };
~lRotate !? { ~lRotate.stop };
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq, \acidSeq, \melodySeq, \harmonySeq]
    .do { |k| Pdef(k).stop };
~masterLim !? { ~masterLim.free; ~masterLim = nil };
~scBus !? { ~scBus.free; ~scBus = nil };
"=== ARRET TOTAL ===".postln;
)
