Skip to content

Instantly share code, notes, and snippets.

@44kwm20
Last active January 24, 2016 14:37
Show Gist options
  • Save 44kwm20/5471871 to your computer and use it in GitHub Desktop.
Save 44kwm20/5471871 to your computer and use it in GitHub Desktop.
1つ、もしくは2つ以上のサンプルをテンポによって切り分け、それっぽく分解したりエフェクトをかけたりして再生します。
//////////
// 説明
// 1のカッコを実行 > 2にてサンプルのパス、ビートの長さ、音量、確率を入力 >
// 2のカッコを実行 > 3のbpmを設定 > 3のカッコを実行
//
// - 2について -
//・ループさせたいサンプルについて、ビートの長さは4分音符分を"1"とし計算。4/4一小節分は"4"になります。
//・ワンショットで鳴らしたいサンプルについて、ビートの長さを"0"にしてください。
//・確率の部分は「合計して100にする」と言った事は必要ありません。単純に他のサンプルとの比率を記入して下さい。
//
// ※) 当方の環境では、たまに音が二重に鳴ってしまう現象が発生しますが、その時は一旦停止し、再度3を実行して下さい。
// ※) 44100Hzでの動作を前提としています。
// 48000Hz等で動かす場合は、コード内でそれっぽい数値をそれっぽく修正する必要があるかもしれません。(未検証)
// SuperCollider 3.4.4(Mac)にて動作確認。
//////////
( //1
(
SynthDef(\pbuf001,{
arg trg=0,outBus=20,lev=1,pos=0,bnum,rate,sPos,pSftD=0,sel,sLoop;
var mix,buf01,env01,env02,pSft,select,bnumOf;
buf01 = [PlayBuf.ar(1,bnum * 2,rate,trg ,sPos,sLoop) ,
PlayBuf.ar(1,(bnum * 2) + 1 ,rate,trg ,sPos,sLoop)];
pSft = PitchShift.ar(buf01,0.01,pSftD,0,0.004);
select = Select.ar(sel,[buf01,pSft]);
mix = select * lev;
Out.ar(outBus, mix )
},[\tr]).add
);
////////////////////////////////////////////
////////////////////////////////////////////
(
SynthDef(\fft01,{
arg tg,sel=1,wipe,inBus=20,outBuf=30,mFq;
var in,dly,chain,ifft,lfo1,lfo2,dA,freq,selAry,bufsiz,mod01,mod02,in2,seldly;
bufsiz = 2048;
chain = Array.newClear(2);
in = In.ar(inBus,2);
lfo1 = LFTri.kr(0.097, 0, 0.4, 0.5);
lfo2 = LFTri.kr(0.24, 0, -0.5, 0.5);
2.do({ |i|
chain[i] = FFT(LocalBuf(bufsiz),in[i]);
chain[i] = PV_RandComb(chain[i],wipe, tg);
});
ifft = IFFT(chain);
ifft = Compander.ar(ifft,ifft,0.6,0.7,1,0.1,0.1);
in2 = DelayN.ar(in,1,(bufsiz)/44100.0);
mod01 = in2 * SinOsc.ar(mFq).range(0,1);
// mod01 = Compander.ar(mod01,mod01,0.2,0.9,1,0.01,0.01);
mod02 = Latch.ar(in2,Impulse.ar(mFq * 20));
seldly = DelayN.ar(sel,1,(bufsiz)/44100.0);
selAry = Select.ar(seldly,[in2,ifft,mod01,mod02]);
Out.ar(outBuf,selAry)
},[\tr]).add
);
////////////////////////////////////////////
////////////////////////////////////////////
(
SynthDef(\fltbypass,{
arg inBus = 30,outBus1,outBus2=32;
var in;
in = In.ar(inBus,2);
// Out.ar(outBus1,in);
Out.ar(outBus2,in);
}).add;
SynthDef(\pflt,{
arg trg=0,inBus=30,outBus=32,sel,envD,fStr,fEnd,gate,sign;
var in,flt,selLst,env;
env = EnvGen.ar( Env([fStr,fStr,fEnd],[0,envD],3 * sign), trg, doneAction:2);
in = In.ar(inBus,2);
flt = Resonz.ar(in, env, 0.7, 0.5);
flt = Compander.ar(flt,flt,0.3,1.0,0.2,0.01,0.01,8).softclip;
// selLst = Select.ar(sel,[in,flt]);
ReplaceOut.ar(outBus,flt)
},[\tr]).add
);
////////////////////////////////////////////
////////////////////////////////////////////
(
SynthDef(\loopbypass,{
arg inBus = 32,outBus1=24,outBus2=26;
var in;
in = In.ar(inBus,2);
// Out.ar(outBus1,in);
Out.ar(outBus2,in);
}).add;
SynthDef(\plooper,{
arg rTg,pTg,gate=1,inBus=32,outBus=26,plsRt;
var in,lBuf,ply,pls,env;
env = EnvGen.ar(Env.adsr(0,0,1,0),gate,doneAction:2);
lBuf = LocalBuf(44100*5, 2); lBuf.clear;
in = In.ar(inBus,2);
pls = Impulse.ar(plsRt);
RecordBuf.ar(in, lBuf, 0, 1, 0, 1, 0);
ply = PlayBuf.ar(2,lBuf,1,pls,0,0,0);
ReplaceOut.ar(outBus,ply)
},[\tr,\tr]).add
);
////////////////////////////////////////////
////////////////////////////////////////////
(
SynthDef(\bballbypass,{
arg inBus = 26,outBus=28;
var in;
in = In.ar(inBus,2);
// Out.ar(outBus,in);
Out.ar(0,in);
}).add;
SynthDef(\bball,{
arg gate,dT,dF,dSrt,dEnd,inBus=26,cutDcy,crv;
var in,dly,cut,tig,lBuf;
lBuf = LocalBuf(44100,2);lBuf.clear;
cut = EnvGen.ar( Env.perc(0,cutDcy),doneAction:0);
in = In.ar(inBus,2) * cut;
RecordBuf.ar(in, lBuf, 0, 1, 0, 1, 0);
tig = Impulse.ar( EnvGen.ar( Env([dSrt*dF,dEnd*dF],[dT],crv), doneAction:2) );
dly = PlayBuf.ar(2, lBuf, 1.0, tig, 0, 0);
// dly = Compander.ar(dly,dly,0.3,0.5,0.7,0.01,0.01);
ReplaceOut.ar (0,dly)
}).add;
);
////////////////////////////////////////////
////////////////////////////////////////////
(
SynthDef(\rvs01,{
arg trg,sPos,bTime,inBus = 26,outBus = 26,sel;
var in,ply,selAry;
in = In.ar(inBus,2);
RecordBuf.ar(in,1002,0,loop:1,trigger:trg);
ply = PlayBuf.ar(2,1002,-1,1,sPos,trg);
selAry = Select.ar(sel,[in,ply]);
ReplaceOut.ar(outBus, selAry)
},[\tr]).add
);
////////////////////////////////////////////
////////////////////////////////////////////
(
~bStr = Array.newClear(3);
~bStr[0] = Buffer.alloc(s,44100 * 10,1,bufnum:1000);
~bStr[1] = Buffer.alloc(s,44100 * 10,1,bufnum:1001);
SynthDef(\pstr01,{
arg inBus=26,outBus,sdur,sMul=2;
var in,lBuf,tg,env,ply,env2,lfn;
env2 = Line.ar(0,0,sdur,doneAction:2);
lfn = LFNoise1.ar(200).range(0.0001,0.01);
in = Array.newClear(2);
lBuf = Array.newClear(2);
ply = Array.newClear(2);
tg = Impulse.ar(100);
env = Line.ar(0,10,10*sMul,doneAction:0);
2.do({ |i|
in[i] = In.ar(inBus + i,1);
RecordBuf.ar(in[i], ~bStr[i] , 0, 1, 0, 1, 0, 1);
ply[i] = Mix.ar(TGrains.ar(2,tg, ~bStr[i], 1, (env+lfn) ,0.02));
});
ReplaceOut.ar(0,ply*6)
}).add
);
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
(
SynthDef(\comp01,{
var in, in2;
in = In.ar(0,2);
// in = Compander.ar(in,in,0.5,0.6,1,0.01,0.01);
in = Limiter.ar(in,1,0.01);
ReplaceOut.ar(0,in)
}).add
);
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
f = SoundFile.new;
~bufinit = { |array|
~buf = Array.newClear(array.size*2); // バッファー
~bBeat = Array.new; // 4分音符
~bDiv = Array.new; // 16分音符分のサンプル数
~bSteps = Array.new; // 16分音符で割った総ステップ数 (4/4の1小節分で16ステップ)
~bBpm = Array.new; // サンプルのテンポ
~bProb = Array.new;
~bLevel = Array.new;
fork{ "Loading sample(s)...".postln; s.sync;
array.size.do({ |i| var bCn ; bCn = (i * 2);
f.openRead(array[i][0]);
// f.path.post; " ->".post;f.numChannels.postln;
~bBeat = ~bBeat.add(array[i][1]);
~bDiv = ~bDiv.add((f.numFrames) / 16.0 / (~bBeat[i] / 4.0) );
~bSteps = ~bSteps.add((~bBeat[i]/4.0) * 16.0);
~bBpm = ~bBpm.add(60000.0 / ((f.numFrames/44.100)/~bBeat[i]) );
~bLevel = ~bLevel.add(array[i][2]);
~bProb = ~bProb.add(array[i][3]);
if ( ~ bBeat[i] == 0 , {~bDiv[i]= 1 ; ~bSteps[i]= 1 ; ~bBpm[i] = 0;}
);
if (f.numChannels == 1,
{ 2.do({|j| // mono //
~buf[bCn + j] = Buffer.readChannel(s,f.path,channels:0,bufnum:bCn+j,
action:{|bbb| })
});
},
{2.do({|j| // stereo //
~buf[bCn + j] = Buffer.readChannel(s,f.path,channels:j,bufnum:bCn+j,
action:{|bbb|})
});
}) ;
}) ;s.sync; "Done.".postln}
};
)
bbb.normalize
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
( //2
~buffers = [ //// ["path",beats,amp,prob] , ["path",beats,amp,prob] ... ////
["example-path-oneShotSample",0,1,40],
["example-path-loopSample",4,1,30]
];
~bufinit.value(~buffers);
)
//// BufferCheck ////
(~buf.postln;~bBeat.postln;~bDiv.postln;~bSteps.postln;~bBpm; );
////////////////////////////////////////////
////////////////////////////////////////////
( //3
~bpm = 180 ; // <-Set BPM
~sf = 0.00;
~beatT = 60/~bpm;
~beatF = ~bpm/60;
TempoClock.default.tempo = ~bpm/60;
~bStr[2] = Buffer.alloc(s,44100 * (~beatT * 8),2,bufnum:1002);
~maxStp = ((~bSteps.maxItem) - 1).asInteger;
~numbuf = nil;
~buffers.size.do({|i|
~numbuf = ~numbuf.add(i);
if (~bBpm[i] == 0 ,{~bBpm[i]=~bpm};
)});
~prob = Pwrand(~numbuf,~bProb.normalizeSum,inf);
~syn01G = Group.head(s);
~fftG = Group.after(~syn01G);
~fltG = Group.after(~fftG);
~loopG = Group.after(~fltG);
~rvsG = Group.after(~loopG);
~ballG = Group.after(~rvsG);
~compG = Group.after(~ballG);
~ballfirst = Synth.head(~ballG,\bballbypass);
~bloopfirst = Synth.head(~loopG,\loopbypass);
~fltfirst = Synth.head(~fltG,\fltbypass);
~compS = Synth.head(~compG,\comp01);
~pB0 = Pseg(Pseq([1,1],1),0.5,\lin);
~pB1 = Pseg(Pseq([1,2],1),0.5,\lin);
~pB2 = Pseg(Pseq([1,0.5],1),0.5,\lin);
~pB3 = Pseg(Pseq([2,1],1),0.5,\lin);
~pB4 = Pseg(Pseq([0.5,1],1),0.5,\lin);
~pB5 = Pseg(Pseq([1,4],1),0.5,\lin);
~pB6 = Pseg(Pseq([1,0.25],1),0.5,\lin);
~pB = [~pB0,~pB0,~pB0,~pB0,~pB1,~pB2,~pB3,~pB4,~pB5,~pB6];
/////////////////////////////////////////////////////////////
(
Pdef(\prvs,Pmono(
\rvs01,
\group,~rvsG,
\dur,0.25,
\trg,Pseq([1,Pn(\,31)],inf),
\sel,Pwrand([Pn(0,4),Pwrand([1,0],[0.05,0.95],8), Pn(1,16)] ,[80,8,1].normalizeSum,inf)
))
);
/////////////////////////////////////////////////////////////
(
Pdef(\pflt01,Pbind(
\instrument , \pflt,
\group,~fltG,
\addAction,1,
\dur,Pwhite(1,4,inf),
\trg, Pseq([1],inf),
\freq, Pwrand([1,\],[1,15].normalizeSum,inf),
\envD, ~beatT * Pkey(\dur),
\fStr, Plprand(50,10000,inf),
\fEnd, Plprand(50,10000,inf),
\sign , Pif (Pkey(\fStr) > Pkey(\fEnd) , -1,1)
))
);
/////////////////////////////////////////////////////////////
(
Pdef(\pball,Pbind(
\freq,\,
\onn , Pwrand([1,2,0],[2, 2 , 10].normalizeSum,inf),
\dur , Pwhite(4,8,inf).collect({|evt| ~balldur = evt}),
\doit , Pswitch ( [0,
Pfuncn({
var sign,srt,end,cv;
srt = ([1,2,4,32,64].choose);
end = if( srt > 31 , {[1,2,4].choose},{[32,64,128].choose});
if ( (srt - end) > 0 , {sign = -1},{sign = 1});
Synth.tail(~ballG,\bball,[\dT,~beatT*[1,2,4].choose,\dF,~beatF,\dSrt,srt,\dEnd,end,\cutDcy,[0.11,4].choose,
\crv,4*sign])
},1)
,
Pfuncn({
var sign,srt,end,cv;
srt = ([1,2,4,32,64].choose);
Synth.tail(~ballG,\pstr01,[\sdur,~beatT*[1,2,4,~balldur].choose,\sMul,[2,4].choose])
},1
) ],Pkey(\onn))
))
);
/////////////////////////////////////////////////////////////
(
Pdef(\pfft01,Pmono(
\fft01,
\group , ~fftG,
\inBus , 20,
\outBus ,30,
\tg , 1,
\sel, Pwrand([0,1,2,3],[40,3,2,6].normalizeSum,inf),
\mFq , Plprand(10,1000,inf),
\wipe , Pwhite(0.5,0.90,inf),
\dur , Prand([1,2,0.5],inf)
))
);
/////////////////////////////////////////////////////////////
(
Pdef(\ploop,Pbind(
\instrument,\plooper,
\group, ~loopG,
\addAction,1,
// \plsRt, ~beatF * Prand([3,2.5,2,0.33334,0.5,0.25],inf),
\freq,Pwrand([1,\],[1,20].normalizeSum,inf),
\legato,1,
\dur,Prand([1,4],inf),
\plsRt, Pif ( Pkey(\dur) < 2 , ~beatF * Prand([2,2,666666666,3,4],inf),
~beatF * Prand([1,2,1.5,1.3333333334,],inf))
))
);
/////////////////////////////////////////////////////////////
(
Pdef(\p001,
Pchain(
Pbind(
\group , ~syn01G,
\dur,Pwrand([Pseq([0.25+~sf,0.5,0.25-~sf],1),0.5,Pseq([0.25+~sf,0.25-~sf],1),Pn(0.125,4),Pn(0.0625,8)],[5,3,10,1,1].normalizeSum,inf),
// \dur,Pseq([(0.25 + ~sf),(0.25 - ~sf)],inf),
\pBsel , Pstep(Pwhite(0,~pB.size,inf),0.5).collect({|evt| ~pbselect = evt}),
\rate , Pn ( Pfunc{~lastrate} * Pif( Pkey(\dur ) < 0.25 ,
Pswitch(~pB, Pfunc{~pbselect})
,1),inf)
),
Pstep(
Pmono(
\pbuf001,
\outBus,20,
\bnum,~prob,
\lev, Pswitch(~bLevel, Pkey(\bnum) ),
\oneShot , Pswitch(~bBeat,Pkey(\bnum)).collect({|evt| ~oneS = evt}),
\sLoop , Pif( Pkey(\oneShot) < 1 ,0,1),
// \sPosSet , Pwhite(0,~maxStp,inf) % Pswitch(~bSteps,Pkey(\bnum)),
\sPosSet , ((Pseries(0,1,inf) +
Pwrand([0,Pwhite(-2,2,1),Pwhite(-5,5,2),Pn(-3,3)],[20,1,1,1].normalizeSum,inf)) %
Pswitch(~bSteps,Pkey(\bnum))).collect({|evn| ~prepos = evn}),
\sPosSet, Pif ( Pfunc({ (~prepos.asInteger).even}) , Pkey(\sPosSet), Pkey(\sPosSet)+~sf ),
\sPos, Pif( Pkey(\oneShot) < 1, 0 ,
Pswitch(~bDiv,Pkey(\bnum))* Pkey(\sPosSet) ) ,
\rate,( Pif( Pkey(\oneShot) < 1, 1 ,
((~bpm/ Pswitch(~bBpm,Pkey(\bnum))) * Pwrand([1,-1],[0.85,0.15],inf)))).collect({|evt| ~lastrate = evt}),
\trg,1,
\pLen, (Pswitch(~bDiv,Pkey(\bnum))* 2 ),
\pSftD,Prand([2,4,0.25,0.5],inf),
\sel, Pwrand([0,1],[20,1].normalizeSum,inf),
// -- debug --
// \sPos, Pswitch(~bDiv,Pkey(\bnum))* (Pseries(0,1,inf)%16) ,
// \rate,(~bpm/ Pswitch(~bBpm,Pkey(\bnum))),
// \sel, 0,
// \pos,Pwrand([0,Pwhite(-1.0,1.0,1)],[0.7,0.3],inf)
\pos,0
),Pseq([0.25+~sf,0.25-~sf],inf)
)
)
)
);
~fftoffs = (( 2048 / 44100) / ~beatT).neg;
Pdef(\p001).play(quant:[4,~fftoffs,0.2]);
Pdef(\pfft01).play(quant:[4,~fftoffs,0.2]);
Pdef(\ploop).play(quant:[4,0,0.2]);
Pdef(\prvs).play(quant:[4,0,0.1]);
Pdef(\pball).play(quant:[4,0,0.1]);
Pdef(\pflt01).play(quant:[4,0,0.1]);
)
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment