commit
81fb74dc00
12 changed files with 3103 additions and 0 deletions
@ -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); |
||||
} // -------------------------------------------------------------------------- |
||||
|
||||
|
||||
|
@ -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; |
||||
} |
@ -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"); |
||||
} |
||||
} |
Binary file not shown.
@ -0,0 +1 @@ |
||||
random@trin.5102:1441790855 |
@ -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 |
||||
|
||||
|
||||
|
@ -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); |
||||
|
||||
// ------------------------------------------------------------------------------------------------- |
@ -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; |
||||