As threatened, I have once again made some Christmas music.
If you enjoy (or hate it, or are indifferent), please consider donating to the UKLGIG. cafdonate.cafonline.org/111#/DonationDetails They support LGBTQI+ people through the asylum and immigration process. Their vision is a world where there is equality, dignity, respect and safety for all people in the expression of their sexual or gender identity.
Or, if you are in the US, please donate to the National Center for Transgender Equality secure2.convio.net/ncftge/site/Donation2;jsessionid=00000000.app268b?df_id=1480&mfc_pref=T&1480.donation=form1&NONCE_TOKEN=C5EA18E62F736227261DC4CE5C50ADBE
The notes in the 5 movements all come from the same pop song, but in 4 of the movements, they pass through a class I (accidentally) wrote called MidiMangler. It’s undocumented, but the constructor expects the kind of midi events that come from SimpleMIDIFile in wslib and the .p method spits out a pbind.
The instruments are some of the sample I used a couple of years ago, but the organ is new. It’s based on one from http://sccode.org/1-5as but modified to be played with a PmonoArtic.
SynthDef(\organ, {| freq = 440, gate=1, amp=0.25, pan=0 |
// from http://sccode.org/1-5as
var lagdur, env, saw, panner;
lagdur = 0.4;
saw = VarSaw.ar(Lag.kr(freq-440)+440,
width:LFNoise2.kr(1).range(0.2, 0.8) *
SinOsc.kr(5, Rand(0.0, 1.0)).range(0.7,0.8));
env = EnvGen.kr(Env.asr(Rand(0.5, 0.7), 1, Rand(1.0, 2.0), Rand(-10.0, -5.0)), gate, doneAction:2);
amp = Lag.ar((amp / 4) * (Lag.ar(LFClipNoise.ar(lagdur.reciprocal, 0.1), lagdur) + 1)); // tremolo
panner = Pan2.ar(saw, Lag.kr(pan,1), env * amp);
Out.ar(0, panner);
}).add;
The other instruments are the default synthdef *cough*, a Risset bell and Karplus Strong – taken directly from a help file with no changes. These are presented at the bottom for the sake of completion. The other sound is a bomb sample I found on freesound.
The video is taken from an atom bomb test video, but slowed down and stretched. I used ffmpeg to do this. The original film was 24 frames per second. I used a ffmpeg filter to create a lot of extra in-between frames and then, separately, changed the frame rate to be much slower. The original film was a bit over 20 seconds and got stretched out to 15 minutes. The really low frame rate is a bit choppy, but I think more tweening would have just increased distortion. The commands for that were:
% ffmpeg -i trees-bomb.mp4 -filter:v "minterpolate='fps=180'" 180trees.mkv
% ffmpeg -i 180trees.mkv -filter:v "setpts=33.4*PTS" strch180.mk
The other day, I read someone putting for the idea that apocalyptic thinking is so profoundly unhelpful as to be self-indulgent. Climate change is not going out with a bang, but a very prolonged whimper, whilst, for the duration, failing to make any significant changes. We can address it and avoid many of the worst impacts, but we need to get very serious about it immediately. If we can build thousands of expensive, terrifying bombs just in case there might be a war nobody wants, surely, we can afford to spend some of that resource averting a disaster that we know is actually coming.
SynthDef(\bell, // a church bell (by Risset, described in Dodge 1997)
{arg freq=440, amp=0.1, dur=4.0, out=0, pan;
var env, partials, addPartial, son, sust, delay;
freq = freq * 2;
sust = 4;
amp = amp/11;
partials = Array.new(9);
delay = Rand(0, 0.001);
//bell = SinOsc(freq);
addPartial = { |amplitude, rel_duration, rel_freq, detune, pan=0|
partials.add((
Pan2.ar(
FSinOsc.ar(freq*rel_freq+detune, Rand(0, 2pi), amp * amplitude* (1 + Rand(-0.01, 0.01))), pan)
* EnvGen.kr(
Env.perc(0.01, sust*rel_duration* (1 + Rand(-0.01, 0.01)), 1, -4).delay(delay), doneAction: 0))
).tanh /2
};
//addPartial.(1, 1, 0.24, 0, Rand(-0.7, 0.7));
addPartial.(1, 1, 0.95, 0, Rand(-0.7, 0.7));
addPartial.(0.67, 0.9, 0.64, 1, Rand(-0.7, 0.7));
addPartial.(1, 0.65, 1.23, 1, Rand(-0.7, 0.7));
addPartial.(1.8, 0.55, 2, 0, 0); // root
addPartial.(2.67, 0.325, 2.91, 1, Rand(-0.7, 0.7));
addPartial.(1.67, 0.35, 3.96, 1, Rand(-0.7, 0.7));
addPartial.(1.46, 0.25, 5.12, 1, Rand(-0.7, 0.7));
addPartial.(1.33, 0.2, 6.37, 1, Rand(-0.7, 0.7));
son = Mix(partials).tanh;
son = DelayC.ar(son, 0.06, Rand(0, 0.02));
EnvGen.kr(Env.perc(0.01, sust * 1.01), doneAction:2);
Out.ar(out, son);
}).add;
SynthDef("plucking", {arg amp = 0.1, freq = 440, decay = 5, coef = 0.1, pan=0;
var env, snd, panner, verb;
freq = freq + Rand(-10.0, 10.0);
env = EnvGen.kr(Env.linen(0, decay, 0).delay(Rand(0, 0.001)), doneAction: 2);
snd = Pluck.ar(
in: WhiteNoise.ar(amp),
trig: Impulse.kr(0),
maxdelaytime: 0.1,
delaytime: freq.reciprocal,
decaytime: decay,
coef: coef);
//verb = FreeVerb.ar(snd);
panner = Pan2.ar(snd, pan);
Out.ar(0, panner);
}).add;