init commit

master
Nova deViator 2015-09-09 14:03:24 +02:00
commit 81fb74dc00
12 changed files with 3103 additions and 0 deletions

237
pde/IF3Si/IF3Si.pde Normal file
View File

@ -0,0 +1,237 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Interface Fractures III - SILICON
(c) nova@deviator.si
IF3Si.pde
*/
// undecorate window (remove window borders etc) - - - - - - - - - - - - - - -
public void init() { frame.removeNotify(); frame.setUndecorated(true);
frame.addNotify(); super.init(); }
// load libs
import oscP5.*; // Open Sound Control
import netP5.*;
// declarations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// declare OSC object
OscP5 oscP5;
// IMAGE POOL, a 2D array
PImage[][] imgPool;
// texture (tiles)
float texX = 0;
float texY = 0;
// generate an array of random numbers
int[] rands = new int[500];
IntList randz; // arrayList
// for draw cube
int cubesnum = 20;
PGraphics[] cubes = new PGraphics[cubesnum];
PShader blur;
PGraphics bpass1, bpass2;
// spheres
int ptsW, ptsH;
int numPointsW;
int numPointsH_2pi;
int numPointsH;
float[] coorX;
float[] coorY;
float[] coorZ;
float[] multXZ;
PGraphics sphere;
void setup() { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
float sizefactor = 1; // define the size of the screen, 1 = 1080p
size( int( 1920 * sizefactor ),
int( 1080 * sizefactor ),
P3D ); // renderer
// framerate
frameRate(60);
smooth(32); // 32??
noCursor();
background(10);
println("\n\n~~~ Hello. Starting Interface Fractures III - SILICON." +
" - - - - - - - - - - - - - - - - - - - - - -\n");
// start oscP5, listening for incoming messages at port 12000
println("~~~ starting oscP5 ...");
oscP5 = new OscP5(this,12000);
oscP5.plug(this,"ctlin","/ctlin"); // to be converted for PD OSC input
// get all textures into an image pool
println("\n\n~~~ loading textures into image pool ...\n");
imgPool = getImages("/images/");
// create an array of random value between -50 and 50
for (int i=0; i < 500; i++) { rands[i] = i-250; }
shuffle(rands);
// drawCube ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `
// an array of PGraphics
for (int i = 0; i < cubesnum; i++) {
cubes[i] = createGraphics(width, height, P3D);
}
blur = loadShader("blur.glsl");
bpass1 = createGraphics(width, height, P3D);
bpass1.smooth();
bpass2 = createGraphics(width, height, P3D);
bpass2.smooth();
randz = new IntList(width);
for (int i=0; i < width; i++) {
randz.set(i, i);
}
randz.shuffle();
//println(randz);
// spheres
ptsW=30;
ptsH=30;
initializeSphere(ptsW, ptsH); // number of vertices around the width and height
sphere = createGraphics(width, height, P3D);
}
void draw() { // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// clean screen ````````````````````````````````````````````````````|
/*
blendMode(BLEND);
screenClean(color(50));
// SPHERES -----------------------------------------------------------
//offscreen render spheres
sphere.beginDraw();
sphere.blendMode(BLEND);
sphere.rect(0, 0, width, height);
sphere.blendMode(DARKEST);
sphere.noStroke();
sphere.pushMatrix();
sphere.translate(width/2+(width/8), height/2, 580);
sphere.rotateX(radians(float(frameCount) * 0.1));
sphere.rotateY(radians(float(frameCount) * 0.23));
sphere.rotateZ(radians(float(frameCount) * 0.2));
textureSphere(sphere, 400, 400, 400, imgPool[3][1]);
sphere.popMatrix();
sphere.pushMatrix();
sphere.translate(width/2+(width/8), height/2, 580);
sphere.rotateX(radians(float(frameCount) * 0.2));
sphere.rotateY(radians(float(frameCount) * 0.13));
sphere.rotateZ(radians(float(frameCount) * 0.01));
textureSphere(sphere, 390, 390, 390, imgPool[3][1]);
sphere.popMatrix();
sphere.endDraw();
// tint(0);
// image(sphere, 0, 0);
textureWrap(REPEAT);
//textureMode(NORMAL);
pushMatrix();
//tint(255);
translate(width/2, height/2); // center coordinate system
translate(((frameCount*1) % width) - width/2,0);
//stroke(0,50);
//strokeWeight(1);
noStroke();
float quadW = 500;
float quadH = height;
float v1x = 0; // sin(radians(frameCount))*250+400;
pushMatrix() ;
//rotate(PI/PI);
beginShape(QUADS);
texture(sphere);
vertex(-quadW/2, -quadH/2, 0, 0);
vertex( quadW/2, -quadH/2, quadW, 0);
vertex( quadW/2, quadH/2, quadW, quadH);
vertex(-quadW/2, quadH/2, 0, quadH);
endShape();
popMatrix();
popMatrix();
*/
// --------------------------------------------------------------------------
// SCENENGINES
// draw tiles `````````````````````````````````````````````````````|
tiles(boolean(1), // render on/off
color(0, 0, 0, 80), // background color (HSBA)
color(80, 70, 20, 100), // tile color
20, // tile hue distance
0, // blendMode
6, // number of tiles on X axis
1, // number of tiles on Y axis
2, // texture bank number
0, // texture number/id
10, // texture speed X
1, // texture speed Y
64 // overlap. 127 = 300%
);
// draw cubes `````````````````````````````````````````````````````|
drawCube(boolean(0), cubes,
100, height/2, -100,
400, 300, 300,
radians(frameCount), radians(frameCount*0.7), PI/2,
0);
// test pattern```````````````````````````````````````````````````|
testPattern(boolean(0), // on/off
2, 0, // img bank & ID
255, // image alpha
10, // number of horizontal 'lanes'
10, // density
4, // stroke width
255, // stroke alpha
2 // speed
);
// debug `````````````````````````````````````````````````````````|
// draw test picture
testPicture(boolean(0));
// frames per second
displayFps(true);
// document
autoSnap(false);
} // --------------------------------------------------------------------------

