antigone-child/antigone.scd

367 lines
10 KiB
Plaintext
Raw Permalink Normal View History

2018-06-26 08:22:07 +02:00
(/*
2018-06-26 08:27:28 +02:00
2018-06-26 08:22:07 +02:00
Copyright (c) 2018 Luka Prinčič, All rights reserved.
This program is free software distributed under
GNU General Public Licence. See COPYING for more info.
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
This is source code to Antigone/Child music release and
soundtrack to the stage piece by Matija Ferlin "Staging
a Play: Antigone" by Luka Prinčič. It replicates 6
tracks from the album and 6 tracks from the stage show.
If you openned this file in SuperCollider IDE, there are
two steps you have to do:
PART I:
Place the cursos anywhere between top parenthesis
and the closing one, which is the one above the line
that sais "Cooking Synths". In fact your cursor might
already at the begining of this file, which means you can
press CTRL+RETURN to run this part of code - booting and
preparing server. The code will flash, there is no sound
yet.)
PART II:
Scroll down to "Cooking Synths" and place the cursor inside
the first block (ACT I), and press CTRL+RETURN again. The
code will flash and slowly the sound should come in. If not,
check with CTRL+M to see meters and SC output visualy.
The piece will run out in about 5 minutes. Or you can
always stop it with CTRL+<PERIOD>. And run the next block.
Then play with parameters, break the code, start again.
Make music!
2018-06-26 08:22:07 +02:00
*/
// Be nice. Say hi!
postln("\n\n
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>>> Hello. <<<
2018-06-26 08:22:07 +02:00
_ _ _ _____ ___ ___ ___ _ _ ___ _____ _ _ ___ _ ___
/_\\ | \\| |_ _|_ _/ __|/ _ \\| \\| | __| / / __| || |_ _| | | \
/ _ \\| .` | | | | | (_ | (_) | .` | _| / / (__| __ || || |__| |) |
/_/ \\_\\_|\\_| |_| |___\\___|\\___/|_|\\_|___/_/ \\___|_||_|___|____|___/
2018-06-26 08:22:07 +02:00
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2018-06-26 08:22:07 +02:00
");
Server.default.waitForBoot { // if the SC server is not yet booted, boot it
2018-06-26 08:22:07 +02:00
// home folder of current script
var dir = PathName(thisProcess.nowExecutingPath).pathOnly;
// find samples locations
2018-06-26 08:22:07 +02:00
~granSmp = PathName(dir +/+ "smp/").files;
~granBfrList = List();
~granBfr = List();
// be nice and verbose in the post window while loading to buffers
2018-06-26 08:22:07 +02:00
postln(" \n~~~ Loading samples for granular synthesis ..." );
~granSmp.do({ |item, i|
postln(" " + i + "" + item.folderName +/+ item.fileName);
~granBfrList.add(item.fileName);
~granBfr.add(Buffer.readChannel(s, item.fullPath, channels:[0])); // [0] forces mono!
});
//////////////////////////////////////////////////////////////////////////////////////
// granulator "Granny" synth definition - basic recipe for the cake
2018-06-26 08:22:07 +02:00
SynthDef(\Granny, {
// arguments - accessible/settable from outside
2018-06-26 08:22:07 +02:00
arg bufnum,
freq = 200, fvar = 0.05,
dur = 0.3, durvar = 0.01,
pitch = 1, pitchvar = 0.001,
width = 0.4,
gain = 0.2,
reverb = 0.5,
posvar = 0.05,
// lpfLFO changes the frequency of low pass filter using a slow sine oscilator
lpfLFOSpeed = 0.013, // frequency of the oscilator
lpfLFOSpeedVar = 0.1, // varies the freq of the LF oscilator
lpfLFOMin = 400, // from Hz
lpfLFOMax = 5000, // to Hz
2018-06-26 08:22:07 +02:00
// lpfLFO changes the position of granulation using a slow sine oscilator
2018-06-26 08:22:07 +02:00
posLFOSpeed = 0.005,
posLFOSpeedVar = 0.1,
posLFOMin = 0,
posLFOMax = 1
;
// variables
var signal,
lpfFreq = SinOsc.kr(freq:lpfLFOSpeed * SinOsc.kr(freq:lpfLFOSpeedVar, mul:0.5, add:1)).linlin(
inMin:-1, inMax:1, outMin:lpfLFOMin, outMax:lpfLFOMax),
pos = SinOsc.kr(freq:posLFOSpeed * SinOsc.kr(freq:posLFOSpeedVar, mul:0.5, add:1)).linlin(
inMin:-1, inMax:1, outMin:posLFOMin, outMax:posLFOMax),
// envelopes
gainEnv = Env.newClear(4),
gainEnvCtl = \gainEnv.kr(gainEnv.asArray),
lpfEnv = Env.newClear(4),
lpfEnvCtl = \lpfEnv.kr(lpfEnv.asArray)
;
// main granular synthesis generator: GrainBuf uGen
signal = GrainBuf.ar(
numChannels: 2, // stereo
trigger: Impulse.kr(freq + (freq * (fvar * LFNoise2.kr(freq)))), // a UGen
dur: dur + (durvar * LFNoise2.kr(freq)), // in seconds
sndbuf: bufnum,
rate: pitch + (pitchvar * LFNoise2.kr(5)), // pitch
pos: pos + (posvar * LFNoise2.kr(freq)), // position 0-1
interp: 2, // interpolation for pitchshifting
pan: LFNoise1.kr(10).range(width.neg, width),
maxGrains: 512,
mul: gain,
add: 0
);
// low pass filter
signal = LPF.ar(
in: signal,
// prevent filter clicks by lagging low pass filter freq changes
freq: Lag.kr(lpfFreq, 0.2)
* EnvGen.kr(envelope: lpfEnvCtl, gate: 1)); // filter frequency envelope
// fade in, sustain, fade out
signal = signal * EnvGen.kr(envelope: gainEnvCtl, gate: 1, doneAction: 2);
// reverb
signal = GVerb.ar(
in: signal,
roomsize: 243,
revtime: 6,
damping: 1,
inputbw: 1,
drylevel: -6.dbamp,
earlyreflevel: reverb,
taillevel: 0.dbamp
);
Out.ar(0, signal);
postln("~~~ adding SynthDef: Granny ...");
}).add; // add to server
2018-06-26 08:22:07 +02:00
}
2018-06-26 08:22:07 +02:00
)
//////////////////////////////////////////////////////////////////////////////////////
// cooking Synths
// run each one separately one after the other.
2018-06-26 08:22:07 +02:00
// ACT I
(
~act_I = Synth(\Granny,
[
// which sample should we use?
2018-06-26 08:22:07 +02:00
\bufnum, ~granBfr.at(21), // "09 - PART II - Chorus.7.wav"
// fade-in, fade-out
2018-06-26 08:22:07 +02:00
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [20,301,30], \exp),
// LFOSpeed is the frequency of LF oscilator, then variation and min/max points
2018-06-26 08:22:07 +02:00
\lpfLFOSpeed, 0.023, \lpfLFOSpeedVar, 0.041, \lpfLFOMin, 1000, \lpfLFOMax, 8000,
\posLFOSpeed, 0.020, \posLFOSpeedVar, 0.089, \posLFOMin, 0.56, \posLFOMax, 0.92
]
);
)
( // ACT II --------------------------------------------------------------------------
~act_II = Synth(\Granny,
[
\bufnum, ~granBfr.at(43), // "23 - The Mother.6.wav"
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.013, \lpfLFOSpeedVar, 0.041, \lpfLFOMin, 1000, \lpfLFOMax, 4000,
\posLFOSpeed, 0.020, \posLFOSpeedVar, 0.089, \posLFOMin, 0.25, \posLFOMax, 0.90 ,
]
);
)
( // ACT IIb --------------------------------------------------------------------------
~act_IIb = Synth(\Granny,
[
\bufnum, ~granBfr.at(28), // "13 - Chorus Of The Self-Righteous.7.wav"
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.013, \lpfLFOSpeedVar, 0.054, \lpfLFOMin, 1000, \lpfLFOMax, 2000,
\posLFOSpeed, 0.057, \posLFOSpeedVar, 0.033, \posLFOMin, 0.1, \posLFOMax, 0.6,
]
);
)
( // ACT III (and ACT VII!) ------------------------------------------------------------
2018-06-26 08:22:07 +02:00
~act_III = Synth(\Granny,
[
\bufnum, ~granBfr.at(25), // "11 - Chorus Of The Persecutors And Persecuted.8.wav"
\pitch, 0.95,
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.063, \lpfLFOSpeedVar, 0.054, \lpfLFOMin, 1500, \lpfLFOMax, 6000,
\posLFOSpeed, 0.037, \posLFOSpeedVar, 0.033, \posLFOMin, 0.1, \posLFOMax, 0.8,
]
);
)
( // ACT IV --------------------------------------------------------------------------
~act_IV = Synth(\Granny,
[
\bufnum, ~granBfr.at(45), // "26 - Part III - Chorus.1.wav"
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.009, \lpfLFOSpeedVar, 0.054, \lpfLFOMin, 1000, \lpfLFOMax, 6000,
\posLFOSpeed, 0.037, \posLFOSpeedVar, 0.033, \posLFOMin, 0.35, \posLFOMax, 0.95,
]
);
)
( // ACT V --------------------------------------------------------------------------
~act_V = Synth(\Granny,
[
\bufnum, ~granBfr.at(51), // "29 - PRELUDIUM - General Ensemble.7.wav"
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.009, \lpfLFOSpeedVar, 0.054, \lpfLFOMin, 2000, \lpfLFOMax, 9000,
\posLFOSpeed, 0.037, \posLFOSpeedVar, 0.033, \posLFOMin, 0.05, \posLFOMax, 0.55,
]
);
)
( // ACT VI --------------------------------------------------------------------------
~act_VI = Synth(\Granny,
[
\bufnum, ~granBfr.at(48), // "28 - Scena (Bass Solo & Chorus).8.wav"
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeed, 0.031, \lpfLFOSpeedVar, 0.054, \lpfLFOMin, 700, \lpfLFOMax, 1500,
\posLFOSpeed, 0.037, \posLFOSpeedVar, 0.033, \posLFOMin, 0.15, \posLFOMax, 0.9,
]
);
)
/////////////////////////////////////////////////////////////////////////////////////
(
// --------------------------------------------------------------------------
// Track 02 from the album - "Chorus 1 (SC)"
2018-06-26 08:22:07 +02:00
~chorus1 = Synth(\Granny,
2018-06-26 08:22:07 +02:00
[
\bufnum, ~granBfr.at(3), // "01 - PART I - Chorus.12.wav"
\lpfLFOSpeed, 0.021, \lpfLFOMin, 700, \lpfLFOMax, 6500,
\posLFOSpeed, 0.017, \posLFOMin, 0.09, \posLFOMax, 0.91,
\gain, 0.15,
2018-06-26 08:22:07 +02:00
// fade-in, fade-out
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeedVar, 0.054, \posLFOSpeedVar, 0.033,
]
);
)
(
// --------------------------------------------------------------------------
// Track 08 from the album - "Chorus 2 (SC)"
~number4 = Synth(\Granny,
2018-06-26 08:22:07 +02:00
[
\bufnum, ~granBfr.at(4), // "01 - PART I - Chorus.3.wav"
2018-06-26 08:22:07 +02:00
\lpfLFOSpeed, 0.021, \lpfLFOMin, 700, \lpfLFOMax, 6500,
\posLFOSpeed, 0.017, \posLFOMin, 0.09, \posLFOMax, 0.91,
\gain, 0.15,
// fade-in, fade-out
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [19,301,30], \exp),
\lpfLFOSpeedVar, 0.054, \posLFOSpeedVar, 0.033,
]
);
)
(
// --------------------------------------------------------------------------
// Track 10 from the album - "The Oppressed 2 (SC)"
~number12 = Synth(\Granny,
2018-06-26 08:22:07 +02:00
[
\bufnum, ~granBfr.at(12), // "05 - Chorus Of The Oppressed.11.wav"
\lpfLFOSpeed, 0.015, \lpfLFOMin, 700, \lpfLFOMax, 5000,
\posLFOSpeed, 0.01, \posLFOMin, 0.05, \posLFOMax, 0.95,
\gain, 0.15, \pitch, 0.80,
2018-06-26 08:22:07 +02:00
// fade-in, fade-out
\gainEnv, Env([0, 1, 1, 0], [1,320,40], \lin),
\lpfEnv, Env([0.001, 1, 1, 0.001], [15,301,30], \exp),
2018-06-26 08:22:07 +02:00
\lpfLFOSpeedVar, 0.054, \posLFOSpeedVar, 0.033,
]
);
)