Skip to content

Commit

Permalink
Merge pull request #3 from schollz/delayc
Browse files Browse the repository at this point in the history
Delayc
  • Loading branch information
schollz authored Mar 31, 2021
2 parents fdd1e38 + 3e23130 commit 504f932
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 35 deletions.
16 changes: 8 additions & 8 deletions icarus.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-- icarus v1.1.0
-- icarus v1.2.0
--
-- I warn you, fly a middle
-- course: go too low & water
Expand Down Expand Up @@ -96,12 +96,12 @@ end

function enc(k,d)
if k==1 then
params:delta("delaytime",-d)
if params:get("delaytime")<25 then
params:delta("destruction",d)
params:set("pressdisablesfeedback",2)
params:delta("delaytime",d)
if params:get("delaytime")<0.25 then
params:delta("destruction",d)
-- params:set("pressdisablesfeedback",2)
else
params:set("pressdisablesfeedback",1)
-- params:set("pressdisablesfeedback",1)
end
elseif k==2 then
params:delta("lpf",-1*sign(d))
Expand Down Expand Up @@ -156,8 +156,8 @@ function redraw()
screen.clear()

-- make the sun curve in the sky based on delay time
local delay_range={23,27}
local rdelay=util.linlin(delay_range[1],delay_range[2],90,270,params:get("delaytime"))
local delay_range={0.05,0.5}
local rdelay=util.linlin(delay_range[1],delay_range[2],270,90,params:get("delaytime"))
local center={64,32}
local rpos={center[1]+40*math.sin(math.rad(rdelay)),center[2]+40*math.cos(math.rad(rdelay))}
local rfeedback=util.linlin(0.9,1.5,0,16,params:get("feedback"))
Expand Down
88 changes: 72 additions & 16 deletions lib/Engine_Icarus.sc
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ Engine_Icarus : CroneEngine {
(0..5).do({arg i;
SynthDef("icarussynth"++i,{
arg amp=0.5, hz=220, pan=0, envgate=0,
pulse=0,saw=0,
attack=0.015,decay=1,release=2,sustain=0.9,
lpf=20000,resonance=0,portamento=0.1,tremelo=0,destruction=0,
pwmcenter=0.5,pwmwidth=0.05,pwmfreq=10,detuning=0.1,
feedback=0.5,delaytime=0.25, sublevel=0;
feedback=0.5,delaytime=0.25, delaytimelag=0.1, sublevel=0;

// vars
var ender,snd,local,in,ampcheck;
Expand All @@ -36,36 +37,69 @@ Engine_Icarus : CroneEngine {
gate: envgate,
);

// dreamcrusher
// try using SawTooth for PWM
in = Splay.ar(VarSaw.ar(Lag.kr(hz+(
// dreamcrusher++
in = Splay.ar(
( // (pulse*
Pulse.ar(Lag.kr(hz+(
SinOsc.kr(LFNoise0.kr(1))*
(((hz).cpsmidi+1).midicps-(hz))*detuning
),portamento),
width:LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter)
));
width:
LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter),
mul:0.5
))
//+
// (saw*
// VarSaw.ar(Lag.kr(hz+(
// SinOsc.kr(LFNoise0.kr(1))*
// (((hz).cpsmidi+1).midicps-(hz))*detuning
// ),portamento),
// width:
// LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter),
// mul:0.5
// ))
);
// add suboscillator
in = in + (sublevel*Splay.ar(VarSaw.ar(Lag.kr(hz/2+(
in = in + (sublevel*Splay.ar(
( // (pulse*
Pulse.ar(Lag.kr(hz/2+(
SinOsc.kr(LFNoise0.kr(1))*
(((hz/2).cpsmidi+1).midicps-(hz/2))/10
(((hz/2).cpsmidi+1).midicps-(hz/2))*detuning
),portamento),
width:LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter)
)));
width:
LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter),
mul:0.5
))
// +
// (saw*
// VarSaw.ar(Lag.kr(hz/2+(
// SinOsc.kr(LFNoise0.kr(1))*
// (((hz/2).cpsmidi+1).midicps-(hz/2))*detuning
// ),portamento),
// width:
// LFTri.kr(pwmfreq+rrand(0.1,0.3),mul:pwmwidth/2,add:pwmcenter),
// mul:0.5
// ))
));

// random panning
in = Balance2.ar(in[0] ,in[1],SinOsc.kr(
LinLin.kr(LFNoise0.kr(0.1),-1,1,0.05,0.2)
)*0.1);

in = in * ender;
ampcheck = Amplitude.kr(Mix.ar(in));
in = in * (ampcheck > 0.02); // noise gate
local = LocalIn.ar(2);
local = OnePole.ar(local, 0.4);
local = OnePole.ar(local, -0.08);
local = Rotate2.ar(local[0], local[1],0.2);
local = DelayN.ar(local, 0.5,
Lag.kr(delaytime,0.05)+rrand(-0.05,0.05)
local = DelayC.ar(local, 0.5,
Lag.kr(delaytime,0.2)
);
local = LeakDC.ar(local);
local = ((local + in) * 1.25).softclip;

local = MoogLadder.ar(local,Lag.kr(lpf,1),res:Lag.kr(resonance,1));
// add destruction thing
local = ((local*((1-EnvGen.kr(
Expand All @@ -79,13 +113,11 @@ Engine_Icarus : CroneEngine {
// add tremelo
// local = local * ((tremelo>0)*SinOsc.kr(tremelo,0,0.4)+(tremelo<0.0001));



LocalOut.ar(local*Lag.kr(feedback,1));
snd = Balance2.ar(local[0] * 0.2,local[1]*0.2,SinOsc.kr(

snd= Balance2.ar(local[0]*0.2,local[1]*0.2,SinOsc.kr(
LinLin.kr(LFNoise0.kr(0.1),-1,1,0.05,0.2)
)*0.1);


// manual pan
snd = Mix.ar([
Expand Down Expand Up @@ -167,6 +199,12 @@ Engine_Icarus : CroneEngine {
});
});

this.addCommand("delaytimelag","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\delaytimelag,msg[1]);
});
});

this.addCommand("feedback","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\feedback,msg[1]);
Expand Down Expand Up @@ -202,6 +240,24 @@ Engine_Icarus : CroneEngine {
});
});

this.addCommand("detuning","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\detuning,msg[1]);
});
});

this.addCommand("pulse","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\pulse,msg[1]);
});
});

this.addCommand("saw","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\saw,msg[1]);
});
});

