Skip to content

Instantly share code, notes, and snippets.

@williamthazard
Last active May 20, 2023 06:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save williamthazard/1a540104dff9c0f4a8f02d8bad63c3a4 to your computer and use it in GitHub Desktop.
Save williamthazard/1a540104dff9c0f4a8f02d8bad63c3a4 to your computer and use it in GitHub Desktop.
WIP: cybernetic feedback interaction
(
Server.default = Server.local;
Server.default.options.memSize_(2.pow(20)).device_("Scarlett 4i4 USB");
Server.default.waitForBoot({
Ndef(\cfi,
{
var in, imp, imp1, imp2, klnk, sound, sound1, sound2, sound3;
in = LocalIn.ar(1);
imp1 = DFM1.ar(Dust.ar(\density1.kr(0.1, 0.5),\pingamp1.kr(0.01, 0.5,))+(LeakDC.ar(in)*0.001),\filter1_freq.kr(1000, 0.5),\filter1_res.kr(0.75, 0.5));
imp2 = DFM1.ar(Dust.ar(\density2.kr(0.1, 0.5),\pingamp2.kr(0.01, 0.5))+(LeakDC.ar(in)*0.001),\filter2_freq.kr(880, 0.5),\filter2_res.kr(0.8, 0.5));
imp = imp1 + imp2;
klnk = DynKlank.ar(`
[
[
\klnkfreq1.kr(50, 0.5),
\klnkfreq2.kr(60, 0.5),
\klnkfreq3.kr(200, 0.5),
\klnkfreq4.kr(300, 0.5),
\klnkfreq5.kr(400, 0.5),
\klnkfreq6.kr(800, 0.5)
],
[
\klnkamp1.kr(0.05, 0.5),
\klnkamp2.kr(0.05, 0.5),
\klnkamp3.kr(0.05, 0.5),
\klnkamp4.kr(0.03, 0.5),
\klnkamp5.kr(0.03, 0.5),
\klnkamp6.kr(0.03, 0.5)
],
[
\klnktime1.kr(1, 0.5),
\klnktime2.kr(1, 0.5),
\klnktime3.kr(1, 0.5),
\klnktime4.kr(1, 0.5),
\klnktime5.kr(1, 0.5),
\klnktime6.kr(1, 0.5)
]
],
imp
);
sound1 = CombC.ar(LeakDC.ar(klnk), 5, \delay1_time.kr(0.5, 0.5), \delay1_decay.kr(1, 0.5));
sound2 = CombC.ar(LeakDC.ar(sound1), 5, \delay2_time.kr(8, 0.5), \delay2_decay.kr(2, 0.5));
sound3 = CombC.ar(LeakDC.ar(sound2), 5, \delay3_time.kr(21, 0.5), \delay3_decay.kr(3, 0.5));
sound = CombC.ar(LeakDC.ar(sound3), 5, \delay4_time.kr(34, 0.5), \delay4_decay.kr(5, 0.5));
LocalOut.ar(LeakDC.ar(sound)); // for feedback
Out.ar(0,in!2)
}).play;
Spec.add(\density1,[0,2,'lin',0,0.1].asSpec);
Spec.add(\pingamp1,[0,1,'lin',0,0.01].asSpec);
Spec.add(\density2,[0,2,'lin',0,0.1].asSpec);
Spec.add(\pingamp2,[0,1,'lin',0,0.01].asSpec);
Spec.add(\filter1_freq,[20,4000,'exp',0,1000,'Hz'].asSpec);
Spec.add(\filter1_res,[0,1,'lin',0.001,0.75].asSpec);
Spec.add(\filter2_freq,[20,4000,'exp',0,880,'Hz'].asSpec);
Spec.add(\filter2_res,[0,1,'lin',0.001,0.8].asSpec);
Spec.add(\klnkfreq1,[20,4000,'exp',0,50,'Hz'].asSpec);
Spec.add(\klnkfreq2,[20,4000,'exp',0,60,'Hz'].asSpec);
Spec.add(\klnkfreq3,[20,4000,'exp',0,200,'Hz'].asSpec);
Spec.add(\klnkfreq4,[20,4000,'exp',0,300,'Hz'].asSpec);
Spec.add(\klnkfreq5,[20,4000,'exp',0,400,'Hz'].asSpec);
Spec.add(\klnkfreq6,[20,4000,'exp',0,800,'Hz'].asSpec);
Spec.add(\klnkamp1,[0,0.1,'lin',0,0.05].asSpec);
Spec.add(\klnkamp2,[0,0.1,'lin',0,0.05].asSpec);
Spec.add(\klnkamp3,[0,0.1,'lin',0,0.05].asSpec);
Spec.add(\klnkamp4,[0,0.1,'lin',0,0.03].asSpec);
Spec.add(\klnkamp5,[0,0.1,'lin',0,0.03].asSpec);
Spec.add(\klnkamp6,[0,0.1,'lin',0,0.03].asSpec);
Spec.add(\klnktime1,[0,2,'lin',0,1].asSpec);
Spec.add(\klnktime2,[0,2,'lin',0,1].asSpec);
Spec.add(\klnktime3,[0,2,'lin',0,1].asSpec);
Spec.add(\klnktime4,[0,2,'lin',0,1].asSpec);
Spec.add(\klnktime5,[0,2,'lin',0,1].asSpec);
Spec.add(\klnktime6,[0,2,'lin',0,1].asSpec);
Spec.add(\delay1_time,[0.5,60,'lin',0,0.5].asSpec);
Spec.add(\delay2_time,[0.5,60,'lin',0,8].asSpec);
Spec.add(\delay3_time,[0.5,60,'lin',0,21].asSpec);
Spec.add(\delay4_time,[0.5,60,'lin',0,34].asSpec);
Spec.add(\delay1_decay,[-60,60,'lin',0,1].asSpec);
Spec.add(\delay2_decay,[-60,60,'lin',0,2].asSpec);
Spec.add(\delay3_decay,[-60,60,'lin',0,3].asSpec);
Spec.add(\delay4_decay,[-60,60,'lin',0,5].asSpec);
MIDIClient.init;
MIDIIn.connectAll;
MIDIdef.cc(\miid, {
arg val, num, chan, src;
if(
(num == 0) && (chan == 0),
{
Ndef(\cfi).set(\density1, val.linlin(0,127,0,2));
AppClock.sched(0,{~slider1.value_(val.linlin(0,127,0,1))})
}
);
if(
(num == 0) && (chan == 4),
{
Ndef(\cfi).set(\pingamp1, val.linlin(0,127,0,1));
AppClock.sched(0,{~slider2.value_(val.linlin(0,127,0,1))})
}
);
if(
(num == 1) && (chan == 0),
{
Ndef(\cfi).set(\density2, val.linlin(0,127,0,2))
}
);
if(
(num == 1) && (chan == 4),
{
Ndef(\cfi).set(\pingamp2, val.linlin(0,127,0,1))
}
);
if(
(num == 2) && (chan == 0),
{
Ndef(\cfi).set(\filter1_freq, val.linexp(0,127,20,4000))
}
);
if(
(num == 2) && (chan == 4),
{
Ndef(\cfi).set(\filter1_res, val.linlin(0,127,0,1))
}
);
if(
(num == 3) && (chan == 0),
{
Ndef(\cfi).set(\filter2_freq, val.linexp(0,127,20,4000))
}
);
if(
(num == 3) && (chan == 4),
{
Ndef(\cfi).set(\filter2_res, val.linlin(0,127,0,1))
}
);
if(
(num == 4) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq1, val.linexp(0,127,20,4000))
}
);
if(
(num == 5) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq2, val.linexp(0,127,20,4000))
}
);
if(
(num == 6) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq3, val.linexp(0,127,20,4000))
}
);
if(
(num == 7) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq4, val.linlin(0,127,20,4000))
}
);
if(
(num == 8) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq5, val.linexp(0,127,20,4000))
}
);
if(
(num == 9) && (chan == 0),
{
Ndef(\cfi).set(\klnkfreq6, val.linexp(0,127,20,4000))
}
);
if(
(num == 4) && (chan == 4),
{
Ndef(\cfi).set(\klnktime1, val.linlin(0,127,0,2))
}
);
if(
(num == 5) && (chan == 4),
{
Ndef(\cfi).set(\klnktime2, val.linlin(0,127,0,2))
}
);
if(
(num == 6) && (chan == 4),
{
Ndef(\cfi).set(\klnktime3, val.linlin(0,127,0,2))
}
);
if(
(num == 7) && (chan == 4),
{
Ndef(\cfi).set(\klnktime4, val.linlin(0,127,0,2))
}
);
if(
(num == 8) && (chan == 4),
{
Ndef(\cfi).set(\klnktime5, val.linlin(0,127,0,2))
}
);
if(
(num == 9) && (chan == 4),
{
Ndef(\cfi).set(\klnktime6, val.linlin(0,127,0,2))
}
);
if(
(num == 10) && (chan == 0),
{
Ndef(\cfi).set(\klnkamp1, val.linlin(0,127,0,0.1));
Ndef(\cfi).set(\klnkamp2, val.linlin(0,127,0,0.1));
Ndef(\cfi).set(\klnkamp3, val.linlin(0,127,0,0.1))
}
);
if(
(num == 11) && (chan == 0),
{
Ndef(\cfi).set(\klnkamp4, val.linlin(0,127,0,0.1));
Ndef(\cfi).set(\klnkamp5, val.linlin(0,127,0,0.1));
Ndef(\cfi).set(\klnkamp6, val.linlin(0,127,0,0.1))
}
);
if(
(num == 12) && (chan == 0),
{
Ndef(\cfi).set(\delay1_time, val.linlin(0,127,0.5,60))
}
);
if(
(num == 12) && (chan == 4),
{
Ndef(\cfi).set(\delay1_decay, val.linlin(0,127,-60,60))
}
);
if(
(num == 13) && (chan == 0),
{
Ndef(\cfi).set(\delay2_time, val.linlin(0,127,0.5,60))
}
);
if(
(num == 13) && (chan == 4),
{
Ndef(\cfi).set(\delay2_decay, val.linlin(0,127,-60,60))
}
);
if(
(num == 14) && (chan == 0),
{
Ndef(\cfi).set(\delay3_time, val.linlin(0,127,0.5,60))
}
);
if(
(num == 14) && (chan == 4),
{
Ndef(\cfi).set(\delay3_decay, val.linlin(0,127,-60,60))
}
);
if(
(num == 15) && (chan == 0),
{
Ndef(\cfi).set(\delay4_time, val.linlin(0,127,0.5,60))
}
);
if(
(num == 15) && (chan == 4),
{
Ndef(\cfi).set(\delay4_decay, val.linlin(0,127,-60,60))
}
);
}, chan: [0,4]);
~mft = MIDIOut(1);
~mft.control(0,0,0.1.linlin(0,2,0,127));
~mft.control(4,0,0.01.linlin(0,1,0,127));
~mft.control(0,1,0.1.linlin(0,2,0,127));
~mft.control(4,1,0.01.linlin(0,1,0,127));
~mft.control(0,2,1000.explin(20,4000,0,127));
~mft.control(4,2,0.75.linlin(0,1,0,127));
~mft.control(0,3,880.explin(20,4000,0,127));
~mft.control(4,3,0.8.linlin(0,1,0,127));
~mft.control(0,4,50.explin(20,4000,0,127));
~mft.control(4,4,1.linlin(0,2,0,127));
~mft.control(0,5,60.explin(20,4000,0,127));
~mft.control(4,5,1.linlin(0,2,0,127));
~mft.control(0,6,200.explin(20,4000,0,127));
~mft.control(4,6,1.linlin(0,2,0,127));
~mft.control(0,7,300.explin(20,4000,0,127));
~mft.control(4,7,1.linlin(0,2,0,127));
~mft.control(0,8,400.explin(20,4000,0,127));
~mft.control(4,8,1.linlin(0,2,0,127));
~mft.control(0,9,800.explin(20,4000,0,127));
~mft.control(4,9,1.linlin(0,2,0,127));
~mft.control(0,10,0.05.linlin(0,0.1,0,127));
~mft.control(0,11,0.03.linlin(0,0.1,0,127));
~mft.control(0,12,0.5.linlin(0.5,60,0,127));
~mft.control(4,12,1.linlin(-60,60,0,127));
~mft.control(0,13,8.linlin(0.5,60,0,127));
~mft.control(4,13,2.linlin(-60,60,0,127));
~mft.control(0,14,21.linlin(0.5,60,0,127));
~mft.control(4,14,3.linlin(-60,60,0,127));
~mft.control(0,15,34.linlin(0.5,60,0,127));
~mft.control(4,15,5.linlin(-60,60,0,127));
Window.closeAll;
w = Window("cybernetic feedback interaction",Window.availableBounds)
.background_(Color.black)
.fullScreen
.onClose_({f.kill});
k = Window("nested",Window.availableBounds,border:false)
.front
.background_(Color.clear)
.alwaysOnTop_(true);
~slider1 = Slider(k, Rect(0,5,w.view.bounds.width/30,w.view.bounds.height-5))
.knobColor_(Color.clear)
.background_(Color.clear)
.value_(0.1.linlin(0,2,0,1))
.action_({arg obj; Ndef(\cfi).set(\density1, obj.value.linlin(0,1,0,2)); ~mft.control(0,0,obj.value.linlin(0,1,0,127))});
~slider2 = Slider(k, Rect(w.view.bounds.width/30,5,w.view.bounds.width/30,w.view.bounds.height-5))
.knobColor_(Color.clear)
.background_(Color.clear)
.value_(0.01)
.action_({arg obj; Ndef(\cfi).set(\pingamp1, obj.value); ~mft.control(4,0,obj.value.linlin(0,1,0,127))});
f = FreqScopeView(w, Rect(0,w.view.bounds.height/2,w.view.bounds.width,w.view.bounds.height))
.active_(true)
.freqMode_(1)
.dbRange_(144)
})
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment