feat(sound): trance, psytrance, punkcore morceaux
CI build oscope-of / build-check (push) Has been cancelled
CI build oscope-of / build-check (push) Has been cancelled
Adds morceaux 12-14 to the concert setlist. 12_trance: supersaw pad (7-saw chord, gated) + rolling 16th bass + plucky lead arp + offbeat hat @ 138 BPM. 13_psytrance: interlocking kick+bass (bass on the 3 off-kick 16ths) + squelchy acid lead + psy zaps @ 145 BPM. 14_punkcore: power chords root+5th (8th downstroke) + d-beat drums + lead riff @ 156 BPM. All use ~ccNote, ~ccHarmony, wrist arm mappings, nil-guarded pose reads. boot.scd updated. 3/3 pass headless tests.
This commit is contained in:
@@ -178,6 +178,9 @@ Routine({
|
||||
"morceaux/09_trance_pluck.scd",
|
||||
"morceaux/10_industrial.scd",
|
||||
"morceaux/11_detroit.scd",
|
||||
"morceaux/12_trance.scd",
|
||||
"morceaux/13_psytrance.scd",
|
||||
"morceaux/14_punkcore.scd",
|
||||
].do { |f| (~base ++ f).load; 0.1.wait; };
|
||||
s.sync;
|
||||
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
// Trance -- kick 4/4 + rolling offbeat bass (e-and-a 16ths) + supersaw pad chord (gate)
|
||||
// + plucky lead arp + offbeat hat.
|
||||
// Bras hauts (ry/ly faibles) -> ouvre filtre pad + lead ; vitesse corps -> densite arp.
|
||||
// ~ccHarmony[\phrase] choisit la phrase lead ; [\pad] bright/dark -> base cutoff pad.
|
||||
(
|
||||
SynthDef(\cc_trance_kick, { |out=0, amp=0.55|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.35), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([160, 42], [0.08], \exp));
|
||||
var sig = SinOsc.ar(fenv) * env;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_trance_bass, { |out=0, freq=55, amp=0.30|
|
||||
var env = EnvGen.kr(Env.perc(0.004, 0.11), doneAction: 2);
|
||||
var raw = Saw.ar(freq.clip(20, 280));
|
||||
var flt = LPF.ar(raw, (freq * 2.5).clip(80, 600));
|
||||
var sig = (flt * env * 1.6).tanh;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_trance_lead, { |out=0, freq=440, cutoff=2000, amp=0.25, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.003, 0.16), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([cutoff * 2.5, cutoff], [0.06], \exp)).clip(80, 8000);
|
||||
var raw = (Saw.ar(freq.clip(60, 2200)) + Saw.ar(freq.clip(60, 2200) * 1.007)) * 0.5;
|
||||
var sig = RLPF.ar(raw, fenv, 0.2) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_trance_hat, { |out=0, amp=0.14, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.10), doneAction: 2);
|
||||
var sig = HPF.ar(WhiteNoise.ar, 8000) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_trance_pad, { |out=0, freq1=110, freq2=138, freq3=165, cutoff=1200, amp=0.0, gate=1|
|
||||
var detune = [1.0, 1.009, 0.991, 1.017, 0.983, 1.024, 0.976];
|
||||
var f1 = freq1.clip(40, 800);
|
||||
var f2 = freq2.clip(40, 800);
|
||||
var f3 = freq3.clip(40, 800);
|
||||
var raw = Mix.ar(Saw.ar(detune * f1) + Saw.ar(detune * f2) + Saw.ar(detune * f3)) * 0.03;
|
||||
var aeg = EnvGen.kr(Env.asr(2.0, 1, 3.0), gate, doneAction: 2);
|
||||
var sig = RLPF.ar(raw, cutoff.clip(150, 8000), 0.55) * aeg;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp.lag(1.5));
|
||||
}).add;
|
||||
|
||||
~concertAdd.((
|
||||
name: "Trance", style: \trance,
|
||||
start: { |ctx|
|
||||
var f1 = ~ccNote.(0, 0).midicps;
|
||||
var f2 = ~ccNote.(2, 0).midicps;
|
||||
var f3 = ~ccNote.(4, 0).midicps;
|
||||
ctx[\phrases] = [
|
||||
[0, 2, 4, 7],
|
||||
[0, 2, 3, 7],
|
||||
[0, 4, 3, 5],
|
||||
[0, 3, 5, 4]
|
||||
];
|
||||
ctx[\pat] = ctx[\phrases][0];
|
||||
ctx[\step] = 0;
|
||||
ctx[\cut] = 1200.0;
|
||||
ctx[\dens] = 2;
|
||||
ctx[\pad] = Synth(\cc_trance_pad, [\freq1, f1, \freq2, f2, \freq3, f3,
|
||||
\cutoff, 1200, \amp, 0.28]);
|
||||
~concert[\clock] !? { |c| c.tempo = 138 / 60 };
|
||||
},
|
||||
update: { |ctx, pose|
|
||||
var hf = pose[\hands];
|
||||
var hiAvg = (1 - (((hf[\ry] ? 1) + (hf[\ly] ? 1)) * 0.5)).clip(0, 1);
|
||||
var pad = (~ccHarmony[\pad] ? \dark);
|
||||
var baseCut = (pad == \bright).if({ 1800 }, { 700 });
|
||||
var tgt = baseCut + (hiAvg * 4000);
|
||||
ctx[\cut] = (ctx[\cut] ? 1200) + ((tgt - (ctx[\cut] ? 1200)) * 0.08);
|
||||
ctx[\pad] !? { |p| p.set(\cutoff, ctx[\cut].clip(150, 8000)) };
|
||||
ctx[\dens] = ((pose[\kin][\speed] ? 0) > 0.3).if({ 1 }, { 2 });
|
||||
},
|
||||
tick: { |ctx, pose, beat|
|
||||
var sixteenth = (0.25 / ~ccCtlDur).round.max(1);
|
||||
var quarter = (1.0 / ~ccCtlDur).round.max(1);
|
||||
ctx[\pat] = ctx[\phrases].wrapAt(~ccHarmony[\phrase] ? 0);
|
||||
if(pose[\hasBody]) {
|
||||
if((beat % quarter) == 0) { Synth(\cc_trance_kick, [\amp, 0.55]) };
|
||||
if((beat % sixteenth == 0) and: { (beat % quarter) != 0 }) {
|
||||
Synth(\cc_trance_bass, [\freq, ~ccNote.(0, -1).midicps, \amp, 0.28]);
|
||||
};
|
||||
if((beat % (sixteenth * (ctx[\dens] ? 2))) == 0) {
|
||||
var deg = ctx[\pat].wrapAt(ctx[\step] ? 0);
|
||||
Synth(\cc_trance_lead, [\freq, ~ccNote.(deg, 0).midicps,
|
||||
\cutoff, (ctx[\cut] ? 1800).clip(400, 6000),
|
||||
\amp, 0.22, \pan, 0.4.rand2]);
|
||||
ctx[\step] = (ctx[\step] ? 0) + 1;
|
||||
};
|
||||
if((beat % quarter) == (quarter div: 2)) {
|
||||
Synth(\cc_trance_hat, [\amp, 0.14, \pan, 0.3.rand2]);
|
||||
};
|
||||
};
|
||||
},
|
||||
stop: { |ctx|
|
||||
ctx[\pad] !? { |s| s.set(\gate, 0) };
|
||||
~concert[\clock] !? { |c| c.tempo = 126 / 60 };
|
||||
},
|
||||
));
|
||||
"[morceau] Trance loaded".postln;
|
||||
)
|
||||
@@ -0,0 +1,91 @@
|
||||
// Psytrance -- kick sur le temps + rolling bass sur les 3 16es OFF-kick (e-and-a)
|
||||
// + acid lead squelchy RLPF + zaps psy occasionnels.
|
||||
// Vitesse corps -> resonance acid ; ropen -> taux de zaps.
|
||||
// Definitoire : bass CLAIREMENT entre les kicks (interlock kick+bass = rolling).
|
||||
(
|
||||
SynthDef(\cc_psy_kick, { |out=0, amp=0.62|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.32), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([150, 40], [0.08], \exp));
|
||||
var sig = SinOsc.ar(fenv) * env;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_psy_bass, { |out=0, freq=55, amp=0.32|
|
||||
var env = EnvGen.kr(Env.perc(0.003, 0.09), doneAction: 2);
|
||||
var raw = Saw.ar(freq.clip(20, 150)) + SinOsc.ar(freq.clip(20, 150));
|
||||
var flt = LPF.ar(raw * 0.5, (freq * 3).clip(100, 600));
|
||||
var sig = (flt * env).tanh;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_psy_acid, { |out=0, freq=110, cutoff=800, res=0.25, amp=0.28, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.005, 0.20), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([cutoff * 2.0, cutoff * 0.7], [0.12], \exp)).clip(80, 5000);
|
||||
var sig = Saw.ar(freq.clip(30, 880));
|
||||
var rq = res.clip(0.05, 0.5).linlin(0.05, 0.5, 0.6, 0.05);
|
||||
var flt = RLPF.ar(sig, fenv, rq);
|
||||
var out2 = (flt * env * 2.5).tanh;
|
||||
Out.ar(out, Pan2.ar(out2, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_psy_zap, { |out=0, freq=440, amp=0.18, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.08), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([freq * 4, freq * 0.5], [0.05], \exp)).clip(80, 8000);
|
||||
var sig = (SinOsc.ar(fenv) + (HPF.ar(WhiteNoise.ar, 3000) * 0.3)) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
|
||||
~concertAdd.((
|
||||
name: "Psytrance", style: \psy,
|
||||
start: { |ctx|
|
||||
ctx[\phrases] = [
|
||||
[0, 0, 2, 0, 4, 0, 3, 0],
|
||||
[0, 3, 0, 5, 0, 2, 0, 4],
|
||||
[0, 0, 7, 0, 5, 0, 3, 0],
|
||||
[0, 2, 0, 4, 0, 5, 0, 7]
|
||||
];
|
||||
ctx[\pat] = ctx[\phrases][0];
|
||||
ctx[\step] = 0;
|
||||
ctx[\cut] = 800.0;
|
||||
ctx[\res] = 0.25;
|
||||
ctx[\zapRate] = 16;
|
||||
~concert[\clock] !? { |c| c.tempo = 145 / 60 };
|
||||
},
|
||||
update: { |ctx, pose|
|
||||
var hf = pose[\hands];
|
||||
var speed = (pose[\kin][\speed] ? 0);
|
||||
ctx[\cut] = speed.linexp(0, 0.7, 300, 3500).clip(200, 4000);
|
||||
ctx[\res] = (hf[\ropen] ? 0.5).clip(0, 1).linlin(0, 1, 0.08, 0.45);
|
||||
ctx[\zapRate] = ((hf[\ropen] ? 0.5) > 0.65).if({ 8 }, { 24 });
|
||||
},
|
||||
tick: { |ctx, pose, beat|
|
||||
var sixteenth = (0.25 / ~ccCtlDur).round.max(1);
|
||||
var quarter = (1.0 / ~ccCtlDur).round.max(1);
|
||||
ctx[\pat] = ctx[\phrases].wrapAt(~ccHarmony[\phrase] ? 0);
|
||||
if(pose[\hasBody]) {
|
||||
// Kick sur le temps (4/4)
|
||||
if((beat % quarter) == 0) { Synth(\cc_psy_kick, [\amp, 0.62]) };
|
||||
// Rolling bass : les 3 16es OFF-kick (interlock)
|
||||
if((beat % sixteenth == 0) and: { (beat % quarter) != 0 }) {
|
||||
Synth(\cc_psy_bass, [\freq, ~ccNote.(0, -1).midicps, \amp, 0.28]);
|
||||
};
|
||||
// Acid lead 16e
|
||||
if((beat % sixteenth) == 0) {
|
||||
var deg = ctx[\pat].wrapAt(ctx[\step] ? 0);
|
||||
Synth(\cc_psy_acid, [\freq, ~ccNote.(deg, 0).midicps,
|
||||
\cutoff, (ctx[\cut] ? 800).clip(200, 4000),
|
||||
\res, (ctx[\res] ? 0.25).clip(0.05, 0.5),
|
||||
\amp, 0.24, \pan, 0.25.rand2]);
|
||||
ctx[\step] = (ctx[\step] ? 0) + 1;
|
||||
};
|
||||
// Zap/blip psy occasionnel
|
||||
if((beat % (quarter * (ctx[\zapRate] ? 16))) == 0) {
|
||||
var deg = [0, 2, 4, 7].choose;
|
||||
Synth(\cc_psy_zap, [\freq, ~ccNote.(deg, 1).midicps,
|
||||
\amp, 0.16, \pan, 0.5.rand2]);
|
||||
};
|
||||
};
|
||||
},
|
||||
stop: { |ctx|
|
||||
~concert[\clock] !? { |c| c.tempo = 126 / 60 };
|
||||
},
|
||||
));
|
||||
"[morceau] Psytrance loaded".postln;
|
||||
)
|
||||
@@ -0,0 +1,102 @@
|
||||
// Punkcore -- drums punk rapides (kick + snare backbeat + hats 8es) +
|
||||
// power chords root+quinte en croche + riff lead agressif.
|
||||
// Vitesse corps -> drive distorsion + densite lead ; ropen -> ouverture filtre chord.
|
||||
// Passe dans le rack FX maitre ; niveaux maittrises, le limiteur tient les pics.
|
||||
(
|
||||
SynthDef(\cc_punk_kick, { |out=0, amp=0.65|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.22), doneAction: 2);
|
||||
var fenv = EnvGen.kr(Env([130, 42], [0.06], \exp));
|
||||
var sig = SinOsc.ar(fenv) * env;
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_punk_snare, { |out=0, amp=0.42|
|
||||
var env = EnvGen.kr(Env.perc(0.002, 0.14), doneAction: 2);
|
||||
var body = SinOsc.ar(200) * EnvGen.kr(Env.perc(0.001, 0.08)) * 0.4;
|
||||
var noise = HPF.ar(WhiteNoise.ar, 1200) * env;
|
||||
var sig = (body + noise).clip2(0.8);
|
||||
Out.ar(out, Pan2.ar(sig, 0) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_punk_hat, { |out=0, amp=0.16, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.001, 0.04), doneAction: 2);
|
||||
var sig = HPF.ar(WhiteNoise.ar, 8000) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_punk_chord, { |out=0, freqR=110, freqF=165, cutoff=2500, drive=2.0, amp=0.35, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.005, 0.20), doneAction: 2);
|
||||
var r1 = Saw.ar(freqR.clip(40, 400));
|
||||
var r2 = Saw.ar(freqR.clip(40, 400) * 1.009);
|
||||
var f1 = Saw.ar(freqF.clip(60, 600));
|
||||
var f2 = Saw.ar(freqF.clip(60, 600) * 1.009);
|
||||
var raw = (r1 + r2 + f1 + f2) * 0.22;
|
||||
var flt = RLPF.ar(raw, cutoff.clip(200, 5000), 0.45);
|
||||
var sig = (flt * drive.clip(0.5, 6)).clip2(0.8) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
SynthDef(\cc_punk_lead, { |out=0, freq=440, amp=0.22, pan=0|
|
||||
var env = EnvGen.kr(Env.perc(0.003, 0.12), doneAction: 2);
|
||||
var raw = (Saw.ar(freq.clip(60, 2000)) + Saw.ar(freq.clip(60, 2000) * 1.007)) * 0.5;
|
||||
var flt = HPF.ar(raw, 300);
|
||||
var sig = (flt * 1.8).clip2(0.7) * env;
|
||||
Out.ar(out, Pan2.ar(sig, pan.clip(-1, 1)) * amp);
|
||||
}).add;
|
||||
|
||||
~concertAdd.((
|
||||
name: "Punkcore", style: \punk,
|
||||
start: { |ctx|
|
||||
ctx[\phrases] = [
|
||||
[0, 0, 2, 0],
|
||||
[0, 0, 3, 2],
|
||||
[0, 2, 0, 3],
|
||||
[0, 3, 2, 0]
|
||||
];
|
||||
ctx[\pat] = ctx[\phrases][0];
|
||||
ctx[\step] = 0;
|
||||
ctx[\drv] = 2.0;
|
||||
ctx[\cut] = 2500.0;
|
||||
ctx[\dens] = 2;
|
||||
~concert[\clock] !? { |c| c.tempo = 156 / 60 };
|
||||
},
|
||||
update: { |ctx, pose|
|
||||
var hf = pose[\hands];
|
||||
var speed = (pose[\kin][\speed] ? 0);
|
||||
ctx[\drv] = speed.linlin(0, 0.7, 1.2, 4.5).clip(0.8, 5.0);
|
||||
ctx[\cut] = (1 - (hf[\ropen] ? 0.5)).clip(0, 1).linexp(0, 1, 600, 5000);
|
||||
ctx[\dens] = (speed > 0.4).if({ 1 }, { 2 });
|
||||
},
|
||||
tick: { |ctx, pose, beat|
|
||||
var sixteenth = (0.25 / ~ccCtlDur).round.max(1);
|
||||
var quarter = (1.0 / ~ccCtlDur).round.max(1);
|
||||
var eighth = (0.5 / ~ccCtlDur).round.max(1);
|
||||
ctx[\pat] = ctx[\phrases].wrapAt(~ccHarmony[\phrase] ? 0);
|
||||
if(pose[\hasBody]) {
|
||||
// Kick sur chaque temps
|
||||
if((beat % quarter) == 0) { Synth(\cc_punk_kick, [\amp, 0.65]) };
|
||||
// Snare backbeat : temps 2 et 4 (toutes les 2 noires, decale d'une noire)
|
||||
if((beat % (quarter * 2)) == quarter) { Synth(\cc_punk_snare, [\amp, 0.42]) };
|
||||
// Hats 8es rapides
|
||||
if((beat % eighth) == 0) { Synth(\cc_punk_hat, [\amp, 0.16, \pan, 0.2.rand2]) };
|
||||
// Power chord en croche (root+quinte)
|
||||
if((beat % eighth) == 0) {
|
||||
var rootMidi = ~ccNote.(0, 0);
|
||||
Synth(\cc_punk_chord, [
|
||||
\freqR, rootMidi.midicps,
|
||||
\freqF, (rootMidi + 7).midicps,
|
||||
\cutoff, (ctx[\cut] ? 2500).clip(500, 5000),
|
||||
\drive, (ctx[\drv] ? 2.0),
|
||||
\amp, 0.30, \pan, 0]);
|
||||
};
|
||||
// Riff lead
|
||||
if((beat % (sixteenth * (ctx[\dens] ? 2))) == 0) {
|
||||
var deg = ctx[\pat].wrapAt(ctx[\step] ? 0);
|
||||
Synth(\cc_punk_lead, [\freq, ~ccNote.(deg, 1).midicps,
|
||||
\amp, 0.18, \pan, 0.4.rand2]);
|
||||
ctx[\step] = (ctx[\step] ? 0) + 1;
|
||||
};
|
||||
};
|
||||
},
|
||||
stop: { |ctx|
|
||||
~concert[\clock] !? { |c| c.tempo = 126 / 60 };
|
||||
},
|
||||
));
|
||||
"[morceau] Punkcore loaded".postln;
|
||||
)
|
||||
Reference in New Issue
Block a user