Files
AV-Live/sound_algo/examples/15_full_live_set.scd
T
L'électron rare de035a8596 Add 'sound_algo/' from commit '38b17c42a0b5d2c7f52a2ad600316282cc52a02d'
git-subtree-dir: sound_algo
git-subtree-mainline: b7940d650f
git-subtree-split: 38b17c42a0
2026-05-07 11:51:51 +02:00

275 lines
9.5 KiB
Markdown

// =====================================================================
// examples/15_full_live_set.scd -- Set live complet 30 minutes
//
// TITRE : Performance live structuree avec tous les outils
// DUREE : ~30 minutes
// NIVEAU : avance
// PREREQUIS : CHARGER TOUT (00_load.scd)
// + SETUP de live.scd (~drop ~breakdown ~vcfOn ...)
// + SETUP de fx_bus.scd (~send ~fxPreset)
// + SETUP de mixer.scd (~mixPreset ~setVol ~mute)
// + SETUP de scenes.scd (~saveScene ~loadScene)
//
// STRUCTURE DU SET (timeline en minutes)
// 00:00 INTRO drone + ambient + buildup (4 min)
// 04:00 DROP 1 techno minimal (6 min) avec mute/solo/tweaks
// 10:00 ACID multi-mel + LFO cutoff + drop (6 min)
// 16:00 BREAKDOWN chord prog + reverb tail (4 min)
// 20:00 DROP 2 hard kit + bitcrush + glitch (4 min)
// 24:00 TRANCE seqBuildup + seqDrop final (3 min)
// 27:00 OUTRO masterFadeOut 4 min
//
// CONVENTION
// Tu evalues UN BLOC a chaque transition (les tags [00:00] etc.
// indiquent le temps suggere). Entre les blocs, tu fais des tweaks
// libres (changer ~melodyCutoff, lancer un ~drop, etc.).
// =====================================================================
// --- [etape 0] VERIFICATIONS ---------------------------------------
(
var ok = true;
if (~reload.isNil) { "!!! engine pas charge".postln; ok = false };
if (~drop.isNil) { "!!! live.scd SETUP manquant".postln; ok = false };
if (~send.isNil) { "!!! fx_bus.scd SETUP manquant".postln; ok = false };
if (~mixPreset.isNil) { "!!! mixer.scd SETUP manquant".postln; ok = false };
if (~saveScene.isNil) { "!!! scenes.scd SETUP manquant".postln; ok = false };
if (ok) { "=== TOUS LES MODULES SONT PRETS ===".postln };
)
// --- [00:00] INTRO -- drone + ambient + buildup -------------------
// On part d'un mix vide, on monte progressivement.
// masterVol bas + reverb saturee = ambiance ouverture.
(
~bpm = 124; TempoClock.default.tempo = ~bpm / 60;
~kickAmp = 0; ~hatAmp = 0; ~snareAmp = 0; ~clapAmp = 0; ~percAmp = 0;
~acidAmp = 0; ~melodyAmp = 0; ~harmonyAmp = 0;
~melodyInst = \warmPad;
~melodyAttack = 0.8; ~melodyRelease = 2.0; ~melodyCutoff = 1500;
~harmonyInst = \drone;
~harmonyAttack = 1.0; ~harmonyRelease = 3.0; ~harmonyAmp = 0.0;
~harmonyNotes = [36,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,
36,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0];
~melodyNotes = ~m33.copy; // melodie ambient
~reload.value;
[\melodySeq, \harmonySeq].do { |k| Pdef(k).play };
~fxPreset.(\space); // shimmer + reverb + chorus
"=== [00:00] INTRO -- drone + ambient ===".postln;
)
// -- monter doucement ~melodyAmp et ~harmonyAmp en quelques etapes :
// attendre 30s avant le bloc suivant.
( ~melodyAmp = 0.10; ~harmonyAmp = 0.18; ~reload.value; ) // [00:30]
( ~melodyAmp = 0.16; ~harmonyAmp = 0.22; ~reload.value; ) // [01:30]
// --- [03:30] BUILDUP vers le drop techno -- 30s ------------------
// Snare roll + filtre qui s'ouvre + masterFadeIn.
(
~buildup.(30); // helper de live.scd : snare roll + open filter
~saveScene.(\preDrop1); // au cas ou
"=== [03:30] BUILDUP -- 30s ===".postln;
)
// --- [04:00] DROP 1 -- TECHNO MINIMAL -----------------------------
// Kit techno pur 4/4, melody en lead, ~mixPreset \drop.
(
~kickSteps = [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]; ~kickAmp = 0.6;
~kickFreq = 55; ~kickDecay = 0.32; ~kickDrive = 1.3; ~kickClick = 0.2;
~hatSteps = [0,0,1,0, 0,0,1,0, 0,0,1,0, 0,0,1,0]; ~hatAmp = 0.18;
~snareSteps = (0 ! 16); ~clapSteps = (0 ! 16); ~percSteps = (0 ! 16);
~melodyInst = \lead;
~melodyAttack = 0.012; ~melodyRelease = 0.25; ~melodyCutoff = 2400;
~melodyAmp = 0.18;
~melodyNotes = ~m1.copy;
~harmonyAmp = 0.10;
~reload.value;
[\kickSeq, \hatSeq, \melodySeq, \harmonySeq].do { |k| Pdef(k).play };
~fxPreset.(\trance); // rev + delay 1/8 + chorus
~mixPreset.(\drop);
~saveScene.(\drop1);
"=== [04:00] DROP 1 -- TECHNO MINIMAL ===".postln;
)
// -- laisser tourner 1 minute, puis tweaks libres :
// ( ~mute.(\hat); ) ;; couper le hat 16 beats
// ( ~unmute.(\hat); )
// ( ~setVol.(\acid, 1.4); ) ;; pousser l'acid
// ( ~drop.(4); ) ;; mini-drop interne
// --- [07:00] VARIATIONS DROP 1 -- mute / solo --------------------
( ~mute.(\hat); ) // hat coupee
// -- 8 beats
( ~unmute.(\hat); )
( ~focus.(\melody, 0.4); ) // melodie en avant, autres a 40%
// -- 16 beats
( ~unfocus.(); )
// --- [08:00] LFO sur le cutoff de la melodie ---------------------
( ~lfoTo.(\melodyCutoff, 0.25, 2000, \sin, 3500); )
// -- la melodie respire lentement (cycle 4s).
// --- [09:30] mini drop interne avant la transition ACID ----------
( ~drop.(4); )
// --- [10:00] TRANSITION VERS ACID --------------------------------
// On stoppe le LFO, on bascule sur \saw3 + acid, on enclenche
// le systeme multi-pistes melodiques.
(
~lfoStopVar.(\melodyCutoff);
~melodyInst = \saw3; ~melodyAmp = 0.18;
~acidAmp = 0.32;
~acidNotes = [36,36,48,36,39,36,43,39, 36,41,36,39,43,36,36,41];
~acidSlides = [0,0,1,0,0,0,0,1, 0,0,0,1,0,0,0,0];
~melodyNotes = ~m29.copy; // melodie acid
~reload.value;
Pdef(\acidSeq).play;
~mixPreset.(\acidFocus);
"=== [10:00] ACID JOURNEY ===".postln;
)
// --- [11:00] Multi-piste : ajouter m2 en pluck contrer la mel ----
// m2 est preconfiguree dans melodies/tracks.scd ; on la lance et
// on lui colle une counter-melody.
(
~melTrackSet.(\m2, \inst, \pluck);
~melTrackSet.(\m2, \notes, ~m25.copy);
~melTrackSet.(\m2, \pan, -0.4);
~melTrackOn.(\m2);
"=== m2 counter pluck ON ===".postln;
)
// --- [12:00] LFO drunk sur le BPM -- subtile derive --------------
( ~lfoTo.(\bpm, 0.05, 6, \drunk, 132); )
// --- [14:00] Drop interne (acid section) -------------------------
( ~drop.(4); )
// --- [15:30] BREAKDOWN -- chord prog + reverb tail ---------------
// On stoppe le LFO + acid + m2, on fait un breakdown.
(
~lfoStopVar.(\bpm);
TempoClock.default.tempo = 124 / 60; ~bpm = 124;
~melTrackOff.(\m2);
Pdef(\acidSeq).stop;
Pdef(\hatSeq).stop;
~breakdown.(8);
"=== [15:30] BREAKDOWN ===".postln;
)
// --- [16:00] CHORDS PROGRESSION -- Synthwave + harmony ----------
// chordsToMelody + chordsToHarmony pour empiler une nappe.
(
~melodyInst = \warmPad;
~melodyAttack = 0.4; ~melodyRelease = 1.5; ~melodyCutoff = 3500;
~melodyAmp = 0.16;
~melodyNotes = ~chordsToMelody.(~progSynthwave);
~harmonyInst = \strings;
~harmonyAttack = 0.5; ~harmonyRelease = 2.0; ~harmonyAmp = 0.16;
~harmonyDur = 1.0;
~harmonyNotes = ~chordsToHarmony.(~progSynthwave);
~kickAmp = 0; // pas de kick pendant le breakdown
~reload.value;
~fxPreset.(\dream);
~mixPreset.(\breakdown);
"=== [16:00] CHORDS SYNTHWAVE ===".postln;
)
// --- [18:00] REVERB TAIL puis BUILDUP final --------------------
( ~reverbTail.(8); ) // [18:00] tail 8s
( ~buildup.(30); ~saveScene.(\preDrop2); ) // [18:30] buildup 30s
// --- [20:00] DROP 2 -- HARD kit + bitcrush -----------------------
// Kit hardcore + bitcrush en send + masterSat.
(
~kickSteps = [1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0]; ~kickAmp = 0.7;
~kickFreq = 60; ~kickDecay = 0.25; ~kickDrive = 3.0; ~kickClick = 0.3;
~hatSteps = [1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1]; ~hatAmp = 0.10;
~clapSteps = [0,0,0,0, 1,0,0,0, 0,0,0,0, 1,0,0,0]; ~clapAmp = 0.4;
~melodyInst = \hardLead; ~melodyAmp = 0.22; ~melodyDrive = 3.0;
~melodyNotes = ~m67.copy; // melodie hardcore
~harmonyAmp = 0.0;
~reload.value;
[\kickSeq, \hatSeq, \clapSeq, \melodySeq].do { |k| Pdef(k).play };
~fxPreset.(\industrial);
~satOn !? { ~satOn.(0.4) }; // master saturation legere
~mixPreset.(\hardcore);
~saveScene.(\drop2);
"=== [20:00] DROP 2 -- HARD ===".postln;
)
// --- [22:00] GLITCH + bitcrush moments ---------------------------
( ~glitch.(2); )
// -- 8 beats
( ~bitCrushNow.(6, 8000, 1); )
// -- 8 beats
( ~stutter.(8, 1); )
// -- 8 beats
( ~freeze.(4); )
// --- [24:00] TRANSITION TRANCE -- seqBuildup + seqDrop -----------
// On stoppe les Pdef pour laisser ~seqXxx prendre le controle.
(
~satOff !? { ~satOff.() };
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq,
\acidSeq, \melodySeq, \harmonySeq].do { |k| Pdef(k).stop };
~bpm = 138; TempoClock.default.tempo = ~bpm / 60;
~melodyInst = \supersaw;
~melodyNotes = ~chordsToMelody.(~progTrance);
~reload.value;
~fxPreset.(\trance);
"=== [24:00] TRANCE -- seqBuildup ===".postln;
)
( ~seqBuildup.(16); ) // 16 mesures crescendo
// --- [26:00] DROP TRANCE FINAL -----------------------------------
( ~seqDrop.(); )
// -- attendre la fin de la sequence puis relancer un beat.
(
[\kickSeq, \hatSeq, \melodySeq, \harmonySeq].do { |k| Pdef(k).play };
~mixPreset.(\trance);
~saveScene.(\dropFinal);
"=== [26:00] TRANCE FINAL ===".postln;
)
// --- [27:00] OUTRO -- masterFadeOut 4 minutes -------------------
// ~masterFadeOut diminue masterVol vers 0 sur dur secondes.
// On laisse les Pdef tourner ; le silence vient progressivement.
(
~masterFadeOut.(240);
"=== [27:00] OUTRO -- fade-out 4 min ===".postln;
)
// -- patience : 4 minutes pour atteindre 0. Tu peux profiter.
// --- [31:00] STOP TOTAL -----------------------------------------
// Apres le fade, libere tout proprement.
(
~lfoStopAllVars !? { ~lfoStopAllVars.() };
~lfoStopAll !? { ~lfoStopAll.() };
~vcfOff !? { ~vcfOff.() };
~melTrackChoke !? { ~melTrackChoke.() };
[\kickSeq, \hatSeq, \snareSeq, \clapSeq, \percSeq,
\acidSeq, \melodySeq, \harmonySeq].do { |k| Pdef(k).stop };
~track !? { ~track.stop };
~masterLim !? { ~masterLim.free; ~masterLim = nil };
~scBus !? { ~scBus.free; ~scBus = nil };
"=== SET TERMINE -- merci ===".postln;
)