59
pde/IF3Si/blur.glsl Normal file
View File

@ -0,0 +1,59 @@
// Adapted from:
// http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
#define PROCESSING_TEXTURE_SHADER
uniform sampler2D texture;
// The inverse of the texture dimensions along X and Y
uniform vec2 texOffset;
varying vec4 vertColor;
varying vec4 vertTexCoord;
uniform int blurSize;
uniform int horizontalPass; // 0 or 1 to indicate vertical or horizontal pass
uniform float sigma; // The sigma value for the gaussian function: higher value means more blur
// A good value for 9x9 is around 3 to 5
// A good value for 7x7 is around 2.5 to 4
// A good value for 5x5 is around 2 to 3.5
// ... play around with this based on what you need :)
const float pi = 3.14159265;
void main() {
float numBlurPixelsPerSide = float(blurSize / 2);
vec2 blurMultiplyVec = 0 < horizontalPass ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
// Incremental Gaussian Coefficent Calculation (See GPU Gems 3 pp. 877 - 889)
vec3 incrementalGaussian;
incrementalGaussian.x = 1.0 / (sqrt(2.0 * pi) * sigma);
incrementalGaussian.y = exp(-0.5 / (sigma * sigma));
incrementalGaussian.z = incrementalGaussian.y * incrementalGaussian.y;
vec4 avgValue = vec4(0.0, 0.0, 0.0, 0.0);
float coefficientSum = 0.0;
// Take the central sample first...
avgValue += texture2D(texture, vertTexCoord.st) * incrementalGaussian.x;
coefficientSum += incrementalGaussian.x;
incrementalGaussian.xy *= incrementalGaussian.yz;
// Go through the remaining 8 vertical samples (4 on each side of the center)
for (float i = 1.0; i <= numBlurPixelsPerSide; i++) {
avgValue += texture2D(texture, vertTexCoord.st - i * texOffset *
blurMultiplyVec) * incrementalGaussian.x;
avgValue += texture2D(texture, vertTexCoord.st + i * texOffset *
blurMultiplyVec) * incrementalGaussian.x;
coefficientSum += 2.0 * incrementalGaussian.x;
incrementalGaussian.xy *= incrementalGaussian.yz;
}
gl_FragColor = avgValue / coefficientSum;
}

456
pde/IF3Si/functions.pde Normal file
View File

