Skip to content

Instantly share code, notes, and snippets.

@umbrellaprocess
Created April 28, 2013 04:32
Show Gist options
  • Save umbrellaprocess/5475886 to your computer and use it in GitHub Desktop.
Save umbrellaprocess/5475886 to your computer and use it in GitHub Desktop.
2005年のコードを、Kyoto SuperCollider Meetingの間に修正…したかったけど途中で断念。TabletViewがエラーで動かない。
////////// SynthDef setup for "ANTARES" //////////
(
// Pad1
SynthDef("up-piano-24", {
arg freq=440, amp=1, outBus=0;
var x, e, mod, lfo;
e = Env.perc(0.01,1.2,1,-3);
x = SinOsc.ar(freq + SinOsc.ar(freq*3, 0, 200), 0, 1) * amp;
x = EnvGen.kr(e,1.0,doneAction: 2) * x;
Out.ar(outBus, Pan2.ar(x, LFNoise1.ar(2,1)));
}).store;
// Pad2
SynthDef("up-piano-29", {
arg freq=440, gate=1.0, amp=1, pan=0, outBus=0;
var x, e, e2, mod1, mod2;
e = Env.asr(0.05,0.5,0.3,1,-3);
mod1 = SinOsc.ar(freq,0,700);
mod2 = Saw.ar(freq/2, pi*0.9);
x = SinOsc.ar(freq + mod1, mod2, 1) * amp;
x = EnvGen.kr(e,gate,doneAction: 2) * x;
Out.ar(outBus, Pan2.ar(x, pan));
}).store;
// melody
SynthDef("antares-melody", {
arg note=1, gate=1, amp=1, rq=0.3, pan=0, outBus=0;
var x, e, freq, scale, buffer;
e = Env.asr(0.1,1,0.2,1,-3);
scale = FloatArray[0, 2, 3, 5, 7, 9, 10]; // d dur
buffer = Buffer.alloc(s, scale.size,1, {|b| b.setnMsg(0, scale) });
freq = DegreeToKey.kr(
buffer.bufnum,
note, // input
12, // 12 notes per octave
1, // mul = 1
53 // offset by 53 notes
).midicps;
x = BPF.ar(Saw.ar(freq), freq, rq) * amp;
x = EnvGen.kr(e,gate) * x;
Out.ar(outBus, Pan2.ar(x, pan));
}).store;
// drums
SynthDef("up-snare-1", {
arg gate=1.0, amp=1, pan=0, outBus=0;
var x, e;
e = Env.perc(0.01,0.03,1,-3);
x = WhiteNoise.ar(amp);
x = EnvGen.kr(e,gate,doneAction: 2) * x;
Out.ar(outBus, Pan2.ar(x, pan));
}).store;
SynthDef("up-kick-2", { arg outBus=0, amp=0.1, pan=0;
var env1, env2, env3, mod1, mod2, x;
env1 = Env.new([0.001,1,0.7,0.6,0], [0.001,0.003,0.1,0.1], -3);
env2 = Env.perc(0, 0.01, 1, -3);
env3 = Env.perc(0, 0.001, 1, -3);
mod1 = EnvGen.ar(env2) * 500;
mod2 = EnvGen.ar(env3) * 10;
x = SinOsc.ar(60 + mod1, 0, 1, mod2) * amp;
x = EnvGen.kr(env1, 1.0, doneAction:2) * x;
Out.ar(outBus, Pan2.ar(x, pan));
}).store;
//effects
SynthDef("up-simpleDelay", {
arg inBus=0, outBus=1, delaytime=2, mul=0.5;
var x;
x = DelayN.ar(
In.ar(inBus, 2),
delaytime, delaytime, mul
);
Out.ar(outBus, x);
}).store;
SynthDef("up-simpleLPF", {
arg inBus=0, outBus=0, freq=440, mul=1;
var x;
x = LPF.ar(In.ar(inBus, 2), freq) * mul;
ReplaceOut.ar(outBus, x);
}, [0,0,3,3]).store;
SynthDef("reverb",
{ arg inBus=10, outBus=0;
var a,z,y,x;
a=InFeedback.ar(inBus,2);
z=DelayN.ar(a,0.048);
y=Mix.ar(Array.fill(7,{CombL.ar(z,0.1,LFNoise1.kr([0.1.rand,0.1.rand], 0.01,0.1),10)}));
x=AllpassN.ar(y,0.050,[0.050.rand,0.050.rand],1);
Out.ar(outBus,x);
}
).store;
// mixer
SynthDef("up-16chMixer", {
arg inBus=16,outBus=0,fxoutBus=32,fxinBus=34,
fx1=0,fx2=0,fx3=0,fx4=0,fx5=0,fx6=0,fx7=0,fx8=0,
mul1=0,mul2=0,mul3=0,mul4=0,mul5=0,mul6=0,mul7=0,mul8=0,mulFx=0;
var ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,chFx,x;
ch1=In.ar(inBus+0,2);
ch2=In.ar(inBus+2,2);
ch3=In.ar(inBus+4,2);
ch4=In.ar(inBus+6,2);
ch5=In.ar(inBus+8,2);
ch6=In.ar(inBus+10,2);
ch7=In.ar(inBus+12,2);
ch8=In.ar(inBus+14,2);
Out.ar(fxoutBus,
(ch1*fx1)+(ch2*fx2)+(ch3*fx3)+(ch4*fx4)+
(ch5*fx5)+(ch6*fx6)+(ch7*fx7)+(ch8*fx8)
);
chFx=In.ar(fxinBus,2);
x=(ch1*mul1)+(ch2*mul2)+(ch3*mul3)+(ch4*mul4)+
(ch5*mul5)+(ch6*mul6)+(ch7*mul7)+(ch8*mul8)+(chFx*mulFx);
Out.ar(outBus, Limiter.ar(x,0.98));
}).store;
)
///////////////// ANTARES /////////////////
//////// 2005 by Takuro Hishikawa /////////
(
var bpm,key,keys,scale,chordtype,looplist,progress,dur;
var currentloop,pad1,pad2,padamp,padamp2;
var snare,kick,noise,weight=0;
var w,slider1,slider2,button1,button2,tablet;
var spec1,spec2,spec3,spec4,spec5,spec6,spec7;
// define groups
~source = Group.head(s);
~effects = Group.tail(s);
~mixer = Group.tail(s);
bpm=100; // set tempo
key=60; // set base key
keys = Array.newClear(128);
scale=[ // set scale (c min)
0, 0, 2, 3, 3, 5, 5, 7, 8, 8,10,10,
12,12,14,15,15,17,17,19,20,20,22,22,
24,24,26,27,27,29,29,31,32,32,34,34];
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11
// c,c#, d,d#, e, f,#f, g,#g, a,#a, h
chordtype=[ // define chords
[8,12,19], [10,14,17], // AbM7, Bb,
[12,15,22], [10,14,20], // Cm7, Bb7,
[12,15,19], [10,14,19] // Cm, Gm/Bb
];
looplist=[ // group chords into several loops
[0,1],[2,3],[4,5]
];
progress=Pxrand([0,1,2],inf).asStream; // choose loop
dur=Pseq([4],inf).asStream;
m=Synth.tail(~source, "antares-melody", [\gate, 0.0, \outBus, 16]);
Synth.head(~effects, "up-simpleDelay", [\delaytime, 45/bpm, \inBus, 16, \outBus, 26]);
Synth.tail(~effects, "up-simpleDelay", [\delaytime, 45/bpm, \inBus, 18, \outBus, 18]);
z=Synth.tail(~effects, "up-simpleLPF", [\inBus, 20, \outBus, 20, \mul, 0]);
Synth.tail(~effects, "reverb", [\inBus, 32, \outBus, 34]);
Synth.head(~mixer, "up-16chMixer", [ // mixer
\inBus, 16, \outBus, 0, \fxoutBus, 32, \fxinBus, 34,
\mul1, 0.7, \mul2, 0.6, \mul3, 0.9, \mul4, 0.3, \mul5, 0.3, \mul6, 0.35,
\fx2, 0.4, \fx3, 0.1, \fx4, 0.01, \fx5, 0.01, \fx6, 0.1, \mulFx, 0.1
// 1->melody 2->pad1 3->pad2 4->snare 5->kick 6->melody-delay
]);
// gui setting
GUI.qt;
w = GUI.window.new("ANTARES", Rect(0, 0, 800, 600));
slider1 = Slider(w, Rect(365, 150, 40, 200));
slider1.canFocus = false;
slider2 = Slider2D(w, Rect(25, 50, 300, 300));
slider2.canFocus = false;
button1 = Button(w, Rect(350, 100, 70, 30));
button1.states = [["change", Color.black]];
button1.canFocus = false;
button2 = Button(w, Rect(24, 500, 70, 40));
button2.states = [["quit", Color.black]];
button2.canFocus = false;
//tablet = TabletView(w,Rect(450, 50, 300, 300));
tablet = Slider2D(w,Rect(450, 50, 300, 300));
//tablet.background = Gradient(Color.blue, Color.white,\h);
tablet.canFocus = false;
spec1=ControlSpec(0.0, 0.2, \amp, 0, 0);
spec2=ControlSpec(200, 20000, \exponential, 0, 0);
spec3=ControlSpec(0.0, 7.0, \linear, default:0);
spec4=ControlSpec(1, 15, \linear, 1);
spec5=ControlSpec(1.0, 0.1, \amp, 0, 0);
spec6=ControlSpec(0.1, 1.0, \exp, 0.01, 0);
spec7=ControlSpec(0, 10, \linear, 0, 0);
slider1.action = {
weight=spec3.map(slider1.value);
};
slider2.action = {arg slider;
padamp=spec1.map(slider2.x);
z.set(\mul, spec1.map(slider.y));
z.set(\freq, spec2.map(slider.y));
};
button1.action = {|view|
var x,y,d;
x=1.0.rand;
y=1.0.rand;
d=1.0.rand;
padamp=spec1.map(x);
z.set(\mul, spec1.map(y));
z.set(\freq, spec2.map(y));
weight=spec3.map(d);
slider2.x_(x);
slider2.y_(y);
slider1.value_(d);
};
tablet.action = {arg slider;
m.set(\note, spec4.map( slider.x/300 ) );
m.set(\rq, spec5.map( slider.y/300 ) );
};
/*
tablet.action = { arg view,x,y,pressure,tiltx,tilty,deviceID, buttonNumber,clickCount,absoluteZ,rotation;
var note, rq;
note = x / 300;
rq = y / 300;
m.set(\note, spec4.map( note ) );
m.set(\amp, spec6.map( pressure ) );
m.set(\rq, spec5.map( rq ) );
};
*/
/*
tablet.mouseDownAction = { arg view,x,y,pressure,tiltx,tilty,deviceID, buttonNumber,clickCount,absoluteZ,rotation;
m.set(\note, spec4.map( x / 300 ) );
m.set(\amp, spec6.map( pressure ) );
m.set(\gate, 1.0 );
m.set(\rq, spec5.map( y / 300 ) );
};
tablet.mouseUpAction = { arg view,x,y,pressure,tiltx,tilty,deviceID, buttonNumber,clickCount,absoluteZ,rotation;
m.set(\note, spec4.map( x / 300 ) );
m.set(\amp, spec6.map( pressure.min(0.6) ) );
m.set(\gate, 0.0 );
m.set(\rq, spec5.map( y / 300 ) );
};
*/
slider1.value = spec1.unmap(spec1.default);
slider2.x = spec1.unmap(0.0);
slider2.y = spec1.unmap(0.0);
z.set(\mul, 0.0);
button2.action = {|view|
w.close;
pad1.stop;
pad2.stop;
snare.stop;
kick.stop;
SystemClock.clear;
s.sendMsg("g_freeAll", 1);
s.quit;
};
// sound scheduling
pad1=Task({
var note, loop, currentchord;
loop({
currentchord=Pseq(currentloop,inf).asStream;
2.do({
loop=chordtype.at(currentchord.next);
note=Pxrand(loop,inf).asStream;
16.do({ arg i;
Synth.tail(~source, "up-piano-24", [
\freq,(scale.at(note.next)+key+[0,12,-12].choose).midicps,
\amp, padamp,
\outBus,18
]);
(1/2).wait;
});
});
});
},TempoClock(bpm/60));
pad2=Task({
var node, num, loop, currentchord;
loop({
currentchord=Pseq(currentloop,inf).asStream;
2.do({
loop=chordtype.at(currentchord.next);
3.do({ arg i;
num=scale.at(loop.at(i))+key;
node=Synth.tail(~source, "up-piano-29",[
\freq,(num-12).midicps,
\amp,1,
\outBus, 20
]);
keys.put(num,node);
});
8.wait;
3.do({ arg i;
num=scale.at(loop.at(i))+key;
node=keys.at(num);
s.sendMsg("/n_set",node.nodeID,\gate,0.0);
keys.put(num,nil);
});
});
});
},TempoClock(bpm/60));
snare=Task({
var pat, t;
pat = Pseq([0,1, 1,1, 9,1, 1,5, 1,4, 0,1, 9,4, 2,5], inf).asStream;
loop({
t = pat.next;
if( weight > 1, {
if( (t + weight) > 8, {
if((t*0.1).coin, {
Synth.tail(~source, "up-snare-1",[
\amp,1,
\outBus, 22
]);
});
});
});
(1/4).wait;
});
},TempoClock(bpm/60));
kick=Task({
var pat, t;
pat = Pseq([9,2, 2,2, 0,2, 5,2, 4,2, 7,3, 0,4, 2,4], inf).asStream;
loop({
t = pat.next;
if( weight > 0, {
if( (t + weight) > 8, {
if((t*0.1).coin, {
Synth.tail(~source, "up-kick-2",[
\amp, 1,
\outBus, 24
]);
});
});
});
(1/4).wait;
});
},TempoClock(bpm/60));
SystemClock.sched(0,{currentloop=looplist.at(progress.next).postln; dur.next*120*rrand(2,8)/bpm;});
SystemClock.sched(0,{snare.start});
SystemClock.sched(0,{kick.start});
SystemClock.sched(0,{pad1.start});
SystemClock.sched(0,{pad2.start});
w.front;
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment