Files
AV-Live/sound_algo/live/live_fx_panel.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

827 lines
31 KiB
Markdown

// =====================================================================
// live_fx_panel.scd -- PANNEAU FX LIVE (tout-en-un)
//
// USAGE :
// 1. PREREQUIS -- evaluer les SETUP de :
// - engine.scd (charge avec CHARGER TOUT du 00_load.scd)
// - fx_bus.scd (Cmd+Entree sur le SETUP)
// - live.scd (Cmd+Entree sur le SETUP)
// 2. Lance une track ou les Pdef
// 3. Cmd+Entree sur n'importe quel bloc de ce panneau pour declencher l'effet
//
// Toutes les commandes sont protegees par garde `~helper !? { ... }`
// pour ne rien casser si un setup n'a pas ete evalue.
//
// CATEGORIES :
// [A] FX BUS DYNAMIQUE (send / setFx / preset / freeze)
// [B] LFO ASSIGNABLES (sur n'importe quelle variable)
// [C] VCF MASTER (8 types + presets)
// [D] TRICKS SCENIQUES (drop / breakdown / buildup / stutter ...)
// [E] FX MOMENTANES (bitcrush / ringmod / freqshift / granfreeze ...)
// [F] AUTO-PAN / TREMOLO
// [G] FX SYNTHS ONESHOT (riser / sweep / impact / crash / vinyl / gong ...)
// [H] FILLS RYTHMIQUES (snareFill / tomFill)
// [I] MASTER COMP / SAT
// [J] FX PAR GENRE (combos prets a l'emploi)
// [K] TAP TEMPO
// [L] FX BUS DETAIL (param par param par FX)
// [M] STOP ALL FX (reset global)
// =====================================================================
// =====================================================================
// [A] FX BUS DYNAMIQUE
// ~send.(\fx, amount) | ~setFx.(\fx, key, val) | ~fxPreset.(\preset)
// =====================================================================
// --- Sends raccourcis (par bus) -----
( ~sendReverb !? { ~sendReverb.(0.4) }; )
( ~sendDelay !? { ~sendDelay.(0.3) }; )
( ~sendChorus !? { ~sendChorus.(0.3) }; )
( ~sendPhaser !? { ~sendPhaser.(0.4) }; )
( ~sendFlanger !? { ~sendFlanger.(0.4) }; )
( ~sendBitcrush !? { ~sendBitcrush.(0.4) }; )
( ~sendTape !? { ~sendTape.(1.0) }; )
( ~sendShimmer !? { ~sendShimmer.(0.5) }; )
( ~sendDist !? { ~sendDist.(0.4) }; )
// --- Sends par FX/key (si tu veux varier) -----
( ~send !? { ~send.(\rev, 0.4) }; )
( ~send !? { ~send.(\dly, 0.3) }; )
( ~send !? { ~send.(\chr, 0.3) }; )
( ~send !? { ~send.(\phs, 0.4) }; )
( ~send !? { ~send.(\flg, 0.4) }; )
( ~send !? { ~send.(\crsh, 0.4) }; )
( ~send !? { ~send.(\tape, 1.0) }; )
( ~send !? { ~send.(\shim, 0.5) }; )
( ~send !? { ~send.(\dist, 0.4) }; )
// --- Tout couper (sec) -----
( ~send !? {
[\rev,\dly,\chr,\phs,\flg,\crsh,\tape,\shim,\dist].do { |k| ~send.(k, 0) };
}; )
// --- Reverb : mix max + room cathedrale -----
( ~setFx !? { ~setFx.(\rev, \mix, 0.7) }; )
( ~setFx !? { ~setFx.(\rev, \room, 0.97); ~setFx.(\rev, \damp, 0.1) }; )
// --- Reverb FREEZE on / off (drone infini) -----
( ~setFx !? { ~setFx.(\rev, \freeze, 1) }; )
( ~setFx !? { ~setFx.(\rev, \freeze, 0) }; )
// --- Crossfade entre 2 FX -----
( ~crossfadeFx !? { ~crossfadeFx.(\dly, \rev, 8) }; )
( ~crossfadeFx !? { ~crossfadeFx.(\dist, \shim, 4) }; )
// --- PRESETS FX (combo predefini sur le bus FX) -----
( ~fxPreset !? { ~fxPreset.(\dry) }; ) // tout off
( ~fxPreset !? { ~fxPreset.(\dub) }; ) // rev hall + delay long + tape
( ~fxPreset !? { ~fxPreset.(\space) }; ) // shimmer + reverb + chorus
( ~fxPreset !? { ~fxPreset.(\trance) }; ) // rev + delay 1/8 + chorus
( ~fxPreset !? { ~fxPreset.(\dubstep) }; ) // dist + bitcrush + reverb
( ~fxPreset !? { ~fxPreset.(\retro) }; ) // bitcrush + tape + chorus
( ~fxPreset !? { ~fxPreset.(\industrial) }; ) // dist + flanger + bitcrush
( ~fxPreset !? { ~fxPreset.(\dream) }; ) // shimmer + reverb + chorus
( ~fxPreset !? { ~fxPreset.(\cosmic) }; ) // phaser LFO + shimmer + reverb
( ~fxPreset !? { ~fxPreset.(\drone) }; ) // reverb FROZEN + shimmer
// =====================================================================
// [B] LFO ASSIGNABLES (~lfoTo / ~lfoSync)
// shape : \sin \tri \saw \sqr \rand \smoothRand \drunk \noise
// =====================================================================
// --- LFO sin sur cutoff melody (rate 0.5Hz, depth 1500, center 2500) -----
( ~lfoTo !? { ~lfoTo.(\melodyCutoff, 0.5, 1500, \sin, 2500) }; )
// --- LFO triangle slow sur cutoff acid -----
( ~lfoTo !? { ~lfoTo.(\acidCutoff, 0.25, 800, \tri, 1000) }; )
// --- LFO saw rising (montee progressive) sur cutoff melody -----
( ~lfoTo !? { ~lfoTo.(\melodyCutoff, 0.2, 2500, \saw, 3000) }; )
// --- LFO sqr asymetrique (pulseWidth=0.3) sur kickAmp -> rythmique -----
( ~lfoTo !? { ~lfoTo.(\kickAmp, 2, 0.2, \sqr, 0.5, true, 0.3) }; )
// --- LFO random (sample-and-hold) sur amp acid -----
( ~lfoTo !? { ~lfoTo.(\acidAmp, 4, 0.15, \rand, 0.32) }; )
// --- LFO smooth random sur amp harmony -----
( ~lfoTo !? { ~lfoTo.(\harmonyAmp, 0.3, 0.08, \smoothRand, 0.14) }; )
// --- LFO drunken walk sur drive melody -----
( ~lfoTo !? { ~lfoTo.(\melodyDrive, 0.1, 0.8, \drunk, 1.2) }; )
// --- LFO noise pure (chaos) sur Rq melody -----
( ~lfoTo !? { ~lfoTo.(\melodyRq, 5, 0.2, \noise, 0.3) }; )
// --- LFO sin sur wobbleRate (bass design en wobble) -----
( ~lfoTo !? { ~lfoTo.(\melodyWobbleRate, 0.1, 4, \sin, 6) }; )
// --- LFO SYNC TEMPO : 1 cycle complet sur N beats -----
( ~lfoSync !? { ~lfoSync.(\melodyCutoff, 4, 1500, \sin, 2500) }; ) // 4 beats
( ~lfoSync !? { ~lfoSync.(\acidCutoff, 8, 600, \sin, 800) }; ) // 8 beats
( ~lfoSync !? { ~lfoSync.(\melodyAmp, 0.25, 0.1, \tri, 0.16) }; ) // 1/4 beat = 16eme
// --- Stop UN LFO precis -----
( ~lfoStopVar !? { ~lfoStopVar.(\melodyCutoff) }; )
( ~lfoStopVar !? { ~lfoStopVar.(\acidCutoff) }; )
( ~lfoStopVar !? { ~lfoStopVar.(\kickAmp) }; )
// --- Stop tous les LFO de variables (~xxx) -----
( ~lfoStopAllVars !? { ~lfoStopAllVars.() }; )
// --- Stop TOUT (LFO vars + LFO FX) -----
( ~lfoStopEverything !? { ~lfoStopEverything.() }; )
// --- Liste les LFO actifs -----
( ~lfoList !? { ~lfoList.() }; )
// --- LFO sur PARAM FX (sur le bus FX, different de ~lfoTo) -----
( ~lfo !? { ~lfo.(\dly, \feedback, 0.1, 0.2, 0.85, \sin) }; )
( ~lfo !? { ~lfo.(\rev, \mix, 0.05, 0.1, 0.7, \tri) }; )
( ~lfo !? { ~lfo.(\crsh, \bits, 0.2, 4, 12, \sqr) }; )
( ~lfo !? { ~lfo.(\phs, \rate, 0.02, 0.1, 1.5, \sin) }; )
( ~lfo !? { ~lfo.(\shim, \shimmer, 0.1, 0.2, 0.8, \rand) }; )
// --- Stop un LFO FX precis -----
( ~lfoStop !? { ~lfoStop.(\dly, \feedback) }; )
// --- Stop tous les LFO FX (sans toucher aux LFO vars) -----
( ~lfoStopAll !? { ~lfoStopAll.() }; )
// =====================================================================
// [C] VCF MASTER (filtre insere sur tout le mix)
// types : \moog \ms20 \ladder \formant \comb \hpf \bpf \notch
// =====================================================================
// --- Activation par type -----
( ~vcfOn !? { ~vcfOn.(\moog, 800, 0.7) }; ) // 4-pole vintage
( ~vcfOn !? { ~vcfOn.(\ms20, 900, 0.6) }; ) // Sallen-Key agressif
( ~vcfOn !? { ~vcfOn.(\ladder, 900, 0.5) }; ) // 24 dB/oct
( ~vcfOn !? { ~vcfOn.(\formant, 0, 0.15) }; ) // freq=vowel index 0..4
( ~vcfOn !? { ~vcfOn.(\comb, 220, 1.5) }; ) // resonator
( ~vcfOn !? { ~vcfOn.(\hpf, 400, 0.5) }; ) // HPF resonant
( ~vcfOn !? { ~vcfOn.(\bpf, 1200, 0.4) }; ) // BPF resonant
( ~vcfOn !? { ~vcfOn.(\notch, 1000, 0.3) }; ) // BRF (anti-bande)
// --- Set un parametre du VCF actif -----
( ~vcfSet !? { ~vcfSet.(\freq, 1500) }; )
( ~vcfSet !? { ~vcfSet.(\freq, 350) }; )
( ~vcfSet !? { ~vcfSet.(\mix, 0.8) }; )
// --- Sweep automatique du cutoff -----
( ~vcfSweep !? { ~vcfSweep.(200, 5000, 4) }; ) // up 4s
( ~vcfSweep !? { ~vcfSweep.(8000, 200, 4) }; ) // down 4s
( ~vcfSweep !? { ~vcfSweep.(400, 6000, 8, \exp) }; )
// --- PRESETS VCF -----
( ~vcfPreset !? { ~vcfPreset.(\acid) }; ) // moog 600 q=0.85
( ~vcfPreset !? { ~vcfPreset.(\dub) }; ) // ladder 900 q=0.5
( ~vcfPreset !? { ~vcfPreset.(\deep) }; ) // moog 400 q=0.4
( ~vcfPreset !? { ~vcfPreset.(\bright) }; ) // bpf 3500 q=0.4
( ~vcfPreset !? { ~vcfPreset.(\dark) }; ) // moog 250 q=0.3
( ~vcfPreset !? { ~vcfPreset.(\formantA) }; )
( ~vcfPreset !? { ~vcfPreset.(\formantE) }; )
( ~vcfPreset !? { ~vcfPreset.(\formantI) }; )
( ~vcfPreset !? { ~vcfPreset.(\formantO) }; )
( ~vcfPreset !? { ~vcfPreset.(\formantU) }; )
// --- VCF off -----
( ~vcfOff !? { ~vcfOff.() }; )
// =====================================================================
// [D] TRICKS SCENIQUES (~drop / ~breakdown / ~buildup / ~stutter ...)
// =====================================================================
// --- DROP : silence -> fill -> freeze -> blast -----
( ~drop !? { ~drop.(4) }; ) // build 4s
( ~drop !? { ~drop.(8) }; ) // build 8s
// --- BREAKDOWN progressif -----
( ~breakdown !? { ~breakdown.(8) }; )
( ~breakdown !? { ~breakdown.(16) }; )
// --- BUILDUP crescendo (riser + filterSweepUp) -----
( ~buildup !? { ~buildup.(8) }; )
( ~buildup !? { ~buildup.(16) }; )
// --- HANDS UP : sub mute + lead boost + delay courte -----
( ~handsUp !? { ~handsUp.() }; )
// --- STUTTER master (gate rythmique sur amps) -----
( ~stutter !? { ~stutter.(8, 1) }; ) // 8Hz pendant 1s
( ~stutter !? { ~stutter.(16, 0.5) }; ) // 16Hz pendant 0.5s
( ~stutter !? { ~stutter.(4, 2) }; ) // 4Hz pendant 2s
// --- GLITCH : bitcrush + stutter + delay courte -----
( ~glitch !? { ~glitch.(2) }; )
( ~glitch !? { ~glitch.(4) }; )
// --- FREEZE : reverb freeze + cut sec -----
( ~freeze !? { ~freeze.(4) }; )
( ~freeze !? { ~freeze.(8) }; )
// --- REVERB TAIL : kill all + reverb send max + queue dur s -----
( ~reverbTail !? { ~reverbTail.(4) }; )
( ~reverbTail !? { ~reverbTail.(8) }; )
// --- TAPE STOP : ralenti tempo puis stop -----
( ~tapeStop !? { ~tapeStop.(2) }; )
( ~tapeStop !? { ~tapeStop.(4) }; )
// --- TAPE REVERSE : sweep + freeze -----
( ~tapeReverse !? { ~tapeReverse.(2) }; )
( ~tapeReverse !? { ~tapeReverse.(4) }; )
// --- JUMP CUT : silence sec dur s puis reprend -----
( ~jumpCut !? { ~jumpCut.(0.5) }; )
( ~jumpCut !? { ~jumpCut.(1) }; )
( ~jumpCut !? { ~jumpCut.(2) }; )
// --- SWAP scene A -> scene B (necessite ~scene) -----
( ~swap !? { ~swap.(\sceneA, \sceneB, 4) }; )
// --- CHOKE : coupe la rythmique / lead -----
( ~chokePerc !? { ~chokePerc.() }; )
( ~chokeLead !? { ~chokeLead.() }; )
// --- ENV one-shot sur une var (attack/sustain/release) -----
( ~envTo !? { ~envTo.(\melodyCutoff, 0.5, 1.0, 2.0, 6000, 1500) }; )
// --- ENV burst percussif sur une var -----
( ~envBurst !? { ~envBurst.(\acidCutoff, 4000, 0.3) }; )
// --- ENV sweep (monte/descend lineaire ou expo) -----
( ~envSweep !? { ~envSweep.(\melodyCutoff, 200, 6000, 4, \exp) }; )
( ~envSweep !? { ~envSweep.(\melodyCutoff, 6000, 200, 4, \exp) }; )
// --- Filter sweep raccourcis -----
( ~filterSweepUp !? { ~filterSweepUp.(4) }; )
( ~filterSweepDown !? { ~filterSweepDown.(4) }; )
// --- AMP DUCK momentane sur tous les amps -----
( ~ampDuck !? { ~ampDuck.(0.3, 0.7) }; )
( ~ampDuck !? { ~ampDuck.(0.6, 0.5) }; )
// --- Sidechain dynamique (kick -> cible) -----
( ~scTrigger !? { ~scTrigger.(\kick, \acid, 0.85) }; )
( ~scTrigger !? { ~scTrigger.(\kick, \melody, 0.6) }; )
( ~scTrigger !? { ~scTrigger.(\kick, \harmony, 0.6) }; )
( ~scTrigger !? { ~scTrigger.(\kick, \master, 0.7) }; )
// --- SC auto global (pompe sur tout le mix) -----
( ~scAuto !? { ~scAuto.(0.7) }; )
// --- SC off -----
( ~scOff !? { ~scOff.() }; )
// --- COMBOS sceniques -----
( ~breakdown !? { ~breakdown.(8); }; ~buildup !? { ~buildup.(8); }; ~drop !? { ~drop.(2); }; )
( ~vcfPreset !? { ~vcfPreset.(\acid) }; ~lfoSync !? { ~lfoSync.(\acidCutoff, 8, 600, \sin, 800) }; )
( ~scAuto !? { ~scAuto.(0.7) }; ~compOn !? { ~compOn.(\pump) }; ~satOn !? { ~satOn.(1.5) }; )
// =====================================================================
// [E] FX MOMENTANES (~bitCrushNow / ~ringMod / ~freqShift / ~granFreeze ...)
// =====================================================================
// --- SLIP TIME (pitch master sur dur s) -----
( ~slipTime !? { ~slipTime.(0.5, 1) }; ) // -1 octave 1s
( ~slipTime !? { ~slipTime.(2.0, 0.5) }; ) // +1 octave 0.5s
( ~slipTime !? { ~slipTime.(0.75, 2) }; ) // -3st 2s
// --- BITCRUSH momentane -----
( ~bitCrushNow !? { ~bitCrushNow.(4, 4000, 1) }; )
( ~bitCrushNow !? { ~bitCrushNow.(6, 8000, 2) }; )
( ~bitCrushNow !? { ~bitCrushNow.(3, 3000, 0.5) }; )
// --- RING MOD momentane -----
( ~ringMod !? { ~ringMod.(150, 1) }; )
( ~ringMod !? { ~ringMod.(300, 2) }; )
( ~ringMod !? { ~ringMod.(50, 0.5) }; )
// --- FREQ SHIFT momentane -----
( ~freqShift !? { ~freqShift.(50, 1) }; )
( ~freqShift !? { ~freqShift.(-100, 2) }; )
( ~freqShift !? { ~freqShift.(200, 0.5) }; )
// --- GRAN FREEZE momentane -----
( ~granFreeze !? { ~granFreeze.(2) }; )
( ~granFreeze !? { ~granFreeze.(4) }; )
// --- SCRATCH (vinyl-like) -----
( ~scratch !? { ~scratch.(1, 0.3) }; )
( ~scratch !? { ~scratch.(-1, 0.5) }; )
// --- BEAT REPEAT (gate stutter rythmique) -----
( ~repeat !? { ~repeat.(8, 1) }; )
( ~repeat !? { ~repeat.(16, 0.5) }; )
( ~repeat !? { ~repeat.(4, 2) }; )
// =====================================================================
// [F] AUTO-PAN / TREMOLO (par voix)
// =====================================================================
// --- AUTOPAN par voix (sur ~xxxPan) -----
( ~autoPan !? { ~autoPan.(\melody, 0.5, 0.8) }; )
( ~autoPan !? { ~autoPan.(\acid, 0.3, 0.6) }; )
( ~autoPan !? { ~autoPan.(\harmony, 0.2, 1.0) }; )
// --- TREMOLO par voix (LFO sur ~xxxAmp) -----
( ~tremolo !? { ~tremolo.(\melody, 5, 0.5) }; )
( ~tremolo !? { ~tremolo.(\acid, 8, 0.4) }; )
( ~tremolo !? { ~tremolo.(\harmony, 3, 0.6) }; )
// --- Stop l'auto-fx d'une voie -----
( ~stopAutoFx !? { ~stopAutoFx.(\melody) }; )
( ~stopAutoFx !? { ~stopAutoFx.(\acid) }; )
( ~stopAutoFx !? { ~stopAutoFx.(\harmony) }; )
// --- AUTOPAN / TREMOLO en SEND (sur le bus FX, voix indep) -----
( ~addFx !? { ~addFx.(\autopan, [\rate, 0.5, \depth, 1]) }; ~send !? { ~send.(\autopan, 1.0) }; )
( ~addFx !? { ~addFx.(\trem, [\rate, 6, \depth, 0.7]) }; ~send !? { ~send.(\trem, 1.0) }; )
// =====================================================================
// [G] FX SYNTHS ONESHOT (riser / sweep / impact / crash / vinyl / gong ...)
// =====================================================================
// --- RISER (montee filtree) -----
( Synth(\riser, [\dur, 4, \startCutoff, 200, \endCutoff, 8000, \amp, 0.25]); )
( Synth(\riser, [\dur, 8, \startCutoff, 300, \endCutoff, 10000, \amp, 0.30]); )
( Synth(\riser, [\dur, 16, \startCutoff, 400, \endCutoff, 12000, \amp, 0.35]); )
// --- SWEEP (descente filtree) -----
( Synth(\sweep, [\dur, 4, \startCutoff, 8000, \endCutoff, 200, \amp, 0.25]); )
( Synth(\sweep, [\dur, 8, \startCutoff, 12000, \endCutoff, 200, \amp, 0.35]); )
// --- IMPACT (sub-boom de drop) -----
( Synth(\impact, [\freq, 45, \decay, 1.5, \amp, 0.7]); )
( Synth(\impact, [\freq, 35, \decay, 2.5, \amp, 0.8]); )
( Synth(\impact, [\freq, 25, \decay, 4, \amp, 0.9]); ) // gabber
// --- CRASH (cymbale crash) -----
( Synth(\crash, [\decay, 2.0, \amp, 0.3]); )
( Synth(\crash, [\decay, 4.0, \amp, 0.4]); )
( Synth(\crash, [\decay, 6.0, \amp, 0.5]); )
// --- GONG (asia, decay long) -----
( Synth(\gong, [\freq, 50, \decay, 8, \amp, 0.5]); )
( Synth(\gong, [\freq, 40, \decay, 12, \amp, 0.6]); )
( Synth(\gong, [\freq, 25, \decay, 30, \amp, 0.95]); ) // drone doom
// --- VINYL (crackle continu) on / off -----
( ~vinyl !? { ~vinyl.free }; ~vinyl = Synth(\vinyl, [\amp, 0.05]); "vinyl ON".postln; )
( ~vinyl !? { ~vinyl.free }; ~vinyl = Synth(\vinyl, [\amp, 0.10]); "vinyl ON normal".postln; )
( ~vinyl !? { ~vinyl.free }; ~vinyl = Synth(\vinyl, [\amp, 0.15]); "vinyl ON fort".postln; )
( ~vinyl !? { ~vinyl.free; ~vinyl = nil }; "vinyl OFF".postln; )
// --- TAIKO / TOM / SNARE / CLAP / KICKS one-shots -----
( Synth(\taiko, [\freq, 80, \decay, 0.6, \amp, 0.5]); )
( Synth(\tom, [\freq, 120, \decay, 0.3, \amp, 0.5]); )
( Synth(\snare, [\amp, 0.5, \decay, 0.06, \freq, 220]); )
( Synth(\clap, [\amp, 0.4, \decay, 0.3]); )
( Synth(\kick808, [\freq, 35, \decay, 1.2, \amp, 0.7]); )
( Synth(\kickGabber, [\amp, 0.7]); )
// --- Cowbell, guzheng (asian) -----
( Synth(\cowbell, [\freq, 800, \decay, 0.2, \amp, 0.4]); )
( Synth(\guzheng, [\freq, 220, \amp, 0.18, \release, 1.0]); )
// --- SCRATCH SynthDef direct -----
( Synth(\scratch, [\dur, 0.2, \freq, 1000, \sweepDir, 1, \amp, 0.4]); )
( Synth(\scratch, [\dur, 0.3, \freq, 800, \sweepDir, -1, \amp, 0.4]); )
// =====================================================================
// [H] FILLS RYTHMIQUES
// =====================================================================
// --- Snare fill standard (8 hits / 1s) -----
( ~snareFill !? { ~snareFill.value }; )
// --- Snare fill long accelerando (16 hits / 2s) -----
( ~snareFill !? { ~snareFill.(16, 2, 0.2, 0.55) }; )
// --- Snare fill court rapide (32 hits / 1s -- roll) -----
( ~snareFill !? { ~snareFill.(32, 1, 0.15, 0.6) }; )
// --- Snare fill epique (32 hits / 16s, build) -----
( ~snareFill !? { ~snareFill.(32, 16, 0.2, 0.55) }; )
// --- Tom fill standard (descente 4 toms) -----
( ~tomFill !? { ~tomFill.value }; )
// =====================================================================
// [I] MASTER COMP / SAT
// =====================================================================
// --- Compresseur ON par preset -----
( ~compOn !? { ~compOn.(\soft) }; ) // glue tres leger
( ~compOn !? { ~compOn.(\glue) }; ) // glue (default)
( ~compOn !? { ~compOn.(\punch) }; ) // attack rapide
( ~compOn !? { ~compOn.(\pump) }; ) // sidechain-style
// --- Compresseur OFF -----
( ~compOff !? { ~compOff.() }; )
// --- Saturation ON par mode -----
( ~satOn !? { ~satOn.(1.5, 0) }; ) // tanh doux
( ~satOn !? { ~satOn.(2.0, 0) }; ) // tanh fort
( ~satOn !? { ~satOn.(2.0, 1) }; ) // softclip
( ~satOn !? { ~satOn.(1.8, 2) }; ) // fold (extreme)
// --- Saturation OFF -----
( ~satOff !? { ~satOff.() }; )
// =====================================================================
// [J] FX PAR GENRE (combos prets a l'emploi -- palette/fx_genre.scd)
// Chaque bloc = transition / signature scenique complete
// =====================================================================
// --- TRANCE BUILD-UP : snare roll + riser long + impact (16s) -----
(
~snareFill !? {
Synth(\riser, [\dur, 16, \startCutoff, 400, \endCutoff, 12000, \amp, 0.35]);
~snareFill.(32, 16, 0.2, 0.55);
fork {
16.wait;
Synth(\impact, [\freq, 35, \decay, 3, \amp, 0.7]);
Synth(\crash, [\decay, 4, \amp, 0.4]);
};
"=== TRANCE BUILD 16s ===".postln;
};
)
// --- DUBSTEP DROP : impact + crash + riser court (4s) -----
(
Synth(\riser, [\dur, 4, \startCutoff, 500, \endCutoff, 11000, \amp, 0.4]);
fork {
4.wait;
Synth(\impact, [\freq, 30, \decay, 3.5, \amp, 0.85]);
Synth(\crash, [\decay, 3, \amp, 0.5]);
};
"=== DUBSTEP DROP 4s ===".postln;
)
// --- HARDCORE GABBER DROP : impact massif + double crash -----
(
Synth(\impact, [\freq, 25, \decay, 4, \amp, 0.9]);
Synth(\crash, [\decay, 5, \amp, 0.6]);
fork { 0.5.wait; Synth(\crash, [\decay, 3, \amp, 0.4]); };
"=== HARDCORE DROP ===".postln;
)
// --- DnB BUILD : snare roll accelerando + drop (4s) -----
(
~snareFill !? {
~snareFill.(16, 4, 0.3, 0.6);
fork {
4.wait;
Synth(\impact, [\freq, 40, \decay, 2.5, \amp, 0.65]);
};
"=== DnB BUILD 4s ===".postln;
};
)
// --- ASIAN CINEMATIC : gong cascade descendant -----
(
[40, 50, 60, 70].do { |f, i|
fork { (i * 0.8).wait; Synth(\gong, [\freq, f, \decay, 8 - (i * 0.5), \amp, 0.45]); };
};
"=== GONG CASCADE 3s ===".postln;
)
// --- DUB TECHNO ECHO : clap dub avec delay -----
(
fork {
5.do { |i|
Synth(\clap, [\amp, 0.4 - (i * 0.06), \decay, 0.3]);
0.4.wait;
};
};
"=== DUB ECHO CLAP ===".postln;
)
// --- DETROIT FILTER SWEEP DOWN -----
( Synth(\sweep, [\dur, 8, \startCutoff, 12000, \endCutoff, 200, \amp, 0.35]); )
// --- INDUSTRIAL TENSION : sweep slow + drone vinyl (16s) -----
(
Synth(\sweep, [\dur, 16, \startCutoff, 8000, \endCutoff, 100, \amp, 0.4]);
~vinyl !? { ~vinyl.free };
~vinyl = Synth(\vinyl, [\amp, 0.12]);
fork { 16.wait; ~vinyl !? { ~vinyl.free; ~vinyl = nil }; };
"=== INDUSTRIAL TENSION 16s ===".postln;
)
// --- GLITCH IDM : scratch + impacts random -----
(
fork {
8.do {
if (0.6.coin) { Synth(\scratch, [\dur, rrand(0.1, 0.4), \freq, rrand(400, 2000),
\sweepDir, [-1, 1].choose, \amp, 0.3]) };
if (0.3.coin) { Synth(\impact, [\freq, rrand(40, 80), \decay, rrand(0.5, 1.5),
\amp, 0.4]) };
rrand(0.15, 0.5).wait;
};
};
"=== GLITCH 8 hits 4s ===".postln;
)
// --- VOCAL TRANCE SWELL : riser + crash + impact (12s) -----
(
Synth(\riser, [\dur, 12, \startCutoff, 600, \endCutoff, 13000, \amp, 0.4]);
fork {
12.wait;
Synth(\impact, [\freq, 38, \decay, 3, \amp, 0.7]);
Synth(\crash, [\decay, 5, \amp, 0.45]);
};
"=== VOCAL TRANCE SWELL 12s ===".postln;
)
// --- TRIBAL TOM ROLL DESCENDANT (taiko) -----
(
[180, 140, 110, 85, 70, 55, 40].do { |f, i|
fork { (i * 0.12).wait; Synth(\taiko, [\freq, f, \decay, 0.6, \amp, 0.5]); };
};
"=== TRIBAL TOM ROLL ===".postln;
)
// --- DRONE DOOM : gong tres profond (30s) -----
(
Synth(\gong, [\freq, 25, \decay, 30, \amp, 0.95]);
fork { 5.wait; Synth(\gong, [\freq, 30, \decay, 25, \amp, 0.7]); };
"=== DRONE DOOM gong massif 30s ===".postln;
)
// --- HARDSTYLE BUILD : kick reverse + snare roll + impact (4s) -----
(
Synth(\sweep, [\dur, 4, \startCutoff, 200, \endCutoff, 8000, \amp, 0.45]);
fork {
4.wait;
Synth(\impact, [\freq, 30, \decay, 3.5, \amp, 0.85]);
Synth(\kickGabber, [\amp, 0.7]);
};
"=== HARDSTYLE BUILD 4s ===".postln;
)
// --- PHONK : vinyl + cowbell + 808 sub -----
(
~vinyl !? { ~vinyl.free };
~vinyl = Synth(\vinyl, [\amp, 0.15]);
fork {
4.do {
Synth(\cowbell, [\freq, 800, \decay, 0.2, \amp, 0.4]);
0.5.wait;
};
Synth(\kick808, [\freq, 35, \decay, 1.2, \amp, 0.7]);
};
"=== PHONK VINYL 2.5s ===".postln;
)
// --- FUTURE GARAGE : vocal-like swell + sub (6s) -----
(
Synth(\sweep, [\dur, 6, \startCutoff, 6000, \endCutoff, 800, \amp, 0.3]);
fork { 5.wait; Synth(\impact, [\freq, 40, \decay, 2.5, \amp, 0.55]); };
"=== FUTURE GARAGE SWELL 6s ===".postln;
)
// --- SCRATCH FX x4 -----
(
4.do { |i|
fork {
(i * 0.15).wait;
Synth(\scratch, [\dur, 0.2, \freq, 800 + (i * 200),
\sweepDir, [-1, 1].choose, \amp, 0.4]);
};
};
"=== SCRATCH x4 ===".postln;
)
// --- GLITCH STUTTER : impacts rapides random -----
(
fork {
16.do { |i|
Synth(\impact, [\freq, rrand(35, 60), \decay, 0.15, \amp, 0.4]);
rrand(0.06, 0.15).wait;
};
};
"=== GLITCH STUTTER 2s ===".postln;
)
// --- ASIAN MELODIC FILL (guzheng arpege descendant) -----
(
[79, 77, 75, 72, 70, 67, 65, 63, 60].do { |n, i|
fork {
(i * 0.15).wait;
Synth(\guzheng, [\freq, n.midicps, \amp, 0.18, \release, 1.0]);
};
};
"=== ASIAN GUZHENG FILL ===".postln;
)
// --- DROP CUT brutal : coupe tout + sweep down + impact (2s) -----
(
~reload !? {
Routine({
var oldKick = ~kickAmp; var oldHat = ~hatAmp; var oldClap = ~clapAmp;
~kickAmp = 0; ~hatAmp = 0; ~clapAmp = 0; ~reload.value;
Synth(\sweep, [\dur, 2, \startCutoff, 8000, \endCutoff, 200, \amp, 0.4]);
2.wait;
Synth(\impact, [\freq, 30, \decay, 3, \amp, 0.85]);
Synth(\crash, [\decay, 3, \amp, 0.4]);
~kickAmp = oldKick; ~hatAmp = oldHat; ~clapAmp = oldClap; ~reload.value;
}).play;
"=== DROP CUT 2s ===".postln;
};
)
// =====================================================================
// [K] TAP TEMPO (tap au moins 2 fois en rythme pour caler le delay)
// =====================================================================
// --- Tap (au moins 2 fois successifs) -----
( ~tap !? { ~tap.value }; )
( ~tap !? { ~tap.value }; )
( ~tap !? { ~tap.value }; )
( ~tap !? { ~tap.value }; )
// --- Reset du tap (efface l'historique) -----
( ~tapTempo !? { ~tapTempo[\last] = nil; "tap reset".postln }; )
// --- Set delayTime par division de tempo (sans tap) -----
( ~setFx !? { ~setFx.(\dly, \delayTime, 60 / TempoClock.default.tempo / 4) }; ) // 1/16
( ~setFx !? { ~setFx.(\dly, \delayTime, 60 / TempoClock.default.tempo / 2) }; ) // 1/8
( ~setFx !? { ~setFx.(\dly, \delayTime, 60 / TempoClock.default.tempo) }; ) // 1/4
( ~setFx !? { ~setFx.(\dly, \delayTime, 60 / TempoClock.default.tempo * 0.75) }; ) // 1/4 dotted
( ~setFx !? { ~setFx.(\dly, \delayTime, 60 / TempoClock.default.tempo * 2) }; ) // 1/2
// --- Tempo en live (BPM direct) -----
( TempoClock.default.tempo = 110/60; )
( TempoClock.default.tempo = 132/60; )
( TempoClock.default.tempo = 145/60; )
( TempoClock.default.tempo = 174/60; )
// =====================================================================
// [L] FX BUS DETAIL (param par param par FX)
// Pour chaque FX du bus, exposer les params principaux
// =====================================================================
// ---------- REVERB ----------
( ~setFx !? { ~setFx.(\rev, \mix, 0.4) }; ) // 0..1
( ~setFx !? { ~setFx.(\rev, \room, 0.5) }; ) // 0..1 (small room)
( ~setFx !? { ~setFx.(\rev, \room, 0.85) }; ) // hall
( ~setFx !? { ~setFx.(\rev, \room, 0.97) }; ) // cathedral
( ~setFx !? { ~setFx.(\rev, \damp, 0.6) }; ) // 0=brillant, 1=mat
( ~setFx !? { ~setFx.(\rev, \damp, 0.1) }; ) // tres brillant
( ~setFx !? { ~setFx.(\rev, \freeze, 1) }; )
( ~setFx !? { ~setFx.(\rev, \freeze, 0) }; )
// ---------- DELAY ----------
( ~setFx !? { ~setFx.(\dly, \delayTime, 0.375) }; ) // 1/8 a 120bpm
( ~setFx !? { ~setFx.(\dly, \delayTime, 0.5) }; ) // 1/4
( ~setFx !? { ~setFx.(\dly, \delayTime, 0.25) }; ) // 1/8 a 120
( ~setFx !? { ~setFx.(\dly, \feedback, 0.5) }; ) // normal
( ~setFx !? { ~setFx.(\dly, \feedback, 0.85) }; ) // self-oscillating
( ~setFx !? { ~setFx.(\dly, \feedback, 0.2) }; ) // 2 echos
( ~setFx !? { ~setFx.(\dly, \mix, 0.5) }; )
( ~setFx !? { ~setFx.(\dly, \color, 0.3) }; ) // 0=tape dark, 1=clean
// ---------- CHORUS ----------
( ~setFx !? { ~setFx.(\chr, \rate, 0.4) }; )
( ~setFx !? { ~setFx.(\chr, \rate, 1.5) }; ) // rapide
( ~setFx !? { ~setFx.(\chr, \depth, 0.005) }; ) // subtil
( ~setFx !? { ~setFx.(\chr, \depth, 0.015) }; ) // large
( ~setFx !? { ~setFx.(\chr, \mix, 0.5) }; )
// ---------- PHASER ----------
( ~setFx !? { ~setFx.(\phs, \rate, 0.3) }; )
( ~setFx !? { ~setFx.(\phs, \rate, 0.05) }; ) // tres slow
( ~setFx !? { ~setFx.(\phs, \depth, 0.7) }; )
( ~setFx !? { ~setFx.(\phs, \depth, 1.0) }; )
( ~setFx !? { ~setFx.(\phs, \feedback, 0.4) }; )
( ~setFx !? { ~setFx.(\phs, \feedback, 0.85) }; ) // self-osc
( ~setFx !? { ~setFx.(\phs, \mix, 0.5) }; )
// ---------- FLANGER ----------
( ~setFx !? { ~setFx.(\flg, \rate, 0.2) }; )
( ~setFx !? { ~setFx.(\flg, \rate, 0.05) }; ) // jet plane slow
( ~setFx !? { ~setFx.(\flg, \depth, 0.003) }; )
( ~setFx !? { ~setFx.(\flg, \depth, 0.008) }; ) // tres prononce
( ~setFx !? { ~setFx.(\flg, \feedback, 0.6) }; )
( ~setFx !? { ~setFx.(\flg, \feedback, 0.9) }; ) // metallic
( ~setFx !? { ~setFx.(\flg, \mix, 0.5) }; )
// ---------- BITCRUSH ----------
( ~setFx !? { ~setFx.(\crsh, \bits, 8) }; ) // 8bit
( ~setFx !? { ~setFx.(\crsh, \bits, 4) }; ) // 4bit
( ~setFx !? { ~setFx.(\crsh, \bits, 2) }; ) // 2bit destroy
( ~setFx !? { ~setFx.(\crsh, \sampleRate, 8000) }; ) // lo-fi
( ~setFx !? { ~setFx.(\crsh, \sampleRate, 4000) }; ) // C64
( ~setFx !? { ~setFx.(\crsh, \sampleRate, 2000) }; ) // gameboy
( ~setFx !? { ~setFx.(\crsh, \mix, 0.6) }; )
// ---------- TAPE ----------
( ~setFx !? { ~setFx.(\tape, \drive, 1.5) }; )
( ~setFx !? { ~setFx.(\tape, \drive, 3.0) }; ) // saturated
( ~setFx !? { ~setFx.(\tape, \wow, 0.0015) }; )
( ~setFx !? { ~setFx.(\tape, \wow, 0.005) }; ) // wobble fort
( ~setFx !? { ~setFx.(\tape, \flutter, 0.0008) }; )
( ~setFx !? { ~setFx.(\tape, \flutter, 0.003) }; )
( ~setFx !? { ~setFx.(\tape, \mix, 1.0) }; )
// ---------- SHIMMER ----------
( ~setFx !? { ~setFx.(\shim, \shimmer, 0.5) }; )
( ~setFx !? { ~setFx.(\shim, \shimmer, 0.9) }; ) // octave-up tres present
( ~setFx !? { ~setFx.(\shim, \room, 0.92) }; )
( ~setFx !? { ~setFx.(\shim, \mix, 0.5) }; )
// ---------- DIST ----------
( ~setFx !? { ~setFx.(\dist, \drive, 3.0) }; )
( ~setFx !? { ~setFx.(\dist, \drive, 5.0) }; ) // industriel
( ~setFx !? { ~setFx.(\dist, \drive, 8.0) }; ) // wall of sound
( ~setFx !? { ~setFx.(\dist, \tone, 0.5) }; ) // 0=dark, 1=bright
( ~setFx !? { ~setFx.(\dist, \tone, 0.2) }; )
( ~setFx !? { ~setFx.(\dist, \tone, 0.8) }; )
( ~setFx !? { ~setFx.(\dist, \mix, 0.5) }; )
// ---------- FX additionnels (ajoutes via ~addFx) ----------
( ~addFx !? { ~addFx.(\ringmod, [\freq, 200, \mix, 0.5]) }; ~send !? { ~send.(\ringmod, 0.4) }; )
( ~addFx !? { ~addFx.(\fshift, [\shift, 80]) }; ~send !? { ~send.(\fshift, 0.3) }; )
( ~addFx !? { ~addFx.(\gran, [\grainDur, 0.15, \pitch, 0.5]) }; ~send !? { ~send.(\gran, 0.4) }; )
( ~addFx !? { ~addFx.(\comb, [\freq, 220, \decay, 2]) }; ~send !? { ~send.(\comb, 0.4) }; )
( ~addFx !? { ~addFx.(\formant, [\vowel, 0]) }; ~send !? { ~send.(\formant, 0.5) }; )
( ~addFx !? { ~addFx.(\autoflt, [\rate, 0.3, \lo, 200, \hi, 4000]) }; ~send !? { ~send.(\autoflt, 0.5) }; )
( ~addFx !? { ~addFx.(\stut, [\rate, 8, \dutyCycle, 0.5]) }; ~send !? { ~send.(\stut, 1.0) }; )
( ~addFx !? { ~addFx.(\reson, [\freq, 220, \decay, 3]) }; ~send !? { ~send.(\reson, 0.5) }; )
( ~addFx !? { ~addFx.(\spring, [\decay, 1.5]) }; ~send !? { ~send.(\spring, 0.4) }; )
( ~addFx !? { ~addFx.(\plate, [\decay, 2.5, \damp, 0.3]) }; ~send !? { ~send.(\plate, 0.4) }; )
// =====================================================================
// [M] STOP ALL FX (reset global -- panique mode)
// =====================================================================
// --- Stop tous les LFO (vars + FX) -----
( ~lfoStopEverything !? { ~lfoStopEverything.() }; )
// --- VCF off -----
( ~vcfOff !? { ~vcfOff.() }; )
// --- Comp / Sat off -----
( ~compOff !? { ~compOff.() }; )
( ~satOff !? { ~satOff.() }; )
// --- Reset FX bus (tout coupe) -----
( ~fxPreset !? { ~fxPreset.(\dry) }; )
// --- Stop autoFx par voix -----
( ~stopAutoFx !? { ~stopAutoFx.(\melody); }; )
( ~stopAutoFx !? { ~stopAutoFx.(\acid); }; )
( ~stopAutoFx !? { ~stopAutoFx.(\harmony); }; )
// --- Sidechain off -----
( ~scOff !? { ~scOff.() }; )
// --- Vinyl off -----
( ~vinyl !? { ~vinyl.free; ~vinyl = nil }; "vinyl OFF".postln; )
// --- Unfreeze reverb (au cas ou) -----
( ~setFx !? { ~setFx.(\rev, \freeze, 0) }; )
// --- RESET TOTAL : combine tout ce qui precede -----
(
~lfoStopEverything !? { ~lfoStopEverything.() };
~vcfOff !? { ~vcfOff.() };
~compOff !? { ~compOff.() };
~satOff !? { ~satOff.() };
~scOff !? { ~scOff.() };
~stopAutoFx !? { [\melody, \acid, \harmony].do { |t| ~stopAutoFx.(t) } };
~vinyl !? { ~vinyl.free; ~vinyl = nil };
~setFx !? { ~setFx.(\rev, \freeze, 0) };
~fxPreset !? { ~fxPreset.(\dry) };
"=== FX RESET TOTAL ===".postln;
)