// June Solstice at www.electro-musi.com // by Les Hall // started Tue Jun 21 2016, 1:02 PM // // macroscopic definitons 12 => int n; // number of bits 1024 => int topFreq; // maximum frequency 2 => int k; // number of feedback loops 3 => int w; // number of delay lines in each loop 800 => int width; // width of controls window 700 => int height; // height of controls window // the patch Gain sum[k]; Dyno l[k]; LPF f[k]; PitShift ps[k]; DelayA d[k][w]; adc => sum[0]; SinOsc osc => sum[0]; for (0 => int i; i < k; ++i) { adc => sum[i] => l[i] => f[i] => ps[i] => d[i][0]; for (1 => int j; j d[i][j]; } d[i][w-1] => sum[i]; if (i > 0) d[i-1] => sum[i]; l[i].limit; 1.0 => ps[i].mix; } d[0][w-1] => dac.left; d[k-1][w-1] => dac.right; adc => dac.left => dac.right; // adc to output // MAUI elements follow MAUI_View controls; controls.size(width, height); // oscillator freq MAUI_Slider freq; freq.range(0, topFreq); freq.value(topFreq/2); freq.name("osc freq"); freq.position(0, 0); freq.size(width/k, 100); controls.addElement(freq); // tempo MAUI_Slider tempo; tempo.range(60, 60*10); tempo.value(60*4); tempo.name("tempo (BPM)"); tempo.position(width/k, 0); tempo.size(width/k, 100); controls.addElement(tempo); // vocals gain MAUI_Slider vocals; vocals.range(0, 200); vocals.value(150); vocals.name("Vocals Gain"); vocals.position(0, 600); vocals.size(width/k, 100); controls.addElement(vocals); // output gain MAUI_Slider output; output.range(0, 200); output.value(17); output.name("Output Gain"); output.position(width/k, 600); output.size(width/k, 100); controls.addElement(output); // loop thru the feedback sections MAUI_Slider g[k]; MAUI_Slider lpf[k]; MAUI_Slider pitch[k]; MAUI_Slider delay[k]; for (0 => int i; i < k; ++i) { // sum gain g[i].range(-100, 100); g[i].value(-85); g[i].name("gain"); g[i].position(i*width/k, 100); g[i].size(width/k, 100); controls.addElement(g[i]); // filter frequency lpf[i].range(0, topFreq); lpf[i].value((k-i)*topFreq/k); lpf[i].name("lpf freq"); lpf[i].position(i*width/k, 200); lpf[i].size(width/k, 100); controls.addElement(lpf[i]); // pitch shifter pitch[i].range(0, 2); pitch[i].value(1); pitch[i].name("Pitch Shift"); pitch[i].position(i*width/k, 300); pitch[i].size(width/k, 100); controls.addElement(pitch[i]); // delay element delay delay[i].range(0, 64); delay[i].value((i+1)*64/k); delay[i].name("delay (ms)"); delay[i].position(i*width/k, 400); delay[i].size(width/k, 100); controls.addElement(delay[i]); } // logic mask buttons MAUI_Button logic[n]; for (0 => int i; i < n; ++i) { logic[i].toggleType(); logic[i].size(width/n, width/n); logic[i].position(i*width/n, 500); controls.addElement(logic[i]); } // display the controls controls.display(); // the main loop 0 => int c; while (true) { 0 => int s; for (0 => int i; i < n; ++i) { ((logic[n-1-i].state()) & ((c >> i) & 1) ) +=> s; } topFreq * s / n => freq.value; freq.value() => osc.freq; vocals.value() / 100.0 => adc.gain; output.value() / 100.0 => dac.gain; for (0 => int i; i < k; ++i) { g[i].value() => sum[i].gain; lpf[i].value() => f[i].freq; pitch[i].value() => ps[i].shift; for (0 => int j; j < w; ++j) delay[i].value()::ms => d[i][j].delay; } (c + 1) % topFreq => c; (60.0/tempo.value())::second => now; }