@ -0,0 +1,456 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Interface Fractures III - SILICON
(c) nova@deviator.si
functions.pde
*/
// loads all images into an array - - - - - - - - - - - - - - - - - - - - - - - - -
PImage[][] getImages(String folder) {
PImage[][] imgPool; // declare 2D array imgPool
File dir = new File(dataPath(sketchPath + folder)); // first folder
String[] dirlist = dir.list(); // an array of folders (strings)
dirlist = sort(dirlist); //
imgPool = new PImage[dirlist.length][10]; // create 2d array imgPool
for (int i = 0; i < dirlist.length; i++) {
String fulldir = dataPath(sketchPath + folder + dirlist[i]) + "/";
File dir2 = new File(fulldir);
String[] filelist = dir2.list(); // an array of image names
filelist = sort(filelist);
if (filelist.length != 0) {
for (int j = 0; j < filelist.length; j++) {
println("imgPool[" + i + "][" + j + "]: " + fulldir + filelist[j]);
imgPool[i][j] = loadImage(fulldir + filelist[j]);
}
} else {
println("No files in this folder: " + fulldir);
}
}
return imgPool;
}
// function to shuffle an array of integers - - - - - - - - - - - - - - - - - - - - -
void shuffle(int[] a)
{
int temp, pick;
for(int i=0; i<a.length; i++)
{
temp = a[i];
pick = (int)random(a.length);
a[i] = a[pick];
a[pick] = temp;
}
}
void switchBlendMode(int blendMode) // - - - - - - - - - - - - - - - - - - - - - - -
{
switch(blendMode) {
case 0:
blendMode(ADD); // additive blending with white clip: C = min(A*factor + B, 255)
break;
case 1:
blendMode(SUBTRACT); // subtractive blend w/ black clip: C = max(B - A*factor, 0)
break;
case 2:
blendMode(LIGHTEST); // only the lightest colour succeeds: C = max(A*factor, B)
break;
case 3:
blendMode(DARKEST); // only the darkest colour succeeds: C = min(A*factor, B)
break;
case 4:
blendMode(SCREEN); // opposite multiply, uses inverse values of the colors.
break;
case 5:
blendMode(MULTIPLY); // multiply the colors, result will always be darker.
break;
case 6:
blendMode(EXCLUSION); // similar to DIFFERENCE, but less extreme.
break;
case 7:
blendMode(REPLACE); // pixels entirely replace others + don't utilize alpha values
break;
default:
blendMode(BLEND); // linear interp. of colours: C = A*factor + B. Default.
break;
} // DIFFERENCE: subtract colors from underlying image. NOT SUPPORTED BY P3D!! */
}
// TILES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/* TODO:
- different zooms (random?)
- better rotation
- multiple instances of the same thing - with
different texture & some parameters + parameterize
- zoom variations
- ?amount of speed variations accross tiles
*/
void tiles( boolean render, // should we render or not?
color bgfill, // backgorund color
color tilecolor, // tile color
int huedist, // tile color distance for interpolation
int blendMode, // blending mode of tiles
int numx, // number of tiles on X
int numy, // number of tiles on Y
int texBank,
int texNum,
float texSpeedX,
float texSpeedY,
float overlap )
{
if (render) {
colorMode(HSB, 360, 100, 100, 100);
blendMode(BLEND);
fill(bgfill);
noStroke();
rect(0, 0, width, height);
switchBlendMode(blendMode); // blendMode function using integers
texSpeedX *= 0.01;
texSpeedY *= 0.01;
texX += sq(texSpeedX);
texY += sq(texSpeedY);
float numxfact = 1 / float(numx);
float numyfact = 1 / float(numy);
float aspectRatio = (height / float(numy)) / (width / float(numx));
float offsetPerc = overlap * (300/127);
float uniZoom = numxfact * (float(width)/1024);
float offsetX = width * numxfact * offsetPerc * 0.01;
float offsetY = height * numyfact * offsetPerc * 0.01;
float texoffsetX = 1 + 0.01 * offsetPerc ;
float texoffsetY = texoffsetX;
float huefactor = float(huedist) / (numx * numy);
for (int nx=0; nx < numx; nx++) {
for (int ny=0; ny < numy; ny++) {
int tileID = nx * numy + ny;
float randX = rands[ (tileID % rands.length) ] * 0.01;
float randY = rands[ ((tileID + 50) % rands.length) ] * 0.01;
float newhue = hue(tilecolor) + huefactor * tileID;
tint(newhue, saturation(tilecolor), brightness(tilecolor), alpha(tilecolor));
textureWrap(REPEAT);
textureMode(NORMAL);
beginShape();
texture(imgPool[texBank][texNum]);
vertex(width * numxfact * nx - offsetX, height * numyfact * ny - offsetY, 0 + texX * randX, 0 + texY * randY);
vertex(width * numxfact * (nx + 1) + offsetX, height * numyfact * ny - offsetY, 1 * uniZoom * texoffsetX + texX * randX, 0 + texY * randY);
vertex(width * numxfact * (nx + 1) + offsetX, height * numyfact * (ny + 1) + offsetY, 1 * uniZoom * texoffsetX + texX * randX, aspectRatio * uniZoom * texoffsetY + texY * randY);
vertex(width * numxfact * nx - offsetX, height * numyfact * (ny + 1) + offsetY, 0 + texX * randX, aspectRatio * uniZoom * texoffsetY + texY * randY);
endShape();
}
}
}
}
// TEST PICTURE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void testPicture(boolean render) {
if (render) {
fill(127);
stroke(255);
strokeWeight(1);
rect(1, 1, width-2, height-2);
ellipse(width/2, height/2, height-4, height-4);
ellipse(height/4, height/4, height/2-4, height/2-4);
ellipse(height/4, 3*height/4, height/2-4, height/2-4);
ellipse(width-height/4, height/4, height/2-4, height/2-4);
ellipse(width-height/4, 3*height/4, height/2-4, height/2-4);
line(width/2, 0, width/2, height);
line(0, height/2, width, height/2);
fill(0);
textSize(50);
textAlign(CENTER,CENTER);
text("Interface Fractures III", width/2, height/2,4);
/* more tests:
- horizontal and vertical block, moving fast!
- flicker test, black&white, 60Hz
- color and gray stripes of interpolation
*/
}
}
// DRAW CUBE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void drawCube( boolean render, PGraphics cubes[],
int posX, int posY, int posZ,
int dimW, int dimH, int dimL,
float rotX, float rotY, float rotZ,
int blurAmount
//float xd, float yd
)
{
if (render) {
blendMode(BLEND);
fill(0);
rect(0, 0, width, height);
//blendMode(LIGHTEST);
for (int i=0; i < cubes.length; i++) {
posX += 100;
cubes[i].beginDraw();
cubes[i].clear();
cubes[i].smooth();
cubes[i].lights();
cubes[i].stroke(255);
cubes[i].strokeWeight(10);
cubes[i].fill(127);
//cubes[i].noFill();
cubes[i].translate(posX, posY, posZ);
cubes[i].rotateX(rotX);
cubes[i].rotateY(rotY);
cubes[i].rotateZ(rotZ);
cubes[i].box(dimW, dimH, dimL);
cubes[i].endDraw();
if (blurAmount != 0) { // this blur chokes graphic processor
blur.set("blurSize", blurAmount);
blur.set("sigma", 9.0f);
blur.set("horizontalPass", 0);
bpass1.beginDraw();
bpass1.clear();
//bpass1.noLights();
bpass1.shader(blur);
bpass1.image(cubes[i], 0, 0);
bpass1.endDraw();
blur.set("horizontalPass", 1);
cubes[i].beginDraw();
cubes[i].clear();
//cubes[i].noLights();
cubes[i].shader(blur);
cubes[i].image(bpass1, 0, 0);
cubes[i].endDraw();
}
image(cubes[i], 0, 0);
}
}
}
// TEST PATTERN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/* TO BE ADDED:
- use quads
- add textures
>- more TO BE EXPANDED / REFINED!!! */
void testPattern( boolean render,
int imgBank, int imgID,
int imgAlpha,
int ylines,
int density,
int lwidth,
int lalpha,
int speed
)
{
if (render) {
tint(imgAlpha);
image(imgPool[imgBank][imgID], 0, 0);
blendMode(BLEND);
int yheight = height/ylines;
for (int y=0; y < ylines; y++) {
int yloc = int((y+1)*height/(ylines+1));
for (int x=0; x < width; x++) {
int index = x + (y * (width/ylines));
index = index % width;
if (randz.get(index) < density * 0.01 * randz.get((index + x + y) % randz.size())) {
int fx = (x + frameCount); // move!
fx = fx * speed * 1 * randz.get((abs(index - x + y) % randz.size())) / randz.size(); // speed!
fx %= width; // wrap at the right edge
color imgC = imgPool[imgBank][imgID].get(fx, yloc);
stroke(imgC, lalpha);
strokeWeight(1 + map(brightness(imgC), 0, 255, 0, lwidth));
line(fx, yheight * y + (yheight/30), fx, yheight * (y+1) - (yheight/30));
}
}
}
}
}
// SPHERES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// A 3D textured sphere with simple rotation control.
// thanks to https://processing.org/examples/texturesphere.html
// Texture Sphere written by Gillian Ramsay to better display the poles.
// Previous version by Mike 'Flux' Chang (and cleaned up by Aaron Koblin).
// Original based on code by Toxi.
// modified to accomodate offscreen PGraphics
void initializeSphere(int numPtsW, int numPtsH_2pi) {
// The number of points around the width and height
numPointsW=numPtsW+1;
numPointsH_2pi=numPtsH_2pi; // How many actual pts around the sphere (not just from top to bottom)
numPointsH=ceil((float)numPointsH_2pi/2)+1; // How many pts from top to bottom (abs(....) b/c of the possibility of an odd numPointsH_2pi)
coorX=new float[numPointsW]; // All the x-coor in a horizontal circle radius 1
coorY=new float[numPointsH]; // All the y-coor in a vertical circle radius 1
coorZ=new float[numPointsW]; // All the z-coor in a horizontal circle radius 1
multXZ=new float[numPointsH]; // The radius of each horizontal circle (that you will multiply with coorX and coorZ)
for (int i=0; i<numPointsW ;i++) { // For all the points around the width
float thetaW=i*2*PI/(numPointsW-1);
coorX[i]=sin(thetaW);
coorZ[i]=cos(thetaW);
}
for (int i=0; i<numPointsH; i++) { // For all points from top to bottom
if (int(numPointsH_2pi/2) != (float)numPointsH_2pi/2 && i==numPointsH-1) { // If the numPointsH_2pi is odd and it is at the last pt
float thetaH=(i-1)*2*PI/(numPointsH_2pi);
coorY[i]=cos(PI+thetaH);
multXZ[i]=0;
}
else {
//The numPointsH_2pi and 2 below allows there to be a flat bottom if the numPointsH is odd
float thetaH=i*2*PI/(numPointsH_2pi);
//PI+ below makes the top always the point instead of the bottom.
coorY[i]=cos(PI+thetaH);
multXZ[i]=sin(thetaH);
}
}
}
void textureSphere(PGraphics pg, float rx, float ry, float rz, PImage t) {
// These are so we can map certain parts of the image on to the shape
float changeU=t.width/(float)(numPointsW-1);
float changeV=t.height/(float)(numPointsH-1);
float u=0; // Width variable for the texture
float v=0; // Height variable for the texture
pg.beginShape(TRIANGLE_STRIP);
pg.texture(t);
for (int i=0; i<(numPointsH-1); i++) { // For all the rings but top and bottom
// Goes into the array here instead of loop to save time
float coory=coorY[i];
float cooryPlus=coorY[i+1];
float multxz=multXZ[i];
float multxzPlus=multXZ[i+1];
for (int j=0; j<numPointsW; j++) { // For all the pts in the ring
pg.normal(coorX[j]*multxz, coory, coorZ[j]*multxz);
pg.vertex(coorX[j]*multxz*rx, coory*ry, coorZ[j]*multxz*rz, u, v);
pg.normal(coorX[j]*multxzPlus, cooryPlus, coorZ[j]*multxzPlus);
pg.vertex(coorX[j]*multxzPlus*rx, cooryPlus*ry, coorZ[j]*multxzPlus*rz, u, v+changeV);
u+=changeU;
}
v+=changeV;
u=0;
}
pg.endShape();
}
// TOOLS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void screenClean(color c) { // -----------------------------------------
fill(c);
noStroke();
rect(0, 0, width, height);
}
void displayFps(boolean render) { // -----------------------------------
if (render){
// Display Fps
fill(0); noStroke(); rect(width-80, height-30, 80, 30, 4);
fill(200); text(int(frameRate)+"fps", width-40, height-10, 5);}
}
void autoSnap(boolean render) { // -------------------------------------
// auto-save snapshots
if (frameCount == 1000) {
saveFrame("../snapshots/"
+ year() + nf(month(),2)
+ nf(day(),2)
+ nf(hour(),2)
+ nf(minute(),2)
+ nf(second(),2)
+ "_.png");
}
}

