Files
L'électron rare 1ed006966c fix(sound-algo): merge 00_load into single TLB
BASE PATH block (TLB:1) and CHARGER TOUT block (TLB:2) shared the
same ~base auto-detect preamble. Merged into one block so .load
evaluates the full loader, not just the base-path setter.
2026-05-13 13:45:59 +02:00

323 lines
14 KiB
Plaintext

// =====================================================================
// 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;
)