initial commit

microsound-explorer
Arseniusz 5 months ago
commit 0278f19a9d

@ -0,0 +1,9 @@
(
name: "BmDspAlgs",
summary: "WIP! Collection of dictionaries, describing synth nodes.",
version: "0.1.0",
schelp: "BmDspalgs",
dependencies: ["NodeDictionary"],
license: "GPL",
copyright: "Bjornmossa 2023"
)

@ -0,0 +1,8 @@
BmDspAlgs {
*getDict {
| relPath |
var path = PathName(relPath.resolveRelative);
var file = path.fullPath.load;
^NodeDictionary.newFrom(file);
}
}

@ -0,0 +1,14 @@
* Bjornmossa DSP algorythms library
This repo contains SC code for synthesis, processing and analysys algorythms.
* Installation
- Put in startup file: "SC_ALGS_PATH".setenv("path to library".standardizePath);
- install NodeDictionary extention
#+BEGIN_SRC sclang
(
var s = (("SC_ALGS_PATH".getenv) +/+ "synths/substractive/sin.instr.scd").load;
var d = NodeDictionary.newFrom(s);
d.makeSourceSynthDef();
)
#+END_SRC

@ -0,0 +1,12 @@
{
|freq|
var pitchEnv = Env([0, \pitchMultiplier.kr(2.0), 1.0], [0, \pitchDecay.kr(0.01)], [-2]).kr(gate: Impulse.kr(1));
var body = SinOsc.ar(freq * pitchEnv) * \toneGain.kr(1.0);
var noise = WhiteNoise.ar;
var noiseEnv = Env([0.0, 1.0, 0.0], [0, \noiseRelease.kr(0.01)], [-2]).kr(gate: Impulse.kr(1));
var tick = LPF.ar(noise * noiseEnv, \noiseFilter.kr(1000)) * \noiseGain.kr(-12.dbamp);
var sig = Mix([body, tick]);
sig;
}

@ -0,0 +1,7 @@
///// NdefPreset('ping') settings:
List[
('curr' -> [ [ 'freq', 1351.9506519141 ], [ 'lol', 46.544517498748 ] ]),
('set_2' -> [ [ 'freq', 1324.340488568 ], [ 'lol', 62.413186126389 ] ]),
('set_3' -> [ [ 'freq', 1351.9506519141 ], [ 'lol', 46.544517498748 ] ]),
('set_4' -> [ [ 'freq', 2336.4021164021 ], [ 'lol', 161.92380952381 ] ])
]

@ -0,0 +1,6 @@
///// NdefPreset('ping') settings:
List[
('curr' -> [ [ 'freq', 1351.9506519141 ], [ 'lol', 46.544517498748 ] ]),
('set_2' -> [ [ 'freq', 1324.340488568 ], [ 'lol', 62.413186126389 ] ]),
('set_3' -> [ [ 'freq', 1351.9506519141 ], [ 'lol', 46.544517498748 ] ])
]

@ -0,0 +1,6 @@
///// NdefPreset('t') settings:
List[
('curr' -> [ [ 'amp', 0.035950781975341 ], [ 'attack', 0 ], [ 'envCurve', 0 ], [ 'freq', 48.025153769689 ], [ 'noiseFilter', 0 ], [ 'noiseGain', 0 ], [ 'noiseRelease', 0 ], [ 'pan', -0.20283582266837 ], [ 'pitchDecay', 0 ], [ 'pitchMultiplier', 0 ], [ 'release', 0 ], [ 'toneGain', 0 ], [ 'wet1', 0 ] ]),
('sub_kick' -> [ [ 'amp', 0.035950781975341 ], [ 'attack', 0 ], [ 'envCurve', 0 ], [ 'freq', 48.025153769689 ], [ 'noiseFilter', 0 ], [ 'noiseGain', 0 ], [ 'noiseRelease', 0 ], [ 'pan', -0.20283582266837 ], [ 'pitchDecay', 0 ], [ 'pitchMultiplier', 0 ], [ 'release', 0 ], [ 'toneGain', 0 ], [ 'wet1', 0 ] ]),
('metallic_click' -> [ [ 'amp', 0.035950781975341 ], [ 'attack', 0 ], [ 'envCurve', 0 ], [ 'freq', 48.025153769689 ], [ 'noiseFilter', 0 ], [ 'noiseGain', 0 ], [ 'noiseRelease', 0 ], [ 'pan', -0.20283582266837 ], [ 'pitchDecay', 0 ], [ 'pitchMultiplier', 0 ], [ 'release', 0 ], [ 'toneGain', 0 ], [ 'wet1', 0 ] ])
]