BIN
rnx/IF3Si.xrns Normal file

Binary file not shown.

1
scd/.#snd_lines.scd Symbolic link
View File

@ -0,0 +1 @@
random@trin.5102:1441790855

69
scd/IF3Si.scd Normal file
View File

@ -0,0 +1,69 @@
(/* Interface Fractures III - Silicon
(c) Luka Prinčič / Nova deViator
nova@deviator.si
SuperCollider main patch
.______________________ _________.__
| \_ _____/\_____ \ / _____/|__|
| || __) _(__ < \_____ \ | |
| || \ / \/ \| |
|___|\___ / /______ /_______ /|__|
\/ \/ \/
*/
// Be nice. Say hi!
postln("\n\n
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>>> Hello. Starting Interface Fractures III - SILICON <<<
.______________________ _________.__
| \\_ _____/\\_____ \\ \/ _____\/|__|
| || __) _(__ < \\_____ \\ | |
| || \\ / \\/ \\| |
|___|\\___ / /______ /_______ /|__|
\\/ \\/ \\/
");
Server.default.waitForBoot {
// where are we?
var dir = PathName(thisProcess.nowExecutingPath).pathOnly;
// this might go to separate file at some point... ---------------------|
// will load samples for granular synthesis
// var dir = PathName(thisProcess.nowExecutingPath).pathOnly; //
var granSmp = PathName(dir +/+ "../smp/granul/").files;
var granBfr = List();
postln("\n~~~ Loading samples for granular synthesis ..." );
granSmp.do({ |item, i|
postln(" " + i + "" + item.folderName +/+ item.fileName);
granBfr.add(Buffer.readChannel(s, item.fullPath, channels:[0])); // [0] forces mono!
});
postln("");
// ---------------------------------------------------------------------|
// what are the files?
~files = List[
"sdefs.scd", // SynthDef definitions
"snd_lines.scd", // converting Si spectra lines to sound
"gui_core.scd", // basic general GUI setup
"gui_chaos.scd", // chaos tab
"gui_granul.scd", //
"gui_main.scd"
];
// for each file in list, load/execute it
~files.do({|item, i| this.executeFile(dir +/+ item) });
}
)
//s.meter;
//s.plotTree;
EnvirGui

835
scd/gui_chaos.scd Normal file
View File

@ -0,0 +1,835 @@
/*
part of: Interface Fractures III - Silicon
(c) Luka Prinčič / Nova deViator
nova@deviator.si
gui_chaos.scd - takes care of all GUI elements under
the chaos tab...
********************************************************** */
~tab_views[~tab_names.at("chaos")].layout = HLayout();
~tab_views[~tab_names.at("chaos")].layout.margins = 0;
~tab_views[~tab_names.at("chaos")].layout.add(nil);
// create a view for StandardMap synth ---------------------------------------------------------
~standardMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~standardMapView.background = Color.gray(0.5);
~standardMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Standard"],
["Standard", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~standard2D = Synth(\StandardMap, [\amp, 0]);},
1, {~standard2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,270))
.minWidth_(70) .minHeight_(270)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~standard2D.set(\minfreq, minfreq.value);
~standard2D.set(\maxfreq, maxfreq.value);
}),
StaticText().string_("k"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 2.8);
~standard2D.set(\k, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("x0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 4.9789799812499 * 2);
~standard2D.set(\x0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("y0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 5.7473416156381 * 2);
if(~standard2D.isPlaying, {
~standard2D.set(\x0, val); }
);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
nil
),
VLayout( // gains and filters section
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~standard2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~standard2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~standard2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~standard2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~standard2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~standard2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// -------------------------------------------------------------------------------------------------
// create a view for GbmanMap synth ---------------------------------------------------------
~gbmanMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~gbmanMapView.background = Color.gray(0.5);
~gbmanMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Gbman"],
["Gbman", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~gbman2D = Synth(\GbmanMap, [\amp, 0]);},
1, {~gbman2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,270))
.minWidth_(70) .minHeight_(270)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~gbman2D.set(\minfreq, minfreq.value);
~gbman2D.set(\maxfreq, maxfreq.value);
}),
StaticText().string_("x0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 1.2 * 2);
~gbman2D.set(\x0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("y0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 2.1 * 2);
~gbman2D.set(\y0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
nil
),
VLayout( // gains and filters section
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~gbman2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~gbman2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~gbman2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~gbman2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~gbman2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~gbman2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// -------------------------------------------------------------------------------------------------
// create a view for HenonMap synth ---------------------------------------------------------
~henonMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~henonMapView.background = Color.gray(0.5);
~henonMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Henon"],
["Henon", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~henon2D = Synth(\HenonMap, [\amp, 0]);},
1, {~henon2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,270))
.minWidth_(70) .minHeight_(270)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~henon2D.set(\minfreq, minfreq.value);
~henon2D.set(\maxfreq, maxfreq.value);
}),
StaticText().string_("a"),
Knob() .centered_(true) .value_(0.9) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.explin(0.01, 1, 0, 1.42);
~henon2D.set(\a, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
nil
),
VLayout( // gains and filters section - - - -
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~henon2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~henon2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~henon2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~henon2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~henon2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~henon2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// -------------------------------------------------------------------------------------------------
// create a view for LatoocarfianMap synth ---------------------------------------------------------
~latoocarfianMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~latoocarfianMapView.background = Color.gray(0.5);
~latoocarfianMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Latoocarfian"],
["Latoocarfian", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~latoocarfian2D = Synth(\LatoocarfianMap, [\amp, 0]);},
1, {~latoocarfian2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,180))
.minWidth_(70) .minHeight_(180)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~latoocarfian2D.set(\minfreq, minfreq.value);
~latoocarfian2D.set(\maxfreq, maxfreq.value);
}),
StaticText().string_("a"),
Knob().centered_(true) .value_(0.5).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg a;
a = a.value.linlin(0, 1, 0, 2);
~latoocarfian2D.set(\a, a);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("b"),
Knob().centered_(true) .value_(0.5) .mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg b;
b = b.value.linlin(0, 1, 0, 6);
~latoocarfian2D.set(\b, b);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("c"),
Knob().centered_(true) .value_(0.5) .mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg c;
c = c.value;
~latoocarfian2D.set(\c, c);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("d"),
Knob().centered_(true) .value_(0.5) .mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg d;
d = d.value;
~latoocarfian2D.set(\d, d);
}),
nil
),
VLayout( // gains and filters section
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~latoocarfian2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~latoocarfian2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~latoocarfian2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~latoocarfian2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~latoocarfian2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~latoocarfian2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// create a view for LorenzMap synth ---------------------------------------------------------
~lorenzMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~lorenzMapView.background = Color.gray(0.5);
~lorenzMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Lorenz"],
["Lorenz", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~lorenz2D = Synth(\LorenzMap, [\amp, 0]);},
1, {~lorenz2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,270))
.minWidth_(70) .minHeight_(270)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~lorenz2D.set(\minfreq, minfreq.value);
~lorenz2D.set(\maxfreq, maxfreq.value);
}),
StaticText().string_("x0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.090879182417163 * 2);
~lorenz2D.set(\x0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("y0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 2.97077458055 * 2);
~lorenz2D.set(\y0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("z0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 24.282041054363 * 2);
~lorenz2D.set(\z0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
nil
),
VLayout(
nil,
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("s"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 10 * 2);
~lorenz2D.set(\s, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("r"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 28 * 2);
~lorenz2D.set(\r, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("b"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 2.666666667 * 2);
~lorenz2D.set(\b, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("h"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.02 * 2);
~lorenz2D.set(\h, val);
}),
nil
),
VLayout( // gains and filters section
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~lorenz2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~lorenz2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~lorenz2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~lorenz2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~lorenz2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~lorenz2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// create a view for FhnMap synth ---------------------------------------------------------
~fhnMapView = View.new(~tab_views[~tab_names.at("chaos")]);
~fhnMapView.background = Color.gray(0.5);
~fhnMapView.layout = VLayout( // vert. layout:
Button()
.states_([
["Fhn"],
["Fhn", Color.gray(0.2), Color.grey(0.8)] ])
.mouseDownAction_({ | state |
switch(state.value,
0, {~fhn2D = Synth(\FhnMap, [\amp, 0]);},
1, {~fhn2D.free;}
);
})
.minHeight_(40).minWidth_(70),
HLayout(
VLayout( // parameters
StaticText().string_("frq"),
RangeSlider(nil,Rect(0,0,20,270))
.minWidth_(70) .minHeight_(270)
.lo_(0) .hi_(0.11)
.action_({ | slider |
var minfreq, maxfreq;
minfreq = slider.lo.value.linexp(0, 1, 10, 15000);
maxfreq = slider.hi.value.linexp(0, 1, 10, 15000);
~fhn2D.set(\minfreq, minfreq.value);
~fhn2D.set(\maxfreq, maxfreq.value);
}),
/* urate: 0.1, wrate: 0.1,
b0: 0.6, b1: 0.8,
i: 0, u0: 0, w0: 0, */
StaticText().string_("urate"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.1 * 2);
~fhn2D.set(\urate, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("wrate"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.1 * 2);
~fhn2D.set(\wrate, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
nil
),
VLayout(
nil,
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("b0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.6 * 2);
~fhn2D.set(\b0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("b1"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, 0, 0.8 * 2);
~fhn2D.set(\b1, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("i"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, -1, 1);
~fhn2D.set(\i, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("u0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, -1, 1);
~fhn2D.set(\u0, val);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("w0"),
Knob() .centered_(true) .value_(0.5) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ | val |
val = val.value.linlin(0, 1, -1, 1);
~fhn2D.set(\w0, val);
}),
nil
),
VLayout( // gains and filters section
StaticText().string_("OUT"),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("N"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~fhn2D.set(\ampN, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("L"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~fhn2D.set(\ampL, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("C"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~fhn2D.set(\ampC, amp);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("f"),
Knob() .value_(1) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({arg freq;
freq = freq.value.linexp(0, 1, 40, 20000);
~fhn2D.set(\bpffreq, freq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().align_(\left).string_("q"),
Knob() .value_(0) .mode_(\horiz) .step_(0.003) .minHeight_(60).minWidth_(60)
.action_({ arg rq;
rq = abs(rq.value - 1);
rq = rq.value.linexp(0, 1, 0.1, 100);
~fhn2D.set(\bpfrq, rq);
}),
StaticText().maxHeight_(1).background_(Color.gray(0.1,0.2)),
StaticText().string_("A"),
Knob().value_(0).mode_(\horiz).step_(0.003).minHeight_(60).minWidth_(60)
.action_({ arg amp;
amp = amp.value.linexp(0, 1, 0.01, 1) - 0.01;
~fhn2D.set(\amp, amp);
}),
nil
)
),
nil;
);
// -------------------------------------------------------------------------------------------------
~tab_views[~tab_names.at("chaos")].layout.add(nil);
// -------------------------------------------------------------------------------------------------

146
scd/gui_core.scd Normal file
View File

@ -0,0 +1,146 @@
/*
part of: Interface Fractures III - Silicon
(c) Luka Prinčič / Nova deViator
nova@deviator.si
gui_core.scd - takes care of core GUI things: layouts,
tabs, window, sizes...
********************************************************** */
// general color palette
QtGUI.palette = QPalette.dark;
~screenWidth = 1348;
~screenHeight = 753;
~pagerbuttonwidth = 90;
~pagerbuttonheight = 55;
~pagerbuttonpadding = 3;
~pagerwidth = ~pagerbuttonpadding + ~pagerbuttonwidth * ~tabs.size - ~pagerbuttonpadding;
~pagerheight = ~pagerbuttonheight;
// make a window
w = Window.new( name: "Interface Fractures III",
bounds: Rect(0, 2, ~screenWidth, ~screenHeight),
//bounds: w.availableBounds,
resizable: true,
border: false,
server: s,
scroll: true
).front;
w.fullScreen;
postln("~~~ Created window ..." + w.bounds);
w.background_(Color.gray(0.2));
~pager = View.new(w, Rect(0,0,100,100))
.minHeight_(~pagerheight)
.minWidth_(~pagerwidth)
.background_(Color.gray(0.4,0.0));
~content = View.new(w, w.view.bounds)
.minWidth_(w.view.bounds.width - 2)
.minHeight_(w.view.bounds.height - ~pagerheight - 20)
.background_(Color.gray(0.3,0.2));
w.layout = VLayout( [~pager, align:\top],
[~content, align:\center], nil );
w.layout.margins = 2;
~pager.layout = HLayout();//margins=1;
~pager.layout.margins = 1;
// CREATE TABS ---------------------------------------------------------------
~tabs = List["chaos", "granul", "players", "processing", "main"];
~tab_btns = List();
~tab_views = List();
~tab_names = Dictionary.new;
//~tab_btns_view = View.new();
// go through all of tabs and make buttons and views
~tabs.do(
{ |item, i|
~tab_names.put(item, i);
// views / containers / pages - - - - -
~tab_views.add(
View.new(~content,Rect(0, 0, 1344, 700))
.background_(Color.gray(0.4,0.4))
//.layout(HLayout)
.visible_(0);
);
// buttons / tabs - - - - -
~tab_btns.add(
//Button(~pager, Rect((~pagerbuttonpadding + ~pagerbuttonwidth * i), 0, ~pagerbuttonwidth, ~pagerbuttonheight))
Button(~pager, Rect((~pagerbuttonpadding + ~pagerbuttonwidth * i), 0, ~pagerbuttonwidth, ~pagerbuttonheight))
.states_([[item],
[item, Color.white, Color.gray(0.6)]])
.action_({arg btn;
switch(btn.value,
0, { postln("~~~ Hide:" + item);
~tab_views[i].visible = 0; },
1, { ~tab_btns.do(
{ |b_item,b_i|
if (b_i != i, {
~tab_btns[b_i].enabled_(1);
~tab_btns[b_i].valueAction = 0;
})
});
~tab_btns[i].enabled_(0);
postln("~~~ Show:" + item + "\n");
~tab_views[i].visible = 1;
})
})
.minHeight_(~pagerbuttonheight).minWidth_(~pagerbuttonwidth);
);
}
);
// CLOSING ////////////////////////////////////////////////////////////////////////
w.view.keyDownAction_({ |view, char, modifiers, unicode, keycode, key|
if (unicode == 27) {
postln("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
postln("~~~ Cought an ESC key. Closing window, freeing synths...");
postln("~~~ Wait, let me see the window bounds:" + w.bounds + "!\n");
w.close;
postln("\n\n<<< So long and thanks for all the fish! >>>"
+ "\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - ");
}
});
// free all UGens on server (stop sound, etc)
w.onClose_({
postln("<<< Platform IDE:" + Platform.ideName);
s.freeAll;
// when running 'standalone' from shell:
if (Platform.ideName == "none") {
postln("<<< ... sclang is killed. Stockhausen forgives you!");
0.exit;
} {
postln("<<< ... stopping Main.");
thisProcess.stop;
};
postln("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
});

588
scd/gui_granul.scd Normal file
View File

@ -0,0 +1,588 @@
/*
part of: Interface Fractures III - Silicon
(c) Luka Prinčič / Nova deViator
nova@deviator.si
gui_granul.scd - takes care of all GUI elements under
the 'granul' tab...
********************************************************** */
~tab_views[~tab_names.at("granul")].layout = HLayout(
VLayout( // left half starts here
//~tab_views[~tab_names.at("granul")].layout.add(nil);
//~granSynth1 = View.new(~tab_views[~tab_names.at("granul")]);
//~granSynth1.background = Color.gray(0.5);
//~granSynth1.layout = HLayout( // vert. layout:
// Synth starts here --------------------------------------------------------------------
HLayout(
VLayout(
StaticText().string_("GRANULATOR"),
Button()
.states_([
["OFF", Color.gray(0.2), Color.gray(0.8)],
["ON", Color.gray(0.8), Color.grey(0.2)] ])
.mouseDownAction_({
arg state;
state.value.postln;
if (state.value == 0) {
~granSynth = Synth(\Granny, [\bufnum, b]);
} {
~granSynth.free;
}
})
.minHeight_(70)
.minWidth_(70),
nil
),
VLayout(
PopUpMenu().items_(["buffer1","file2","file3"]).font_(Font("Sans",20)),
StaticText().string_("Filter vs. Position"),
Slider2D()
.x_(0.05)
.y_(0.05)
.action_({ arg slider;
~granSynth.set(\pos, slider.x);
~granSynth.set(\lpfFreq, slider.y.value.linexp(0,1,30,20000,nil))}),
StaticText().string_("Position variation"),
Slider(nil,Rect(0,0,50,10))
.minHeight_(20)
.thumbSize_(50)
.action_({ arg posvar;