Hi @thetechnobear !
Thanks again, for all your help
So nice !
I finally succeeded in doing a first Supercollider patch for the Organelle.
It’s a simple metal percussion rhythm generator based on a physical model, that I took from SC examples.
Simple but it already sounds quite good. Still, there is some mysteries about some Organelle functions I’d like to solve before sharing it in Patchstorage website.
As I’m a new forum user, I can’t upload a zip file, so I send you the code directly, at the end of this message.
There is 3 things I’d like to do with it:
- make the output vumeters work. (I took the code from the mother patch that I thought could do the job, but I don’t know how to do, as there is no documentation about it)
- use the AUX button as a sustain control. (same pb as above)
- in a later version I would like to synchronise to a midi clock, to generate rhythms accordingly. (any explanations in how the midi is handled by this version of Organelle/Supercollider would be really great)
If I can do that, I’ll start soon to share some patches, cause there is a lot of interesting things out there, just waiting to be shrunk into this cute little box
!
Here is my code (sorry it’s many not very convenient, and tell me if there a way to send directly the zip file):
//////
// initialise
~voices = Dictionary.new;
~bandwith=8000.0;
~partials=8;
~impulse=0.01;
~ringtime=2.0;
~oled.screen(1,format(“Bandwith % Hz”,~bandwith.asInteger));
~oled.screen(2,format(“Partials %”,~partials.asInteger));
~oled.screen(3,format(“Impulse %”,~impulse.asStringPrec(3)));
~oled.screen(4,format(“RingTime % sec”,~ringtime.asStringPrec(3)));
~oled.screen(5,“Sustain OFF”);
// output for vumeter and volume control
~mainVolume = 0.8;
~mainOut = nil;
~outL = Bus.audio(s,1);
~outR = Bus.audio(s,1);
~mainOutDef = SynthDef(\mainOutput,
{
arg amp = 0.8;
var insig,sig, peaksig;
insig = SoundIn.ar([0,1]);
sig = In.ar(~outL,2);
sig = sig * amp;
Out.ar(0,sig);
peaksig=[insig[0],insig[1],sig[0],sig[1]];
SendPeakRMS.kr(peaksig, 5, 3, “/audioLevel”);
}
);
// create knob callback
~knobfunc = {
arg func, msg, knob, value;
if(knob==0, {
~bandwith = value.linexp(0,1,20,8000);
~oled.screen(1,format(“Bandwith % Hz”,~bandwith.asInteger));
});
if(knob==1, {
~partials = value.linlin(0,1,2,16).asInteger;
~oled.screen(2,format("Partials %",~partials));
});
if(knob==2, {
~impulse = value.linexp(0,1,0.003,3.0);
~oled.screen(3,format("Impulse %",~impulse.asStringPrec(3)));
});
if(knob==3, {
~ringtime = value.linexp(0,1,0.1,10.0);
~oled.screen(4,format("RingTime % s",~ringtime.asStringPrec(3)));
});
};
// register knob callback
~knobs.addDependant(~knobfunc);
// aux callback
~aux[\key_hit] = {
arg self,key,vel;
self.changed(\aux,vel>0);
if(~aux>0,
{~oled.screen(5,“Sustain ON”);
~led.value(7);
},
{~oled.screen(5,“Sustain OFF”);
~led.value(0);
});
};
// create notes callback
~notesfunc = {
arg func, msg, note, vel;
if(vel>0 , {
if(~voices[note]!=nil,{~voices[note].set(\gate,0);});
~voices[note] = Synth.new(“KlankSynth_”++~partials.asSymbol,[
\freq, (note).linexp(60,83,20,8000),
\bandwith, ~bandwith,
\impulse, ~impulse,
\ringtime, ~ringtime,
\pan, 1.0.rand2,
\rhythm, #[0.125,0.25,0.375,0.5,0.75,1,1.5,2].choose
// \amp, (vel / 3.0) .clip(0,0.3)
]
);
~led.value(1);
} , {
if(~voices[note]!=nil,{~voices[note].set(\gate,0);});
~voices[note] = nil;
~led.value(0);
}; )
};
// register key callback
~notes.addDependant(~notesfunc);
//other callbacks
//~encoder_turn
//~encoder_button
//~footswitch
// metallic synths
SynthDef(\KlankSynth_2, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=2;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_3, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=3;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_4, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=4;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_5, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=5;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_6, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=6;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_7, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=7;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_8, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=8;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_9, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=9;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_10, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=10;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_11, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=11;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_12, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=12;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_13, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=13;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_14, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=14;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_15, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=15;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
SynthDef(\KlankSynth_16, {
arg freq=20, bandwith=8000.0, impulse=0.5, ringtime=2.0, gate=1, pan=0.0, rhythm=1;
var trig, p, exc, x, sig, env, partials=16;
exc = BrownNoise.ar(Decay2.kr(Impulse.kr(rhythm,0,0.04), 0.1, impulse));
env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
sig = (Klank.ar(`[Array.fill(partials, {linrand(bandwith)+freq}),nil,Array.fill(partials, {rrand(0.1,ringtime)})], exc) * 0.35).softclip;
sig = sig * env;
sig = Pan2.ar(sig,pan);
Out.ar(~outL,sig);
}
).add;
OSCdef( \OrganelleAudioLevel,
{
arg msg, time, addr, recvPort;
var peakInL,peakInR,peakOutL,peakOutR;
peakInL = (msg[3] * 11).asInteger;
peakInR = (msg[5] * 11).asInteger;
peakOutL = (msg[7] * 11).asInteger;
peakOutR = (msg[9] * 11).asInteger;
~motherHost.sendMsg("/oled/vumeter", peakInL,peakInR,peakOutL,peakOutR);
},
"/audioLevel"
);