@ -0,0 +1,5 @@
///// NdefPreset('t') settings:
List[
('curr' -> [ [ 'amp', 0.035950781975341 ], [ 'attack', 0 ], [ 'envCurve', 0 ], [ 'freq', 48.025153769689 ], [ 'noiseFilter', 0 ], [ 'noiseGain', 0 ], [ 'noiseRelease', 0 ], [ 'pan', -0.20283582266837 ], [ 'pitchDecay', 0 ], [ 'pitchMultiplier', 0 ], [ 'release', 0 ], [ 'toneGain', 0 ], [ 'wet1', 0 ] ]),
('sub_kick' -> [ [ 'amp', 0.035950781975341 ], [ 'attack', 0 ], [ 'envCurve', 0 ], [ 'freq', 48.025153769689 ], [ 'noiseFilter', 0 ], [ 'noiseGain', 0 ], [ 'noiseRelease', 0 ], [ 'pan', -0.20283582266837 ], [ 'pitchDecay', 0 ], [ 'pitchMultiplier', 0 ], [ 'release', 0 ], [ 'toneGain', 0 ], [ 'wet1', 0 ] ])
]

@ -0,0 +1,12 @@
(
name: 'Amplitude_Analyzer',
func: {
| in |
Amplitude.ar(in, \attackTime.kr(0.01), \releaseTime.kr(0.01));
},
specs:(
attackTime: [0.01, 1.0],
releaseTime: [0.01, 1.0]
),
convertToKr: true
)

@ -0,0 +1,12 @@
(
name: 'Tartini_Analyzer',
func: {
| in |
var freq, hasFreq;
# freq, hasFreq = Tartini.kr(in, \threshold.kr(0.93));
freq;
},
specs:(
threshold: [0.01, 1.0]
)
)

@ -0,0 +1,120 @@
s.boot;
// load instrument and presets
(
var perc_gen_source = (("SC_ALGS_PATH".getenv)+/+"synths/perc_gen/instr.scd").load;
~perc_gen_dict = NodeDictionary.newFrom(perc_gen_source);
~perc_gen_presets = (("SC_ALGS_PATH".getenv)+/+"synths/perc_gen/presets.scd").load;
)
~perc_gen_presets.do({
|preset|
preset.key.postln;
// Make Ndef with same name as preset name
~perc_gen_dict.makeSourceNDef(preset.key);
// Apply settings
preset.value.do({|v| Ndef(preset.key).set(v[0], v[1])});
Ndef(preset.key).play;
});
// add some Tdefs
Tdef(\kick, {
loop{
Ndef(~perc_gen_presets[0].key).set(\amp, 8.dbamp);
Ndef(~perc_gen_presets[0].key).set(\gate, 1);
1.wait;
}
}).play;
Tdef(\kick2, {
(1/3).wait;
loop{
Ndef(~perc_gen_presets[0].key).set(\amp, 4.dbamp);
Ndef(~perc_gen_presets[0].key).set(\gate, 1);
1.wait;
}
}).play;
Tdef(\hat, {
var amps = Pseq([1, 1, 0, 1, 0, 1]).loop.asStream;
loop{
Ndef(~perc_gen_presets[1].key).set(\gate, 1);
Ndef(~perc_gen_presets[1].key).set(\amp, -6.dbamp * amps.next);
(1/6).wait;
}
}).play;
Tdef(\snare, {
loop{
Ndef(~perc_gen_presets[4].key).set(\amp, -8.dbamp);
Ndef(~perc_gen_presets[4].key).set(\gate, 1);
(4/3).wait;
}
}).play;
Tdef(\wood, {
var amps = Pbjorklund(4, 7).loop.asStream;
loop{
Ndef(~perc_gen_presets[3].key).set(\gate, 1);
Ndef(~perc_gen_presets[3].key).set(\amp, -6.dbamp * amps.next);
(1/8).wait;
}
}).play;
Ndef(\fx).ar(2);
Ndef(\fx, {
var in = \in.ar([0, 0]);
var t1 = \t1.kr(0.5);
var t2 = \t2.kr(0.5);
[in[0] + CombC.ar(in[0], 1.0, t1, 2.0), in[1] + CombC.ar(in[1], 1.0, t2, 2.0)];
});
Ndef(\fx).play;
(
// WORKS ONLY FOR LAST!
[0, 1, 3, 4].do({
|index|
Ndef(\fx) <<>.in Ndef(~perc_gen_presets[index].key);
});
)
// constrol fx delay time
Tdef(\fxdelay, {
var dTimes1 = Pseq([1/8, 1/16, 1/3]).loop.asStream;
var dTimes2 = Pseq([1/16, 1/3, 1/8]).loop.asStream;
loop{
Ndef(\fx).set(\t1, dTimes1);
Ndef(\fx).set(\t2, dTimes2);
(4/3).wait;
}
}).play;
(
Ndef(\fx2).ar(2);
Ndef(\fx2, {
var in = \in.ar([0, 0]);
var sig = PitchShift.ar(in, 0.2, Lag.kr(LFSaw.kr(0.1).range(0.2, 0.25)), 1/2);
sig = DiodeRingMod.ar(sig, LFPulse.ar(160));
FreeVerb.ar(sig, 0.8, 1.0, 0.25) * 10;
});
Ndef(\fx2).play;
)
Ndef(\fx2) <<>.in Ndef(~perc_gen_presets[1].key)
Tdef(\fxswitch, {
var source = Pseq([1, 3]).loop.asStream;
loop{
Ndef(\fx2) <<>.in Ndef(~perc_gen_presets[source.next].key);
6.wait;
}
}).play;
Tdef(\fxswitch).stop
(
Ndef.clear;
Tdef.clear;
)

