otophilia(imoutoid)の痕跡探し「ジムノペディ」
ジムノペディを見つけました。
この動画のコメントで教えてくれてる人がいました。
ここもいつ消えるかわからない気がします。
ひとまず今は探し求めていたジムノペディのコードを見つけることが出来て自分のPCのSuperColliderから流れていることに感動している。
たった200行のコードから音楽が生まれているのが素直にすごい。imoutoidのライブの映像が公開されて何日たったかわからないけど毎日何かしら調べててやっと成果がって感じ。
supercolliderを調べているのは単純にimoutoid探しだったんだけど最近チュートリアルとかもやってみてて少しずつ読めるようになってきた。
音楽知識は無いし楽譜の記号も読めないんだけどプログラムのコードになると読める気がしてくる。楽しい。
来年あたりは音楽これで出してみたいですね。
SuperColliderが生まれたのは1995年とかで音響プログラミングは今いろんな選択肢があるらしい。それにしてもジムノペディ良い音だなぁ…
20241205 追記
当時自分が動かしたコードについて展開しておきます。
// SuperCollider.jp - Code Remix Contest //
// Gymnopedie*Underachiever Remix //
// Composed By: Erik Satie //
// Remixed By: ChineseRoom //
(
var gym_synth, gym_seq;
gym_synth = {
SynthDef("synth_melody", {
arg freq=440, gate=1, amp=1.0, env, source1, source2, pan = 0.0 ;
env = EnvGen.kr(Env.adsr(0.001, 2, 0.0, 0.1, 1, -20), gate, doneAction:2);
source1 = Pan2.ar( Pulse.ar(freq, 0.51, amp) * env );
2.do({source1 = AllpassN.ar(source1, 0.08, [ExpRand(0.01,0.08),ExpRand(0.01,0.08)], 2)});
source2 = source1 + Pan2.ar( Pulse.ar(freq*2, 0.51, amp) * env );
Out.ar(0, source2);
}).store;
SynthDef("synth_bass", {
arg freq=440, gate=1, amp=1.0, source, pan = 0.0 ;
source =
Pan2.ar(
Pulse.ar(freq, [0.6, 0.4], amp * 0.8) + SinOsc.ar(freq, 0, amp) *
EnvGen.kr(Env.adsr(0.01, 0.2, 0.9, 0.01, 1, -6), gate, doneAction:2), pan );
Out.ar(0, source);
}).store;
SynthDef("synth_chord", {
arg freq=440, gate=1, amp=1.0, source, env1, env2, pan = 0.0 ;
env1 = EnvGen.kr(Env.adsr(0.01, 2, 0.0, 0.6, 1, -6), gate, doneAction:2);
env2 = EnvGen.kr(Env.adsr(0.05, 0.3, 0.0, 0.6, 1, 'exponential'), gate, MouseY.kr(12000, 10, 0, 0.2), 200);
source = Pan2.ar(LPF.ar(Pulse.ar(freq, SinOsc.ar([2.2, 2.4], [1.0, 0.3], 0.3, 0.5), amp), env2) * env1, pan);
Out.ar(0, source);
}).store;
SynthDef("synth_chord2", {
arg freq=440, gate=1, amp=1.0, source, env1, env2, pan = 0.0 ;
env1 = EnvGen.kr(Env.adsr(0.001, 1, 0.0, 0.6, 1, -6), gate, doneAction:2);
env2 = EnvGen.kr(Env.adsr(0.01, 0.2, 0.0, 0.2, 1, Rand(-50,-10)), gate, ExpRand(40,13000), 400);
source = Pan2.ar(LPF.ar(LFSaw.ar(freq, [Rand(0,1),Rand(0,1)], amp), env2) * env1, pan);
2.do({source = AllpassN.ar(source, 0.07, ExpRand(0.01,0.07), 3)});
Out.ar(0, source);
}).store;
SynthDef("synth_klock", {
arg freq=440, gate=1, amp=1.0, source, env1, pan = 0.0, fmratio = 0.5 ;
env1 = EnvGen.kr(Env.perc(0.0001, 0.018, 1, 10), gate, 1, 0, doneAction:2);
source = Pan2.ar( HPF.ar(SinOsc.ar(SinOsc.ar(freq*fmratio, 0, env1*2000 + 5000, freq), 0.51, amp), 3000), pan ) * env1;
Out.ar(0, source);
}).store;
SynthDef("synth_kroll", {
arg freq=440, gate=1, amp=1.0, source, osc, env1, pan = 0.0, fmratio = 0.5 ;
env1 = EnvGen.kr(Env.perc(0.0001, 0.1, 1, -6), gate, 1, 0);
osc = Pan2.ar( SinOsc.ar(SinOsc.ar(freq*2, 0, env1*9000+2000, freq), 0.51, amp), pan ) * env1;
source = osc + AllpassN.ar(AllpassN.ar(osc, 1, ExpRand(0.02,0.3), 2), 1, ExpRand(0.02,0.3), 2) * Line.kr(1,0,1.5, doneAction:2);
Out.ar(0, source);
}).store;
SynthDef("drum_kick", {
arg freq=440, gate=1, amp=1.0, source, pan = 0.0 ;
source =
Pan2.ar(
SinOsc.ar(EnvGen.kr(Env.perc(0.0001, 2.5, 1, -200), gate, 1000, 45, doneAction:2), 1, 1) +
((BPF.ar([GrayNoise.ar(8),GrayNoise.ar(8)],EnvGen.kr(Env.perc(0.001, 0.3, 1, -200), gate, 6000, 70), 1.5)).distort * Line.kr(0.3,0,0.1))
*
EnvGen.kr(Env.perc(0.001, 0.22, amp, 8)),0);
Out.ar(0, source);
}).store;
SynthDef("drum_shaker", {
arg freq=440, gate=1, amp=1.0, source, pan = 0.0 ;
source =
Pan2.ar(BPF.ar(WhiteNoise.ar(16),10000,0.2).distort * EnvGen.kr(Env.perc( (1-amp*0.02)+0.01 , ((amp*amp)*1.0 + 0.1), amp*amp*0.8+0.2, -6), gate, doneAction:2),Rand(-0.3,0.3));
Out.ar(0, source);
}).store;
SynthDef("drum_hihat", {
arg freq=440, gate=1, amp=1.0, source, pan = 0.0 ;
source =
Pan2.ar(BPF.ar(LFPulse.ar(BPF.ar(WhiteNoise.ar(5),1200,0.1).distort * 8000 + 6600, 0.7),7000,1) * EnvGen.kr(Env.perc(0.01, 0.4, 1, -6), doneAction:2),0);
Out.ar(0, source);
}).store;
SynthDef("drum_clap", {
arg freq=440, gate=1, amp=1.0, source, pan = 0.0 ;
source =
Pan2.ar((BPF.ar(BPF.ar(WhiteNoise.ar(16),2300,0.3),8300,0.3)*5).distort * EnvGen.kr(Env.perc(0.01, 0.1, 1, 0), doneAction:2),0);
Out.ar(0, source);
}).store;
};
gym_seq = {
var clock, melody, bass, chord, chord2, fkick, shaker, hihat, clap, klock, kroll, sfl;
sfl = 1.0/8.0;
clock = TempoClock(120/60);
melody = Pbind(
\instrument, \synth_melody,
\amp, 0.3,
\dur, Pseq([ 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 8, 4, 8, 4, ]/3.0,inf),
\midinote, Pseq([ \, 66, 69, 67, 66, 61, 59, 61, 62, 57, 59, \, 71, \] + 12, inf)
);
bass = Pbind(
\instrument, \synth_bass,
\amp, 0.3,
\dur, Pseq([ 2, 1+sfl, 1-sfl, 2, 1+sfl, 0.4, 0.6-sfl]/4.0,inf),
\midinote, Pseq([ 64, \, 64, \, 71, 76, \, 59, \, 59, \, 62, 66, \ ] - 24, inf)
);
chord = Pbind(
\instrument, \synth_chord,
\amp, 0.2,
\dur, Pseq([3.0+sfl,5.0-sfl;]/4,inf),
\midinote, Pseq([\,[59,62,66],\, [57,61,66]] , inf)
);
chord2 = Pbind(
\instrument, \synth_chord2,
\amp, 0.2,
\dur, Pseq([2]/4,inf),
\midinote, Pseq([[55,62,66],[59,62,69],[55,62,66]+12,[59,62,69],[54,61,66],[57,61,69],[54,61,66],[57,61,69]] , inf)
);
fkick = Pbind(
\instrument, \drum_kick,
\amp, 0.7,
\dur, Pseq([1, 1],inf),
\midinote, 3
);
shaker = Pbind(
\instrument, \drum_shaker,
\amp, Pseq([ 0.3, 0.1, 1.0, 0.4, 0.6, 0.3, 1.0, 0.4 ]/4,inf),
\dur, Pseq([1+sfl, 1-sfl]/4,inf),
\midinote, 3
);
hihat = Pbind(
\instrument, \drum_hihat,
\amp, 0.2,
\dur, Pseq([1, 1]/2,inf),
\midinote, Pseq([\, 1],inf)
);
clap = Pbind(
\instrument, \drum_clap,
\amp, 0.15,
\dur, Pseq([1, 1],inf),
\midinote, Pseq([\, 1],inf)
);
klock = Pbind(
\instrument, \synth_klock,
\amp, 0.4,
\dur, Pseq([ 4, 1+sfl, 1-sfl, 1+sfl, 1-sfl, ]/4.0,inf),
\midinote, Pseq([ \, \, 59, \, 59,] + 12, inf),
\fmratio, Pseq([ 0, Pxrand([ 0.166, 0.5, 3, 4, 5 ], inf), 0, Pxrand([ 0.166, 0.5, 3, 4, 5 ], inf)], inf),
\pan, Pseq([ -1, 1 ], inf)
);
kroll = Pbind(
\instrument, \synth_kroll,
\amp, 0.6,
\dur, Pseq([ 12, 4 ]/4.0,inf),
\midinote, Pseq([ \, 59, \, 71 ] + 24, inf),
\pan, Prand([ 1, -1, 0.5, -0.5 ], inf)
);
Ptpar([0,bass, 0,chord, 0,chord2, 0,melody, 0,fkick, 0,shaker, 0,hihat, 0,clap, 0,klock, 0,kroll]).play(clock);
};
gym_synth.value;
gym_seq.value;
)