From 2143e8257a8166ba27bede771df24674b95091d8 Mon Sep 17 00:00:00 2001 From: Arseniusz Date: Sat, 19 Sep 2026 19:51:26 +0300 Subject: [PATCH] initial commit --- instruments.scd | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ main.scd | 34 +++++++++++++ scratchpad.scd | 35 +++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 instruments.scd create mode 100644 main.scd create mode 100644 scratchpad.scd diff --git a/instruments.scd b/instruments.scd new file mode 100644 index 0000000..46a7a22 --- /dev/null +++ b/instruments.scd @@ -0,0 +1,130 @@ +( +var sin_dict = BmDspAlgs.getDict("synths/distorted_sin.scd"); +sin_dict.makeSourceNdef(\sin_bass); + +// TODO: use vars later +~granular_sampler_dict = BmDspAlgs.getDict("samplers/granular_sampler.scd"); +~granular_sampler_dict[\postAmp] = true; +~granular_sampler_dict.makeSourceSynthDef.add(); + +~layered_grain = (); +~layered_grain[\name] = \layered_grain; +~layered_grain[\slots] = ( + percussion: 1, + percussion_2: 2, + noises: 2, + pad: 3, + ambience: 4, + ambience_2: 6, + ambience2: 5 +); + +Ndef(~layered_grain[\name]).clear; +Ndef(~layered_grain[\name]).ar(2); +Ndef(~layered_grain[\name]).prime(~granular_sampler_dict[\name]); + +~melodic_grain = (); +~melodic_grain[\name] = \melodic_grain; +~melodic_grain[\slots] = ( + percussion: 1, + noises: 2, + pad: 3, + ambience: 4, + ambience2: 5 +); + +Ndef(~melodic_grain[\name]).clear; +Ndef(~melodic_grain[\name]).ar(2); +Ndef(~melodic_grain[\name]).prime(~granular_sampler_dict[\name]); + +// global fx chain +Ndef(~layered_grain[\name]).put(148, \filter -> { + | in | + Compander.ar( + in, + in, + \treshHold.kr(0.33), + \slopeBelow.kr(1.5), + \slopeAbove.kr(0.33), + \clampTime.kr(0.15), + \relaxTime.kr(0.6) + ); +}); + +Ndef(~layered_grain[\name]).put(149, \filter -> { + | in | + XFade2.ar(in, Convolution2.ar(in, ~sun_imp), \impulseDryWet.kr(-0.75)); +}); + +Ndef(~layered_grain[\name]).put(150, \filter -> { + | in | + MiVerb.ar(in, \rTime.kr(0.2), \rDryWet.kr(0.1)); +}); + +Ndef(~melodic_grain[\name]).put(149, \filter -> { + | in | + var d = in; + 4.do({ + | i | + var it = i + 1; + d = d + AllpassL.ar(d, 0.5, 0.1 * it, it.reciprocal, it.reciprocal); + }); + in + d; +}); + +Ndef(~melodic_grain[\name]).set(\wet149, 0.33); + +Ndef(~melodic_grain[\name]).put(150, \filter -> { + | in | + MiVerb.ar(in, \rTime.kr(0.2), \rDryWet.kr(0.1)); +}); + + +Spec.add(\treshHold, [0.0, 1.0, \lin]); +Spec.add(\slopeBelow, [1.0, 2.0, \lin]); +Spec.add(\slopeAbove, [0.0, 1.0, \lin]); +Spec.add(\clampTime, [0.01, 2.0, \lin]); +Spec.add(\relaxTime, [0.01, 2.0, \lin]); +Spec.add(\impulseDryWet, [-1.0, 1.0, \lin]); +Spec.add(\attack, [0.01, 2.0, \lin]); + +Ndef(~layered_grain[\name]).play; +Ndef(~melodic_grain[\name]).play; + +//Control nodes +Ndef(\main_pad_amp).clear; +Ndef(\main_pad_amp).kr(1); +Ndef(\main_pad_amp).put(0, { + var e = Env([0.0, \from.kr(-20.dbamp), \to.kr(-6.dbamp)], [0.0, \time.kr(10)], \curve.kr(1)); + EnvGen.kr(e, \gate.tr(0)); +}); +Ndef(\main_pad_amp).play; + +Ndef(\percussion_amp).clear; +Ndef(\percussion_amp).kr(1); +Ndef(\percussion_amp).put(0, { + var e = Env([0.0, \from.kr(-20.dbamp), \to.kr(-6.dbamp)], [0.0, \time.kr(10)]); + EnvGen.kr(e, \gate.tr(0)); +}); +Ndef(\percussion_amp).play; + +Ndef(\pad1_pan_mod).clear; +Ndef(\pad1_pan_mod).kr(1); +Ndef(\pad1_pan_mod).put(0, { + SinOsc.kr(\freq.kr(1), \phase.kr(0.0)).range(\from.kr(-0.25), \to.kr(0.0)); +}); +Ndef(\pad1_pan_mod).play; + +Ndef(\pad1_pan_mod).copy(\pad2_pan_mod); +Ndef(\pad2_pan_mod).set([\from, 0.0, \to, 0.25, \phase, 1.5]); +Ndef(\pad2_pan_mod).play; + +Ndef(\pad_dir_mod, { + Pulse.kr(1).range(0.8, 1.0); +}); + +Ndef(\pad_dir_mod).play; + +Ndef(\main_pad_amp).copy(\envMod4); +Ndef(\envMod4).play; +) diff --git a/main.scd b/main.scd new file mode 100644 index 0000000..6631667 --- /dev/null +++ b/main.scd @@ -0,0 +1,34 @@ +( +s.options.memSize_(2.pow(20)); +s.waitForBoot({ + ~makeBuffers = { |path, event, mono = false| + var dir = PathName.new(path); + var contents = dir.entries; + if (contents.select({ |n| n.isFile }).size > 0) + { + var files, bufArray; + files = contents.select({ |n| n.isFile }); + files = files.select({ |n| + ["aif", "aiff", "wav"].includesEqual(n.extension) + }); + if (event[dir.folderName.asSymbol] != nil) + { "duplicate subfolder name ignored".warn; } + { + bufArray = files.collect({ |n| + if(mono) + { Buffer.readChannel(s, n.fullPath, channels:[0]) } + { Buffer.read(s, n.fullPath) }; + }); + event[dir.folderName.asSymbol] = bufArray; + }; + }; + if (contents.select({ |n| n.isFolder }).size > 0) + { + var folders = contents.select({ |n| n.isFolder }); + folders.do({ |n| ~makeBuffers.(n.fullPath, event, mono) }); + }; + event; + }; + "instruments.scd".loadRelative; +}); +) diff --git a/scratchpad.scd b/scratchpad.scd new file mode 100644 index 0000000..2e138d1 --- /dev/null +++ b/scratchpad.scd @@ -0,0 +1,35 @@ +s.options.memSize = 2.pow(20); +s.boot; + +~inBus = Bus.audio(s, 1); +~out = { Out.ar(~inBus, SoundIn.ar(0)) }.play; + +~freezeDict = BmDspAlgs.getDict("spectral/fft_freeze.scd"); +~freezeDict.makeBufferProcessingNdef(\freezeOnly); +Ndef(\freezeOnly).set(\in, ~inBus.index); +Ndef(\freezeOnly).reshaping = \elastic; +Ndef(\freezeOnly).play; + + +Ndef(\freezeOnly).stop; +Ndef(\freezeOnly).set(\freezeGate, 0); +Ndef(\freezeOnly).set(\freezeGate, 1); + +Ndef(\freezeOnly).put(90, \filter -> {|in| + [in[0], in[1] + SinOsc.kr(0.1).range(0.9, 1.0)] * 0.5; +}); + +Ndef(\freezeOnly).set(\phaseJitter, 10); + +Ndef(\freezeOnly).ar(2); + +~out.free + +Ndef(\freezeOnly).set(\pan, 0); + +~freezeDict.makeBufferProcessingNdef(\freezeOnly2); +Ndef(\freezeOnly2).ar(2); +Ndef(\freezeOnly2).set(\in, ~inBus.index); +Ndef(\freezeOnly2).play; +Ndef(\freezeOnly2).set(\freezeGate, 1); +Ndef(\freezeOnly2).set(\amp, 0.2) \ No newline at end of file