@ -0,0 +1,10 @@
///// NdefPreset('perc_gen') settings:
List[
('curr' -> [ [ 'amp', 1.0 ], [ 'attack', 0.0016867298746493 ], [ 'envCurve', -3.0996058378609 ], [ 'freq', 783.00516829582 ], [ 'noiseFilter', 17183.641205923 ], [ 'noiseGain', 0.50243244202976 ], [ 'noiseRelease', 0.065719434679166 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.123646709989 ], [ 'release', 0.041551969035191 ], [ 'toneGain', 0.29721955896453 ] ]),
('subkick' -> [ [ 'amp', 1 ], [ 'attack', 0.015291005291005 ], [ 'envCurve', -5.1111111111111 ], [ 'freq', 41.542278519329 ], [ 'noiseFilter', 1555.5555555556 ], [ 'noiseGain', 0.031746031746032 ], [ 'noiseRelease', 0.020529100529101 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.2524338624339 ], [ 'release', 0.041587301587302 ], [ 'toneGain', 1.0 ] ]),
('clicky_hat' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 9283.1776672256 ], [ 'noiseFilter', 9565.7142857143 ], [ 'noiseGain', 0.1957671957672 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.8631216931217 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_snare' -> [ [ 'amp', 1 ], [ 'attack', 0.026455026455026 ], [ 'envCurve', -3.3968253968254 ], [ 'freq', 321.64677553341 ], [ 'noiseFilter', 14519.365079365 ], [ 'noiseGain', 0.34391534391534 ], [ 'noiseRelease', 0.88391534391534 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 0.77862433862434 ], [ 'release', 0.50486772486772 ], [ 'toneGain', 0.0 ] ]),
('wood_1' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 831.91243261437 ], [ 'noiseFilter', 17365.079365079 ], [ 'noiseGain', 0.51322751322751 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.1471428571429 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_wood' -> [ [ 'amp', 1.0 ], [ 'attack', 0.0016867298746493 ], [ 'envCurve', -3.0996058378609 ], [ 'freq', 783.00516829582 ], [ 'noiseFilter', 17183.641205923 ], [ 'noiseGain', 0.50243244202976 ], [ 'noiseRelease', 0.065719434679166 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.123646709989 ], [ 'release', 0.041551969035191 ], [ 'toneGain', 0.29721955896453 ] ]),
('laser_click' -> [ [ 'amp', 1.0 ], [ 'attack', 0.00020376602512542 ], [ 'envCurve', -3.0818102716666 ], [ 'freq', 6885.8872393363 ], [ 'noiseFilter', 10486.000759297 ], [ 'noiseGain', 0.23281400404053 ], [ 'noiseRelease', 0.016731206873993 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.062423564504101 ], [ 'pitchMultiplier', 1.7737891448238 ], [ 'release', 0.013811647265996 ], [ 'toneGain', 0.31501512515881 ] ])
]

@ -0,0 +1,9 @@
///// NdefPreset('perc_gen') settings:
List[
('curr' -> [ [ 'amp', 1.0 ], [ 'attack', 0.0016867298746493 ], [ 'envCurve', -3.0996058378609 ], [ 'freq', 783.00516829582 ], [ 'noiseFilter', 17183.641205923 ], [ 'noiseGain', 0.50243244202976 ], [ 'noiseRelease', 0.065719434679166 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.123646709989 ], [ 'release', 0.041551969035191 ], [ 'toneGain', 0.29721955896453 ] ]),
('subkick' -> [ [ 'amp', 1 ], [ 'attack', 0.015291005291005 ], [ 'envCurve', -5.1111111111111 ], [ 'freq', 41.542278519329 ], [ 'noiseFilter', 1555.5555555556 ], [ 'noiseGain', 0.031746031746032 ], [ 'noiseRelease', 0.020529100529101 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.2524338624339 ], [ 'release', 0.041587301587302 ], [ 'toneGain', 1.0 ] ]),
('clicky_hat' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 9283.1776672256 ], [ 'noiseFilter', 9565.7142857143 ], [ 'noiseGain', 0.1957671957672 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.8631216931217 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_snare' -> [ [ 'amp', 1 ], [ 'attack', 0.026455026455026 ], [ 'envCurve', -3.3968253968254 ], [ 'freq', 321.64677553341 ], [ 'noiseFilter', 14519.365079365 ], [ 'noiseGain', 0.34391534391534 ], [ 'noiseRelease', 0.88391534391534 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 0.77862433862434 ], [ 'release', 0.50486772486772 ], [ 'toneGain', 0.0 ] ]),
('wood_1' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 831.91243261437 ], [ 'noiseFilter', 17365.079365079 ], [ 'noiseGain', 0.51322751322751 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.1471428571429 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_wood' -> [ [ 'amp', 1.0 ], [ 'attack', 0.0016867298746493 ], [ 'envCurve', -3.0996058378609 ], [ 'freq', 783.00516829582 ], [ 'noiseFilter', 17183.641205923 ], [ 'noiseGain', 0.50243244202976 ], [ 'noiseRelease', 0.065719434679166 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.123646709989 ], [ 'release', 0.041551969035191 ], [ 'toneGain', 0.29721955896453 ] ])
]

@ -0,0 +1,31 @@
s.boot;
// load instrument and create NDef
(
var perc_gen_source = (("SC_ALGS_PATH".getenv)+/+"synths/perc_gen/instr.scd").load;
~perc_gen_dict = NodeDictionary.newFrom(perc_gen_source);
~perc_gen_dict.makeSourceNDef();
)
// apply specs from dictionary
~perc_gen_dict[\specs].keysValuesDo({|k, v| Ndef(~perc_gen_dict[\name]).addSpec(k, v);});
Ndef(~perc_gen_dict[\name]).edit;
Ndef(~perc_gen_dict[\name]).play;
p = NdefPreset(Ndef(~perc_gen_dict[\name]));
w = Window("Preset test", Rect(200, 200, 420, 350)).front;
w.addFlowLayout;
g = ProxyPresetGui(p, parent: w);
b = NdefGui(Ndef(~perc_gen_dict[\name]), 8, parent: w);
// Run periodical trigger
Tdef(\t, {
loop {
Ndef(~perc_gen_dict[\name]).set(\gate, 1);
1.wait;
}
}).play;
Ndef.clear;
Tdef.clear;

@ -0,0 +1,36 @@
(
name: 'granular_looper',
func: {
| buf |
var frames = BufFrames.kr(buf);
var tFreq = \trgFreq.kr(100);
var trg = Impulse.ar(tFreq);
var overlap = \overlap.kr(2);
var resetPos = \resetPos.kr(0);
var resetTrig = Changed.kr(resetPos, 1);
var pos = Phasor.ar(
trig: resetTrig,
rate: BufRateScale.kr(buf) * \direction.kr(1),
start: \start.kr(0),
end: \end.kr(1.0) * frames,
resetPos: resetPos
);
GrainBuf.ar(
numChannels:2,
trigger: trg,
dur: overlap / tFreq,
sndbuf: buf,
rate: BufRateScale.kr(buf) * \rate.kr(1),
pos: pos / frames,
interp: 2,
pan: \pan.kr(0),
envbufnum: -1,
);
},
limitDuration: true,
specs:(
rate: [-10,0, 10.0],
pan: [-1.0, 1.0]
)
)

@ -0,0 +1,48 @@
(
name: 'granular_sampler',
func: {
| freq, gate |
var buf = \buf.kr;
var trigger = gate;
var bufFrames = BufFrames.kr(buf);
var grainTriggerFreq = \grainTriggerFreq.kr(20);
var positionRamp = Phasor.ar(
trigger,
rate: BufRateScale.kr(buf) * \rate.kr(1),
start: \sampleStart.kr(0),
end: \sampleEnd.kr(1),
) * \direction.kr(1);
var envelope = EnvGen.kr(
Env([0, 1, 1, 0], [0, BufDur.kr(buf) - 0.01, 0]),
trigger
);
GrainBuf.ar(
numChannels: 2,
trigger: Impulse.ar(grainTriggerFreq),
dur: \density.kr(2) / grainTriggerFreq,
sndbuf: buf,
rate: \grainRate.kr(1),
pos: positionRamp / bufFrames,
interp: 0,
pan: \pan.kr(0),
envbufnum: -1,
) * envelope;
},
specs:(
density: [0.1, 10.0, \lin ,0.1, 2],
direction: [-1, 1, \lin, 1, 1],
grainRate: [0.1, 2, \lin, 0.1, 1],
grainTriggerFreq: [0.1, 200, \lin, 0.1, 20],
pan: [-1.0, 1.0, \lin, 0.1, 0],
rate: [0.1, 2, \lin, 0.01, 1],
),
useEnv: true,
defaults:(
attack: 0.01,
release: 0.1,
curve: 1
),
)

@ -0,0 +1,50 @@
(
name: 'granular_sampler_stereo',
func: {
| freq, gate |
var bufL = \bufL.kr;
var bufR= \bufR.kr;
var trigger = gate;
var bufFrames = BufFrames.kr(bufL);
var grainTriggerFreq = \grainTriggerFreq.kr(5);
var positionRamp = Phasor.ar(
trigger,
rate: BufRateScale.kr(bufL) * \rate.kr(1),
start: bufFrames * \sampleStart.kr(0),
end: bufFrames * \sampleEnd.kr(1),
) * \direction.kr(1);
var envelope = EnvGen.kr(
Env([0, 1, 1, 0], [0, BufDur.kr(bufL) - 0.01, 0]),
trigger
);
GrainBuf.ar(
numChannels: 1,
trigger: Impulse.ar(grainTriggerFreq),
dur: \density.kr(2) / grainTriggerFreq,
sndbuf: [bufL,bufR],
rate: \grainRate.kr(1),
pos: positionRamp / bufFrames ,
interp: 2,
envbufnum: -1,
) * envelope;
},
specs:(
density: [0.1, 10.0, \lin ,0.1, 2],
direction: [-1, 1, \lin, 1, 1],
grainRate: [0.1, 2, \lin, 0.1, 1],
grainTriggerFreq: [0.1, 200, \lin, 0.1, 20],
pan: [-1.0, 1.0, \lin, 0.1, 0],
rate: [0.1, 2, \lin, 0.01, 1],
sampleStart: [0.0, 1.0, \lin, 0.001, 0.0],
sampleEnd: [1.0, 0.0, \lin, 0.001, 1],
),
useEnv: false,
defaults:(
attack: 0.01,
release: 0.1,
curve: 1
),
)

@ -0,0 +1,19 @@
(
name: 'recorder',
func: {
| buf |
RecordBuf.ar(
SoundIn.ar(\in.kr(0)),
buf,
Phasor.ar(BufSamples.kr(buf), resetPos: \reset.kr(1000)),
\recLevel.kr(1.0),
run: \record.kr(1),
preLevel: \preLevel.kr(0.0)
);
},
specs:(
record: [0, 1],
preLevel: [0.0, 1.0],
recLevel: [0.0, 1.0]
)
)

@ -0,0 +1,32 @@
(
name: 'Sampler_Enveloped',
func: {
| buf |
var start = \start.kr(0), end = \end.kr(0);
var phasor = Phasor.ar(rate: BufRateScale.kr(buf).poll, start: start, end: end);
var reader = BufRd.ar(1, buf, phasor, loop:1, interpolation:4);
reader;
// var start = \start.kr(0.0);
// var end = \end.kr(1.0);
// var phasor = EnvGen.ar(
// Env([start, end], [end - start], curve: \curve.kr(0)),
// //gate: Impulse.kr(1),
// timeScale: BufRateScale.kr(buf).reciprocal,
// doneAction: 0
// ) * SampleRate.ir;
// phasor.poll;
// //BufRd.ar(1, buf, phasor, loop:0, interpolation:4);
// EnvGen.kr(Env([0,1,1,0], [0.01, end - start - 0.03, 0.01] ), doneAction: 2);
// BufRd.ar(1, buf, phasor, loop:0, interpolation:4);
},
specs:(
start: [0.0, 1.0],
end: [0.0, 1.0],
curve: [-5, 5],
rate: [0,0, 1.0]
)
)

@ -0,0 +1,25 @@
(
name: 'saw_bass',
func: {
| freq |
var s1 = Saw.ar(freq);
var s2 = Saw.ar(freq * \detune.kr(1));
var s3 = SinOsc.ar(freq * 0.5);
Pan2.ar(Mix([s1, s2, s3]) * (SinOsc.ar(freq * 0.5, rrand(0.01, 2.0)) * \modRate.kr(100)), \pan.kr(0));
},
//sustained: true,
useFreqLag: true,
useSaturation: true,
saturationSteps: 4,
useEnv: true,
specs:(
modRate: [0.01, 2.0]
),
defaults:(
attack: 0.01,
release: 0.1,
curve: 1
)
)

@ -0,0 +1,25 @@
(
name: 'distorted_sin',
func: {
| freq, gate |
var sig = SinOsc.ar(freq, \phase.kr(2pi).mod(2pi));
//4.do { sig = HPF.ar(sig, 60); };
//4.do { sig = LPF.ar(sig, \lpf.kr(100)); };
4.do { sig = sig.tanh; };
[sig, DelayN.ar(sig, 0.2, 0.01)] * 0.5;
},
specs:(
phase: [-25.0, 25.0, \lin, 0.1, 6.28],
lpf: [60, 4000, \lin, 1, 100],
),
useSaturation: true,
saturationSteps: 6,
useEnv: true,
defaults:(
attack: 0.01,
release: 0.1,
curve: 1
),
usePan: true,
panning: \splay
)

@ -0,0 +1,38 @@
(
name: 'delayed_pulse_drone',
func: {
|freq|
var ap;
var numWaves = 6;
var formants = Array.series(numWaves, 1, \freqAddStep.ir(1.25));
var freqs = formants * freq;
var widths = { Rand(0.0, 1.0) }!numWaves;
var sig = Pulse.ar(freqs, widths);
sig = sig.collect { |s, i| s * (i + 1).reciprocal; };
sig = sig.collect { |s| OnePole.ar(s, \onePoleCoef.kr(0.5)); };
ap = numWaves.collect { |it|
AllpassC.ar(
sig[it],
0.2,
SinOsc.kr(\delayModFreq.kr(0.1), rrand(0.0, 2pi)).range(0.08, 0.1))
};
sig = LinXFade2.ar(sig, ap, \drywet.kr(0.5));
sig = SplayAz.ar(numWaves, sig, orientation: \orientation.kr(0.5));
sig;
},
useEnv: true,
specs:(
freqAddStep: [1.0, 10.0],
onePoleCoef: [0.0, 0.98],
drywet: [0.0, 1.0],
orientation: [0.0, 10.0],
delayModFreq: [0.0001, 1.0]
),
defaults:(
attack: 0.01,
release: 0.1,
curve: 1
)
)

@ -0,0 +1,36 @@
(
name: 'perc_gen',
func: {
|freq, gate|
var pitchEnv = Env([0, \pitchMultiplier.kr(2.0), 1.0], [0, \pitchDecay.kr(0.01)], [-2]).kr(gate: gate);
var f = freq * pitchEnv;
var ff = f * (\fRatio1.kr(1) / \fRatio2.kr(1));
var mod = SinOsc.ar(ff) * f * \modIndex.kr(0.0);
var body = SinOsc.ar(f + mod) * \toneGain.kr(1.0);
var noise = WhiteNoise.ar;
var noiseEnv = Env([0.0, 1.0, 0.0], [0, \noiseRelease.kr(0.01)], [-2]).kr(gate: gate);
var tick = LPF.ar(noise * noiseEnv, \noiseFilter.kr(1000)) * \noiseGain.kr(-12.dbamp);
var sig = Mix([body, tick]);
sig;
},
useSaturation: true,
saturationSteps: 4,
useEnv: true,
defaults: (attack: 0.01, decay: 0.05, curve: -4),
specs:(
attack: [0.0, 1.0],
envCurve: [-6, 6],
noiseFilter: [80, 20000],
noiseGain: [0.0, 1.0],
noiseRelease: [0.01, 2.0],
pitchDecay: [0.01, 4.0],
pitchMultiplier: [0.01, 2.0],
release: [0.01, 2.0],
toneGain: [0.0, 1.0],
fRatio1: [1.0, 10.0],
fRatio2: [1.0, 10.0],
modIndex: [0.0, 1.0]
)
)

@ -0,0 +1,9 @@
///// NdefPreset('perc_gen') settings:
List[
('subkick' -> [ [ 'amp', 1 ], [ 'attack', 0.015291005291005 ], [ 'envCurve', -5.1111111111111 ], [ 'freq', 41.542278519329 ], [ 'noiseFilter', 1555.5555555556 ], [ 'noiseGain', 0.031746031746032 ], [ 'noiseRelease', 0.020529100529101 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.2524338624339 ], [ 'release', 0.041587301587302 ], [ 'toneGain', 1.0 ] ]),
('clicky_hat' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 9283.1776672256 ], [ 'noiseFilter', 9565.7142857143 ], [ 'noiseGain', 0.1957671957672 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.052222222222222 ], [ 'pitchMultiplier', 1.8631216931217 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_snare' -> [ [ 'amp', 1 ], [ 'attack', 0.026455026455026 ], [ 'envCurve', -3.3968253968254 ], [ 'freq', 321.64677553341 ], [ 'noiseFilter', 14519.365079365 ], [ 'noiseGain', 0.34391534391534 ], [ 'noiseRelease', 0.88391534391534 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 0.77862433862434 ], [ 'release', 0.50486772486772 ], [ 'toneGain', 0.0 ] ]),
('wood_1' -> [ [ 'amp', 1 ], [ 'attack', 0.0 ], [ 'envCurve', -3.0793650793651 ], [ 'freq', 831.91243261437 ], [ 'noiseFilter', 17365.079365079 ], [ 'noiseGain', 0.51322751322751 ], [ 'noiseRelease', 0.01 ], [ 'pan', 0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.1471428571429 ], [ 'release', 0.01 ], [ 'toneGain', 0.31746031746032 ] ]),
('noisy_wood' -> [ [ 'amp', 1.0 ], [ 'attack', 0.0016867298746493 ], [ 'envCurve', -3.0996058378609 ], [ 'freq', 783.00516829582 ], [ 'noiseFilter', 17183.641205923 ], [ 'noiseGain', 0.50243244202976 ], [ 'noiseRelease', 0.065719434679166 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.13666666666667 ], [ 'pitchMultiplier', 1.123646709989 ], [ 'release', 0.041551969035191 ], [ 'toneGain', 0.29721955896453 ] ]),
('laser_click' -> [ [ 'amp', 1.0 ], [ 'attack', 0.00020376602512542 ], [ 'envCurve', -3.0818102716666 ], [ 'freq', 6885.8872393363 ], [ 'noiseFilter', 10486.000759297 ], [ 'noiseGain', 0.23281400404053 ], [ 'noiseRelease', 0.016731206873993 ], [ 'pan', 0.0 ], [ 'pitchDecay', 0.062423564504101 ], [ 'pitchMultiplier', 1.7737891448238 ], [ 'release', 0.013811647265996 ], [ 'toneGain', 0.31501512515881 ] ])
]

@ -0,0 +1,17 @@
(
name: 'tonal_kick',
func: (("SC_ALGS_PATH".getenv)+/+"algs/envedSinWithNoise.scd").load,
useSaturation: true,
saturationSteps: 4,
useEnv: true,
defaults: (attack: 0.01, decay: 0.05, curve: -4),
specs:(
pitchMultiplier: [0.01, 2.0],
pitchDecay: [0.01, 4.0],
noiseFilter: [80, 20000],
noiseGain: [0.0, 1.0],
attack: [0.0, 1.0],
release: [0.01, 2.0]
)
)

@ -0,0 +1,24 @@
(
name: 'resonant_hat',
func: {
var env = Env([1, 0], [\decay.kr(0.05)], \envCurve.kr(-4)).kr(2);
var sig = BrownNoise.ar;
var filterFreq = \filtFreq.kr(8000);
var bandWidth = \bandwidth.kr(0.05);
var theta = (filterFreq * 2 * 3.14159) / SampleRate.ir();
var r = 1 - ((theta * bandWidth) / 2);
var a0 = (1 - r.pow(2)) / 2;
var ampComp = 1 - ( 1 / a0) * a0.sqrt;
sig = Resonz.ar(sig, filterFreq , bandWidth);
sig * ampComp;
},
specs:(
decay: [0.01, 2.0],
envCurve: [-4, 4],
bandwidth: [0.01, 1.0],
noiseGain: [0.0, 1.0],
attack: [0.0, 1.0],
release: [0.01, 2.0]
)
)

@ -0,0 +1,9 @@
(
name: 'sin',
func: (("SC_ALGS_PATH".getenv) +/+ "synths/substractive/sin.scd").load,
useEnv: true,
useSaturation: true,
saturationSteps: 4,
useLfo: true,
lfoWave: \saw
)

@ -0,0 +1,4 @@
{
|freq|
SinOsc.ar(freq);
}

@ -0,0 +1,29 @@
NodeDictionary : IdentityDictionary {
getDefaultOr {
| key, defaultValue |
if(this[\defaults][key].isNil, {
^defaultValue
}, {
^this[\defaults][key]
});
}
makeAnalysysNdef {
^Ndef(this[\name], {
var input = SoundIn.ar(\bus.kr(0));
var signal = SynthDef.wrap(
func: this[\func],
prependArgs: [input]
);
if(this[\convertToKr].isNil.not
and:
this[\convertToKr] == true,
{
A2K.kr(signal);
}, {
signal;
});
});
}
}

@ -0,0 +1,14 @@
+ NodeDictionary {
makeBufferProcessingNdef {
| name, buf, quant = 1.0 |
var ndef = Ndef(name);
ndef.proxyspace.quant = quant;
ndef[0] = SynthDef.wrap(
func: this[\func],
prependArgs: [buf]
);
ndef.play;
^ndef;
}
}

@ -0,0 +1,32 @@
+ NodeDictionary {
makeBufferProcessingSynthDef {
SynthDef(this[\name], {
var buf = \buf.kr;
var signal = SynthDef.wrap(
func: this[\func],
prependArgs: [buf]
);
signal = Pan2.ar(
signal * \amp.kr(1),
\pan.kr(0)
);
if(this[\detectSilence].asBoolean, {
FreeSelf.kr(
DetectSilence.ar(
[signal[0], signal[1]] + Impulse.ar(0)
).product)
});
if(this[\limitDuration].asBoolean, {
Line.kr(0, 1, \dur.kr(1), doneAction: 2);
});
Out.ar(
\out.kr(0),
signal
);
}).add;
}
}

@ -0,0 +1,74 @@
+ NodeDictionary {
makeSourceNdef {
| name |
var internalName = if(name.isNil, {this[\name]}, {name});
Ndef(internalName, {
var freq, signal, env, gate;
var releaseNode = if (
this[\sustained].asBoolean,
{ 2 },
{ nil }
);
gate = \gate.tr(0);
freq = \freq.kr(220);
if(this[\useFreqLag].asBoolean, {
freq = Lag.kr(freq, \freqLag.kr(0.5));
});
signal = SynthDef.wrap(
func: this[\func],
prependArgs: [freq, gate]
);
if(this[\useLfo].asBoolean, {
var lfo = switch(this[\lfoWave])
{ \sin } { SinOsc }
{ \saw } { Saw }
{ \tri } { LFTri }
{ \pulse } { Pulse }
? SinOsc;
signal = signal * lfo.kr(
\lfoFreq.kr(1)
).range(
1 - \lfoGain.kr(0.5), 1
);
});
if(this[\useSaturation].asBoolean, {
this[\saturationSteps].do {
signal = signal.tanh;
}
});
if(this[\useEnv].asBoolean, {
var att = this.getDefaultOr(\attack, 0.1);
var rel = this.getDefaultOr(\release, 0.1);
var curve = this.getDefaultOr(\curve, 1);
var env = Env(
[0, 0, 1, 0],
[0, \attack.kr(att), \release.kr(rel)],
[0, \attackCurve.kr(curve), \releaseCurve.kr(curve)],
releaseNode: releaseNode,
).kr(0, gate: gate);
signal = signal * env;
});
if(this[\usePan].asBoolean, {
switch(this[\panning],
\splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); },
\splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); },
\pan, { signal = Pan2.ar(signal, \pan.kr(0)); }
);
});
signal * \amp.kr(1);
});
}
}

@ -0,0 +1,84 @@
+ NodeDictionary {
makeSourceSynthDef {
^SynthDef(this[\name], {
var freq, signal, env, gate;
var releaseNode = if (
this[\sustained].asBoolean,
{ 2 },
{ nil }
);
var envDoneAction = if (
this[\sustained].asBoolean,
{ 0 },
{ 2 }
);
gate = \gate.tr(0);
freq = \freq.kr(220);
if(this[\useFreqLag].asBoolean, {
freq = Lag.kr(freq, \freqLag.kr(0.5));
});
signal = SynthDef.wrap(
func: this[\func],
prependArgs: [freq, gate]
);
if(this[\useLfo].asBoolean, {
var lfo = switch(this[\lfoWave])
{ \sin } { SinOsc }
{ \saw } { Saw }
{ \tri } { LFTri }
{ \pulse } { Pulse }
? SinOsc;
signal = signal * lfo.kr(
\lfoFreq.kr(1)
).range(
1 - \lfoGain.kr(0.5), 1
);
});
if(this[\useSaturation].asBoolean, {
this[\saturationSteps].do {
signal = signal.tanh;
}
});
if(this[\useEnv].asBoolean, {
var att = this.getDefaultOr(\attack, 0.1);
var rel = this.getDefaultOr(\release, 0.1);
var curve = this.getDefaultOr(\curve, 1);
var env = Env(
[0, 0, 1, 0],
[0, \attack.kr(att), \release.kr(rel)],
\envCurve.kr(curve),
releaseNode: releaseNode,
).kr(envDoneAction, gate: gate);
signal = signal * env;
});
switch(this[\panning],
\splay, { signal = Splay.ar(signal, \spread.kr(1), center: \pan.kr(0)); },
\splayAz, { signal = SplayAz.ar(this[\panningChannels], signal, orientation: \orientation.kr(0.5)); },
nil, { signal = Pan2.ar(signal, \pan.kr(0)); }
);
signal = signal * \amp.kr(1);
if(this[\postAmp].asBoolean, {
signal = signal * \postAmp.kr(1);
});
Out.ar(
\out.kr(0),
signal,
);
});
}
}

@ -0,0 +1,15 @@
BatLib
Bjorklund
crucial-library
ddwCommon
ddwGUIEnhancements
ddwMixerChannel
Dirt-Samples
JITLibExtensions
miSCellaneous_lib
quarks
SuperDirt
Vowel
ChordSymbol
mi-UGens

@ -0,0 +1,7 @@
* About
* Structure
- NodeDictionary
Set of Dictionary class extentions for generating
nodes from declarative definitions
Loading…
Cancel
Save