|
|
@ -0,0 +1,117 @@ |
|
|
|
// #looptober 2020 02 |
|
|
|
// by Luka Prinčič <luka@lukaprincic.si> |
|
|
|
// free to use, remix, etc under conditions of peer production licence: |
|
|
|
// https://wiki.p2pfoundation.net/Peer_Production_License |
|
|
|
// please support my work via https://lukaprincic.si/support |
|
|
|
|
|
|
|
|
|
|
|
( // load samples |
|
|
|
var smpPath = PathName(thisProcess.nowExecutingPath.dirname +/+ "samples"); |
|
|
|
|
|
|
|
// free all buffers to restart buffer count |
|
|
|
~smpBuffers.do(_.free); |
|
|
|
|
|
|
|
// create Dictionary |
|
|
|
~smpBuffers = Dictionary(); |
|
|
|
|
|
|
|
// load samples |
|
|
|
"\n--- load samples: ...".postln; |
|
|
|
|
|
|
|
// iterate over each file in the folder |
|
|
|
smpPath.filesDo({ |smpfile,i| |
|
|
|
// tell me what you are loading: |
|
|
|
postln(" " + i + smpfile.fileName ); |
|
|
|
|
|
|
|
// add a sample into a buffer, store object to Dictionary |
|
|
|
~smpBuffers.add(smpfile.fileName -> Buffer.readChannel(s, |
|
|
|
smpfile.fullPath, channels:[0])); |
|
|
|
}); |
|
|
|
|
|
|
|
// function to partially match filename for buffers |
|
|
|
~getSmp = { |regexp| |
|
|
|
~smpBuffers.detect { |buf| |
|
|
|
regexp.matchRegexp(buf.path) |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
// synthdefs: /////////////////////////////////////////////////////////////////////// |
|
|
|
SynthDef(\bgrain, { |out = 0, gate = 1, amp = 0, bufnum, gfreq=90, rate=0.5| |
|
|
|
var snd, pan, env, freqdev; |
|
|
|
pan = LFNoise1.kr(0.1).range(-1, 1) * LFNoise0.kr(gfreq).range(0.2,1); |
|
|
|
env = EnvGen.kr( |
|
|
|
Env([0, 1, 0], [1, 1], \sin, 1), |
|
|
|
gate, |
|
|
|
doneAction: Done.freeSelf); |
|
|
|
|
|
|
|
snd = GrainBuf.ar( |
|
|
|
numChannels:2, |
|
|
|
trigger:Impulse.kr(LFNoise1.kr(gfreq).range(0.8,1) * gfreq), |
|
|
|
dur: 0.2 * LFNoise0.kr(gfreq).range(1,1.2), |
|
|
|
sndbuf: bufnum, |
|
|
|
rate: [rate * LFNoise1.kr.range(0.99, 1), rate * LFNoise1.kr.range(0.99, 1)], |
|
|
|
pos: LFNoise2.kr(0.05).range(0, 1) * LFNoise0.kr(gfreq).range(1,1.02), |
|
|
|
//pos: LFTri.kr(0.25), |
|
|
|
interp: 2, |
|
|
|
pan: pan); |
|
|
|
|
|
|
|
snd = RLPF.ar(snd, freq: LFNoise2.kr(0.1).exprange(400,10000)); |
|
|
|
snd = snd * LFTri.ar(0.073).range(0.1,1); |
|
|
|
snd = snd * env * amp; |
|
|
|
|
|
|
|
Out.ar(out, snd); |
|
|
|
|
|
|
|
}).add; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SynthDef(\verbDelayFX, { |
|
|
|
arg inBus, out=0, revWet=0.8, dlyWet=0.8, feedback = 0.5 ; |
|
|
|
|
|
|
|
var snd = In.ar(inBus, 2); |
|
|
|
var verb = JPverb.ar(snd); |
|
|
|
var delay = Greyhole.ar(snd, feedback: feedback); |
|
|
|
|
|
|
|
snd = snd + (verb * revWet) + (delay * dlyWet) * 0.5; |
|
|
|
Out.ar(out, snd); |
|
|
|
}).add; |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
// create a reverb/delay send bus |
|
|
|
~reverBus = Bus.audio(s,2); |
|
|
|
|
|
|
|
// create processing verb/delay plugin/synth |
|
|
|
~reverbDelay = Synth(\verbDelayFX, [\inBus, ~reverBus], addAction: \addAfter); |
|
|
|
|
|
|
|
// free them if necessary: |
|
|
|
// ~reverbDelay.free |
|
|
|
// ~reverBus.free |
|
|
|
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |
|
|
|
|
|
|
|
( |
|
|
|
// granulation 1 |
|
|
|
~amygran = Synth(\bgrain, |
|
|
|
[\out, ~reverBus, \bufnum, ~getSmp.("amywars"), \amp, 0.5], |
|
|
|
addAction: \addToHead); |
|
|
|
) |
|
|
|
|
|
|
|
( |
|
|
|
// granulation 2 |
|
|
|
~romantiq = Synth(\bgrain, |
|
|
|
[\out, ~reverBus, \bufnum, ~getSmp.("romant"), \amp, 0.05], |
|
|
|
addAction: \addToHead); |
|
|
|
) |
|
|
|
|
|
|
|
// play with arguments: |
|
|
|
~amygran.set(\amp, 0.5) |
|
|
|
~romantiq.set(\amp, 0.05) |
|
|
|
~romantiq.set(\rate, 1) |
|
|
|
|
|
|
|
// fadeout |
|
|
|
~amygran.release(10) |
|
|
|
~romantiq.release(10) |
|
|
|
|
|
|
|
// ----------------------------------------------------------------- |