this.addCommand("sub","f", { arg msg;
(0..5).do({arg i;
icarusPlayer[i].set(\sublevel,msg[1]);
Expand Down
57 changes: 46 additions & 11 deletions lib/icarus.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,38 @@ function Icarus:new(args)

local debounce_delaytime=0

params:add_group("ICARUS",18)
params:add_group("ICARUS",19)
local filter_freq=controlspec.new(40,18000,'exp',0,18000,'Hz')
params:add_option("polyphony","polyphony",{"monophonic","polyphonic"},2)
params:add {
type='control',
id="amp",
name="amp",
controlspec=controlspec.new(0,10,'lin',0,1.0,'amp')}
controlspec=controlspec.new(0,2,'lin',0,1.0,'amp',0.01/2)}
params:set_action("amp",function(v)
engine.amp(v)
end)
-- params:add {
-- type='control',
-- id="pulse",
-- name="pulse",
-- controlspec=controlspec.new(0,2,'lin',0,1.0,'amp',0.01/2)}
-- params:set_action("pulse",function(v)
-- engine.pulse(v)
-- end)
-- params:add {
-- type='control',
-- id="saw",
-- name="saw",
-- controlspec=controlspec.new(0,2,'lin',0,0.0,'amp',0.01/2)}
-- params:set_action("saw",function(v)
-- engine.saw(v)
-- end)
params:add {
type='control',
id="sub",
name="sub",
controlspec=controlspec.new(0,10,'lin',0,0.5,'amp')}
controlspec=controlspec.new(0,2,'lin',0,0.5,'amp',0.01/2)}
params:set_action("sub",function(v)
engine.sub(v)
end)
Expand All @@ -56,31 +72,31 @@ function Icarus:new(args)
type='control',
id="attack",
name="attack",
controlspec=controlspec.new(0,10,'lin',0,0.5,'s')}
controlspec=controlspec.new(0,10,'lin',0,0.5,'s',0.1/10)}
params:set_action("attack",function(v)
engine.attack(v)
end)
params:add {
type='control',
id="decay",
name="decay",
controlspec=controlspec.new(0,10,'lin',0,1,'s')}
controlspec=controlspec.new(0,10,'lin',0,1,'s',0.1/10)}
params:set_action("decay",function(v)
engine.decay(v)
end)
params:add {
type='control',
id="sustain",
name="sustain",
controlspec=controlspec.new(0,2,'lin',0,0.9,'amp')}
controlspec=controlspec.new(0,2,'lin',0,0.9,'amp',0.01/2)}
params:set_action("sustain",function(v)
engine.sustain(v)
end)
params:add {
type='control',
id="release",
name="release",
controlspec=controlspec.new(0,10,'lin',0,5,'s')}
controlspec=controlspec.new(0,10,'lin',0,5,'s',0.1/10)}
params:set_action("release",function(v)
engine.release(v)
end)
Expand All @@ -98,8 +114,7 @@ function Icarus:new(args)
type='control',
id='resonance',
name='resonance',
controlspec=controlspec.new(0,0.95,'lin',0,0,'',0.01/0.95)
}
controlspec=controlspec.new(0,0.95,'lin',0,0,'',0.01/0.95)}
params:set_action("resonance",function(v)
engine.resonance(v)
end)
Expand All @@ -112,13 +127,25 @@ function Icarus:new(args)
engine.feedback(v)
end)
params:add_option("pressdisablesfeedback","press disables feedback",{"no","yes"},1)
local time_set_delaytime=clock.get_beat_sec()*clock.get_beats()
params:add {
type='control',
id="delaytime",
name="delay time",
controlspec=controlspec.new(15,30,'lin',0,25,'x100 s',0.01/15)}
controlspec=controlspec.new(0.05,0.5,'lin',0,0.25,'s')}
params:set_action("delaytime",function(v)
engine.delaytime(v/100)
-- local current_time=clock.get_beat_sec()*clock.get_beats()
-- local last_time_diff=current_time-time_set_delaytime
-- print(last_time_diff)
-- if last_time_diff > 0.5 then
-- last_time_diff = 0.5
-- elseif last_time_diff < 0.0005 then
-- last_time_diff=0.0005
-- end
-- print(last_time_diff)
-- engine.delaytimelag(last_time_diff)
-- time_set_delaytime=current_time
engine.delaytime(v)
-- debounce_delaytime=v
end)
params:add {
Expand All @@ -129,6 +156,14 @@ function Icarus:new(args)
params:set_action("portamento",function(v)
engine.portamento(v)
end)
params:add {
type='control',
id="detuning",
name="detuning",
controlspec=controlspec.new(0,100,'lin',0,10,'cents',0.1/100)}
params:set_action("detuning",function(v)
engine.detuning(v/100)
end)
-- params:add {
-- type='control',
-- id="tremelo",
Expand Down

0 comments on commit 504f932

Please sign in to comment.