======INFRA======
===== Infra-Documentation (ExSitu) =====
Test de l'outil Multitude fraîchement développer par Laurent et permettant de collecter du son directement depuis une appli web, de l'archiver et de le rediffuser.
Le résultat sur 4 jours de résidence : https://multitude.exsitu.xyz/v/visu/1931309934af589f4
La version map GPS : https://multitude.exsitu.xyz/v/map/1931309934af589f4
{{:recherche:residence_infra:inframultitude.png?nolink&400|}}
Démonstration de la diffusion sur 7 enceintes :
{{:recherche:residence_infra:infraenceintesx7.png?nolink&400|}}
Gitlab : https://gitlab.com/losylam/multitude
===== Laurent =====
Trucheteries : pour faire des trucheteries au plotter ou à la brodeuse, il faut joindre des chemins disjoints avec vpype :
vpype read truchet_094.svg linemerge linesimplify -t 0.05 write truchet_94_merge.svg
==== Infrabuble ====
https://dev.laurent-malys.fr/bacasable/infra/
==== Multitude ====
https://multitude.labomedia.org/ \\
https://multitude.exsitu.xyz/v/map/19255da86d5b11f61
==== Dessins génératifs ====
Broderie + upcycling : https://www.instagram.com/p/C58HraKiuYE/?img_index=1 \\
Trucs à broder: https://dev.laurent-malys.fr/harmono-bro/
=====Infra PickUp=====
{{:recherche:residence_infra:ifrapickup5.jpg?400|}}
Profiter de ces beaux jours d'automne pour se chauffer au néons et ressortir la petite [[https://ressources.labomedia.org/bobineuse?s|bobineuse]] pour créer un mirco
====la base infrastructurelle====
* Deux disques de cp plaqué de 3 mm découper à la scie cloche
* Un aimant Alnico de 10mm de diamètre
* Du fil enamel de 0,063mm de diamètre
* Une plaque rectangulaire pour insérer les œillets et fixer le câbles audio
====le bobinage====
* Un petit programme arduino pour compter les tour de bobines (grâce à un aimant placer sur l'axe de rotation et interrupteur reed)
* récupérer ici : https://forum.arduino.cc/t/simple-pulse-counter/519930
* Environs 3500 tours
{{:recherche:residence_infra:ifrapickup0.jpg?400|}}
{{:recherche:residence_infra:ifrapickup1.jpg?400|}}
{{:recherche:residence_infra:ifrapickup2.jpg?400|}}
{{:recherche:residence_infra:ifrapickup3.jpg?400|}}
====assemblage====
* La bobine et la base sont collés à l'epoxy
{{:recherche:residence_infra:ifrapickup4.jpg?400|}}
====trempage====
* Pour donner à l'ensemble un peu d'homogénéité et surtout protéger la bobine le tout est laisser trempé dans de la paraffine jusqu'à temps qu'il n'y ai plus de petites bulles
{{:recherche:residence_infra:ifrapickup6.jpg?400|}}
{{:recherche:residence_infra:ifrapickup7.jpg?400|}}
====essai infrabassique avec retour d'informations====
* Ça fonctionne plutôt bien au niveau des infras 8-)
* Ajout d'un second micro (caché sous le scotch bleu)
* Câblage du gros micro et du petit avec un ampli mono 7W pour créer un feedback de résonnances
{{:recherche:residence_infra:ifrapickup10.jpg?400|}}
{{:recherche:residence_infra:ifrapickup8.jpg?400|}}
{{:recherche:residence_infra:ifrapickup9.jpg?400|}}
{{:recherche:residence_infra:ifrapickup11.jpg?400|}}
===== Infra graphique =====
Dérive dans les images semi-graphiques. Avant le graphisme «hi-res». Journal : [[recherche:residence_infra:infra_graphique|infra-graphique]]
===== Quaternion =====
**Exploration des quaternions et de la modélisation procedurale avec Processing**
Une vidéo qui m'a bien aidée à comprendre le ce truc : https://www.youtube.com/watch?v=bKd2lPjl92c
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-10_23-26-27.png?nolink&400|}}
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-11_10-20-04.png?nolink&400|}}
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-11_12-13-34.png?nolink&400|}}
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-11_10-08-30.png?nolink&400|}}
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-11_21-43-18.png?nolink&400|}}
{{:recherche:residence_infra:capture_d_ecran_du_2024-11-11_23-24-57.png?nolink&400|}}
Les sketchs Processing ci-dessous dépendent de façon importante sur deux librairies non officielles:
* **QueasyCam** (modifié), pour la navigation dans l'espace en 3D -> https://github.com/gweltou/queasycam/tree/master/distribution/queasycam-6/download/
* **LibAvatar**, pour l'intégration des classes de LibGDX dans Processing -> https://github.com/gweltou/Processing-libAvatar/blob/2.0/distribution/libAvatar-3/download/libAvatar.zip
Vous pouvez naviguer dans l'espace 3D avec les touches zqsda et e. Affichage en mode filaire avec w.
import queasycam.*;
import com.badlogic.gdx.math.*;
import nervoussystem.obj.*;
QueasyCam cam;
static final Vector3 xAxis = new Vector3(1.0, 0.0, 0.0);
float rootSize = 8;
int numSeg = 128;
Segment root = new Segment(null, 10, new Quaternion());
public void setup() {
fullScreen(P3D);
cam = new QueasyCam(this, 1, 9999);
cam.key_forward = 'o';
cam.key_left = 'k';
cam.key_backward = 'l';
cam.key_right = 'm';
cam.key_up = 'i';
cam.key_down = 'p';
sphereDetail(16);
Segment c1 = root.branch(rootSize, new Quaternion().setEulerAngles(0, 0, -100));
Segment c2 = root.branch(rootSize, new Quaternion().setEulerAngles(120, 0, -100));
Segment c3 = root.branch(rootSize, new Quaternion().setEulerAngles(240, 0, -100));
for (int i=0; i children = new ArrayList();
public Segment(Segment parent, float len, Quaternion rot) {
this.parent = parent;
if (parent == null) {
rootWorldPos = new Vector3();
globalRot = rot.cpy();
} else {
rootWorldPos = parent.rootWorldPos;
}
this.localRot = rot.cpy();
this.len = len;
baseRadius = len * l2b * 0.5;
}
public Segment branch(float len, Quaternion rot) {
Segment child = new Segment(this, len, rot);
children.add(child);
return child;
}
public boolean hasChildren() {
return !children.isEmpty();
}
public void draw() {
// Draw head line
stroke(0);
Vector3 up = new Vector3(0, len*0.4, 0);
globalRot.transform(up);
if (parent != null)
line(parent.head.x, parent.head.y, parent.head.z, head.x, head.y, head.z);
else
line(0.0, 0.0, 0.0, head.x, head.y, head.z);
// Draw UP line
stroke(255, 0, 0);
line(head.x, head.y, head.z, head.x + up.x, head.y + up.y, head.z + up.z);
noStroke();
if (hasChildren())
drawSegment();
else
drawTip();
for (Segment child : children)
child.draw();
}
private void drawSegment() {
beginShape(QUAD_STRIP);
for (int i=0; i
import queasycam.*;
import com.badlogic.gdx.math.*;
import nervoussystem.obj.*;
import processing.pdf.*;
static final Vector3 xAxis = new Vector3(1.0, 0.0, 0.0);
static final Vector3 yAxis = new Vector3(0.0, 1.0, 0.0);
static final Vector3 zAxis = new Vector3(0.0, 0.0, 1.0);
QueasyCam cam;
boolean wireframe = false;
boolean record = false;
ArrayList objects = new ArrayList();
public void setup() {
fullScreen(P3D);
//size(800, 600, P3D);
cam = new QueasyCam(this, 1, 9999);
cam.key_forward = 'z';
cam.key_left = 'q';
cam.key_backward = 's';
cam.key_right = 'd';
cam.key_up = 'e';
cam.key_down = 'a';
Pipe pipe = new Pipe(
new Vector3(0, 0, 0), new Quaternion().setEulerAngles(10, 0, 40),
10, 32);
objects.add(pipe);
float size = 20;
for (int i=0; i<8; i++) {
pipe.changeSize(size);
size += 10;
pipe.addBend(90, 0.0, 45.0);
}
}
public void draw() {
background(255);
lights();
strokeWeight(1);
stroke(255, 0, 0);
line(0, 0, 0, 100, 0, 0);
stroke(0, 255, 0);
line(0, 0, 0, 0, 100, 0);
stroke(0, 0, 255);
line(0, 0, 0, 0, 0, 100);
if (wireframe)
stroke(0);
else
noStroke();
strokeWeight(2);
if (record) {
beginRaw(PDF, "output.pdf");
noFill();
}
for (Drawable o : objects)
o.draw();
if (record) {
record = false;
endRaw();
}
}
void keyPressed() {
if (key == 'w')
wireframe = !wireframe;
if (key == 'p')
record = true;
}
public interface Drawable {
public void draw();
public void update();
}
public interface Chainable extends Drawable {
public Vector3 getOutPos();
public Quaternion getOutOrientation();
}
/*****************************
** class Pipe **
*****************************/
public class Pipe implements Drawable {
private Vector3 pos;
private Quaternion orientation;
private float radius;
private float nextRadius;
private int faces;
private ArrayList objects = new ArrayList();
private Vector3 currentPos;
private Quaternion currentOrientation;
public Pipe(Vector3 pos, Quaternion orientation, float radius, int faces) {
this.pos = pos;
this.orientation = orientation;
this.radius = radius;
this.nextRadius = radius;
this.faces = faces;
currentPos = this.pos.cpy();
currentOrientation = orientation.cpy();
}
public void changeSize(float next) {
this.nextRadius = next;
}
private void add(Chainable object) {
objects.add(object);
currentPos = object.getOutPos();
currentOrientation = object.getOutOrientation();
radius = nextRadius;
}
public void addTube(float len) {
addTube(len, 0.0);
}
public void addTube(float len, float twist) {
Tube tube = new Tube(
currentPos, currentOrientation,
len, radius, nextRadius, twist, 1, faces
);
add(tube);
}
public void addBend(float angleBendDeg) {
addBend(angleBendDeg, 0.0, 0.0);
}
public void addBend(float angleBendDeg, float angleRotDeg) {
addBend(angleBendDeg, angleRotDeg, 0.0);
}
public void addBend(float angleBendDeg, float angleRotDeg, float twist) {
int rings = 8;
float radInt = 50;
currentOrientation.mul(new Quaternion().setEulerAngles(0, angleRotDeg, 0));
Bend bend = new Bend(
currentPos, currentOrientation,
radius, nextRadius,
radians(angleBendDeg), radInt, twist,
rings, faces
);
add(bend);
}
public void update() {
for (Chainable o : objects)
o.update();
}
public void draw() {
for (Chainable o : objects) {
o.draw();
}
Vector3 head = currentOrientation.transform(new Vector3(32, 0, 0));
head.add(currentPos);
line(currentPos.x, currentPos.y, currentPos.z, head.x, head.y, head.z);
}
}
/*****************************
** class Tube **
*****************************/
public class Tube implements Drawable, Chainable {
private Vector3 pos;
private Quaternion orientation;
private float len;
private float radiusIn;
private float radiusOut;
private float twist;
private int rings;
private int faces;
private Vector3[] points;
private Vector3 tmpVec = new Vector3();
private Vector3 outPos = new Vector3();
private Quaternion outOrientation = new Quaternion();
public Tube(
Vector3 pos,
Quaternion orientation,
float len,
float radiusIn,
float radiusOut,
float twist, // In degrees
int rings, int faces
) {
this.pos = pos.cpy();
this.orientation = orientation.cpy();
this.len = len;
this.radiusIn = radiusIn;
this.radiusOut = radiusOut;
this.twist = radians(twist);
this.rings = rings;
this.faces = faces;
points = new Vector3[faces * (rings+1)];
update();
}
Vector3 getOutPos() {
return outPos.cpy();
}
Quaternion getOutOrientation() {
return outOrientation.cpy();
}
public void update() {
Quaternion rot = new Quaternion();
int pointIdx = 0;
for (int s=0; s
import queasycam.*;
import com.badlogic.gdx.math.*;
static final Vector3 xAxis = new Vector3(1.0, 0.0, 0.0);
static final Vector3 yAxis = new Vector3(0.0, 1.0, 0.0);
static final Vector3 zAxis = new Vector3(0.0, 0.0, 1.0);
QueasyCam cam;
boolean wireframe = false;
ArrayList objects = new ArrayList();
public void setup() {
fullScreen(P3D);
cam = new QueasyCam(this, PConstants.PI/2.5f, 0.01, 9999);
cam.key_forward = 'z';
cam.key_left = 'q';
cam.key_backward = 's';
cam.key_right = 'd';
cam.key_up = 'e';
cam.key_down = 'a';
// Center tower
Pipe pipe = new Pipe(
new Vector3(0.0, 800, 0.0),
new Quaternion().setFromAxis(zAxis, -90),
550, 64);
pipe.addTube(1000);
pipe.changeSize(800);
pipe.addTube(1000);
pipe.changeSize(820);
pipe.addTube(20);
pipe.changeSize(2600);
pipe.addTube(200);
pipe.addTube(-400);
objects.add(pipe);
// Surrounding circus
pipe = new Pipe(
new Vector3(0.0, 800, 0.0),
new Quaternion().setFromAxis(zAxis, -90),
800, 64);
pipe.addTube(600);
pipe.changeSize(2000);
pipe.addTube(200);
pipe.changeSize(2040);
pipe.addTube(40);
pipe.addTube(1000);
objects.add(pipe);
for (int r=0; r<4; r++) {
Quaternion rot = new Quaternion().setEulerAngles(r * 90, 0, 9);
for (int i=0; i<6; i++) {
Vector3 pos = new Vector3(-2100, 298, (i-3)*34 + 17);
rot.transform(pos);
pipe = new Pipe(pos, rot, 16, 16);
pipe.addTube(1480 + 4 * abs(i-3));
pipe.addBend(99, 180);
pipe.addTube(300, (3-i) * 5);
pipe.addBend(14);
if (abs(i-2.5)<=1) {
pipe.addTube(860);
pipe.changeSize(24);
pipe.addTube(18);
pipe.changeSize(26);
pipe.addTube(200);
} else {
pipe.addTube(1000);
pipe.addBend(70);
float l=0.0, ll=0.0;
int state = 0; // -1: left; 0: center; 1: right
while (l<1800) {
int turn = floor(random(3.0)-1.0);
if (state==0 && turn == -1) {
pipe.addBend(45, 90);
state = -1;
} else if (state==0 && turn == 1) {
pipe.addBend(45, -90);
state = 1;
} else if (state == -1 && turn == 1) {
pipe.addBend(45, 180, -90);
state = 0;
} else if (state == 1 && turn == -1) {
pipe.addBend(45, -180, 90);
state = 0;
} else if (state == 0) {
pipe.addTube(ll);
l += ll;
ll = 0.0;
}
ll += 100;
}
}
objects.add(pipe);
}
float deg = r * 90 + 45;
rot.setFromAxis(zAxis, -90);
rot.mul(new Quaternion().setFromAxis(xAxis, deg));
Vector3 pos = new Vector3(590 * cos(radians(deg)), 800, 590 * sin(radians(deg)));
pipe = new Pipe(pos, rot, 34, 16);
pipe.addTube(980);
pipe.addBend(14);
pipe.addTube(950);
pipe.addBend(70);
pipe.addTube(1800);
objects.add(pipe);
deg = r * 90 + 45;
rot.setFromAxis(zAxis, -90);
rot.mul(new Quaternion().setFromAxis(xAxis, deg));
pos = new Vector3(1700 * cos(radians(deg)), 50, 1700 * sin(radians(deg)));
pipe = new Pipe(pos, rot, 140, 32);
pipe.addBend(90, 0, 0, 300);
objects.add(pipe);
}
}
public void draw() {
background(0);
//lights();
//ambientLight(12, 4, 1);
//pointLight(100, 100, 110, 140, -2000, 144);
directionalLight(204, 204, 204, .5, 0.6, 0.2);
emissive(50, 46, 51);
//specular(204, 102, 0);
shininess(1.0);
strokeWeight(1);
stroke(255, 0, 0);
line(0, 0, 0, 100, 0, 0);
stroke(0, 255, 0);
line(0, 0, 0, 0, 100, 0);
stroke(0, 0, 255);
line(0, 0, 0, 0, 0, 100);
if (wireframe)
stroke(0);
else
noStroke();
strokeWeight(1);
for (Drawable o : objects)
o.draw();
}
void keyPressed() {
if (key == 'w')
wireframe = !wireframe;
}
public interface Drawable {
public void draw();
public void update();
}
public interface Chainable extends Drawable {
public Vector3 getOutPos();
public Quaternion getOutOrientation();
}
/*****************************
** class Pipe **
*****************************/
public class Pipe implements Drawable {
private Vector3 pos;
private Quaternion orientation;
private float radius;
private float nextRadius;
private int faces;
private ArrayList objects = new ArrayList();
private Vector3 currentPos;
private Quaternion currentOrientation;
public Pipe(Vector3 pos, Quaternion orientation, float radius, int faces) {
this.pos = pos;
this.orientation = orientation;
this.radius = radius;
this.nextRadius = radius;
this.faces = faces;
currentPos = this.pos.cpy();
currentOrientation = orientation.cpy();
}
public void changeSize(float next) {
this.nextRadius = next;
}
private void add(Chainable object) {
objects.add(object);
currentPos = object.getOutPos();
currentOrientation = object.getOutOrientation();
radius = nextRadius;
}
public void addTube(float len) {
addTube(len, 0.0);
}
public void addTube(float len, float twist) {
Tube tube = new Tube(
currentPos, currentOrientation,
len, radius, nextRadius, twist, 1, faces
);
add(tube);
}
public void addBend(float angleBendDeg) {
addBend(angleBendDeg, 0.0, 0.0);
}
public void addBend(float angleBendDeg, float angleRotDeg) {
addBend(angleBendDeg, angleRotDeg, 0.0);
}
public void addBend(float angleBendDeg, float angleRotDeg, float twist) {
float radInt = 50;
addBend(angleBendDeg, angleRotDeg, twist, radInt);
}
public void addBend(float angleBendDeg, float angleRotDeg, float twist, float radInt) {
int rings = ceil(angleBendDeg * 64.0 / 360.0);
currentOrientation.mul(new Quaternion().setEulerAngles(0, angleRotDeg, 0));
Bend bend = new Bend(
currentPos, currentOrientation,
radius, nextRadius,
radians(angleBendDeg), radInt, twist,
rings, faces
);
add(bend);
}
public void update() {
for (Chainable o : objects)
o.update();
}
public void draw() {
for (Chainable o : objects) {
o.draw();
}
Vector3 head = currentOrientation.transform(new Vector3(32, 0, 0));
head.add(currentPos);
line(currentPos.x, currentPos.y, currentPos.z, head.x, head.y, head.z);
}
}
/*****************************
** class Tube **
*****************************/
public class Tube implements Drawable, Chainable {
private Vector3 pos;
private Quaternion orientation;
private float len;
private float radiusIn;
private float radiusOut;
private float twist;
private int rings;
private int faces;
private Vector3[] points;
private Vector3 tmpVec = new Vector3();
private Vector3 outPos = new Vector3();
private Quaternion outOrientation = new Quaternion();
public Tube(
Vector3 pos,
Quaternion orientation,
float len,
float radiusIn,
float radiusOut,
float twist, // In degrees
int rings, int faces
) {
this.pos = pos.cpy();
this.orientation = orientation.cpy();
this.len = len;
this.radiusIn = radiusIn;
this.radiusOut = radiusOut;
this.twist = radians(twist);
this.rings = rings;
this.faces = faces;
points = new Vector3[faces * (rings+1)];
update();
}
Vector3 getOutPos() {
return outPos.cpy();
}
Quaternion getOutOrientation() {
return outOrientation.cpy();
}
public void update() {
Quaternion rot = new Quaternion();
int pointIdx = 0;
for (int s=0; s