Skip to content

Instantly share code, notes, and snippets.

// polyform lite - nb editon v.0.1 @sonoCircuit
// supercollider class based on the skilled labour study written by ezra buchla & dani derks for monome.org
NB_PolyForm {
// classvar <voiceKeys,
classvar <synthParams, <synthGroup, <synthVoices;
// do these all need to be classvars?
// [eb] it strikes me as a little weird to make everything classvars, which are global
// (so these Groups are always present in the background, forever)
//This is a manual to assemble an analog synth,
//called Tocante, and a musical simulator of its
//Capacitors that tune it! Thus the relationship
//of comment to code is like soldering to music.
//general procedure is to insert components in order,
//solder one leg of each from top, then flip the board.
//this way you can nip the leads flush to the fancy board,
//and finish solder nice flat rounded domes there.
@catfact
catfact / bmt-freeze.scd
Created April 26, 2025 17:53
bmt freezer
~out = 4;
~nfftpoints = 8192;
~nfftbands = (~nfftpoints / 2) + 1;
s = Server.default;
s.waitForBoot {
SynthDef.new(\freeze_smear_magbands_stereo, {
var input = In.ar(\in.kr, 2);
var chain = FFT(LocalBuf(~nfftpoints.dup, 1), input);
FxBusDemo2 {
var <synths;
var <busses;
var <g;
*new { arg server;
^super.new.init(server);
}
@catfact
catfact / Engine_TestNoise.sc
Last active February 1, 2025 20:43
norns engine switching test
// CroneEngine_TestNoise
// variante of TestSine, for switching
// Inherit methods from CroneEngine
Engine_TestNoise : CroneEngine {
var <synth;
*new { arg context, doneCallback;
^super.new(context, doneCallback);
}
@catfact
catfact / cut_sync.lua
Last active January 30, 2025 19:00
minimal stereo looper to test softcut voice drift
--- test softcut voice sync
--- extremely basic stereo looper
---
--- K2: toggle recording
--- K3: reset to loop start
local s = softcut
local BUFFER_OFFSET = 0.1
@catfact
catfact / Engine_SimplePassThru.sc
Last active January 3, 2025 22:15
norns passthru example
Engine_SimplePassThru : CroneEngine {
var amp=0;
var <synth;
// this is your constructor. the 'context' arg is a CroneAudioContext.
// it provides input and output busses and groups.
// see its implementation for details.
*new { arg context, doneCallback;
^super.new(context, doneCallback);

//---------------------------------------------------- //--- state variables and parameters

n = 8; // number of "beats" (really 1/8 notes i guesss) d = 6; // ticks per beat. should be LCM of all desired possible divisions

//-- main sequence data, an array of beats q = Array.fill(n, {( activeDown: false, // active on "downbeat"? activeOff: false, // active on "offbeat"?

~nfftpoints = 2048;
~nfftbands = (~nfftpoints / 2) + 1;
s = Server.default;
s.waitForBoot {
SynthDef.new(\freeze_smear_magbands_stereo, {
var input = In.ar(\in.kr, 2);
var chain = FFT(LocalBuf(~nfftpoints.dup, 1), input);
var frozen = PV_MagFreeze(chain, \freeze.kr(0));
local cc_desc = {}
describe_midi_cc = function(num) return cc_desc[num] end
cc_desc[. 0] = "Bank Select (MSB)"
cc_desc[ 1] = "Modulation Wheel"
cc_desc[ 2] = "Breath controller"
cc_desc[ 3] = "Undefined"
cc_desc[ 4] = "Foot Pedal (MSB)"
cc_desc[ 5] = "Portamento Time (MSB)"