Soc una estudiant de 3r d'ESO de l'assignatura de Robòtica i Programació, em dic Eva i el que trobareu us agradarà molt:
Explicarem els projectes començant pel més fàcil:
let mic; //guarda un espai a la memòria una variable anomenada micròfon.
function setup() { //setup és una funció obligatoria de p5.js de configuració o setup
createCanvas(800,600); //crea un espai de dibuix o canva de 800 píxels d'amplada i 600 d'alçada.
mic= new p5.AudioIn(); //la variable mic és un objecte d'una classe anomenada p5.AudioIn que és una entrada d'àudio i tindrà tots els mètodes d'aquesta classe, que les cridarem amb un punt: mic.Start per activar el micròfon, micGetLevel per agafar el nivell del micròfon.
mic.start();
}
function draw() {
let vol= mic.getLevel();
console.log ("volume is " + vol); //veure la consola del navegador els números de volum que va entre 0 i 1 i que van canviant.
let mouth=100;
let micVariable= map(vol,0,1,0,800); //la funció map fa que els números de volum que van de l'escala 0 a 1 canvii a escala 0 a 500, per poder notar el canvi en l'imatge. Els números queden guardats en micVariable, i els veig amb console.log
console.log ("micVariable is " + micVariable);
//cara
strokeWeight(1);
background(255,255,255);
fill(micVariable +40, micVariable +100, micVariable +200); //fill és omplir de color amb 3 números. Primer vermell, segon verd, tercer blau. Si en comptes de números poso variables de micròfon, és mourà amb la veu. El valor màxim de color és 255, és a dir, hi ha 255 colors vermells, 255 colors blaus i 255 colors verds, i quan els multiplico em dona 255x255x255 = 16.000.000 colors diferents. Si poses només un número, és l'escala de grisos (fill(n)). Si posés dos números, seria escala de gris i transparència. Si poso quatre números seria red, green and blue i transparència.
ellipse(400,300,250,300); //Els dos primers números son el centre de l'el·lipse, el primer és el centre de la "x" i el segon és el centre de la "y". El penúltim número és l'amplada de l'el·lipse i l'últim número és l'alçada de l'el·lipse, l'unitat de tot son els pixels. El penúltim número, en aquest cas, és una variable (mic) perqué amb la veu canvï l'amplada de l'el·lipse.
// ull dret
strokeWeight(1); //És el gruix del contorn de l'el·lipse.
fill("white");
ellipse(350,251,50,40);
fill("#0000FF"); // En aquest cas l'ull serà de color blau perquè les dues FF estan al final (rgb).
ellipse(350,255,25,20);
fill("#000000");
ellipse(350,255,10,10);
// ull esquerra
strokeWeight(1);
fill("white");
ellipse(450,251,50,40)
fill("#0000FF");
ellipse(450,255,25,20);
fill("#000000");
ellipse(450,255,10,10);
//boca
strokeWeight(1);
fill("#FF0000")
arc (400,350,120,micVariable,0,PI); // L'arc de la boca té sis paràmetres: el primer és la posició "x" del centre de la boca, el segon és la posició "y" del centre de la boca. El tercer és l'amplada del arc i el quart és l'alçada de l'arc. I el cinqué i sisé de l'arc son com es veu l'arc, de 0 a Pi, és una semicircumferència (la part de dalt, en aquest cas) i Pi 0 és al contrari.
//ceja derecha
//strokeWeight(6);
//line(420,220,436,205) //Això és una linia i els dos primers números, són els vèrtexs inicials i finals.
//line(436,205,455,220)
//ceja izquierda
//strokeWeight(6);
//line(345,220,361,205)
//line(361,205,380,220)
//nas
strokeWeight (1);
fill(micVariable +200, micVariable +150, micVariable +300); //El color variarà amb el micròfon quan pujo la veu la Variable mic augmenta la intensitat del color vermell perquè li hem restat 127 i augmenta la intensitat del verd perquè li he sumat 127 i el color blau no varia de intensitat. No puc posar micVariable en tots els colors perquè sortiria sempre la mateixa tonalitat de color.
triangle (440, 310, 400, 260,360,310)
}
let mic,h,x,rand;
function setup(){
createCanvas(1000,982);
mic=new p5. AudioIn();
mic.start();
}
function draw(){
if (keyIsPressed){
if ((key=='A')|| (key=='a')){
ellipse(mouseX,mouseY,25,25);
}
}
background(255);
x=sin (frameCount*0.1)*15// Guardo en la variable "x",que s'ha creat anteriorment i la converteixo en una variable sinus que varia entre -1 i +1 de forma continua: -1, -0.99, -0.98,... -0.01,0,0.01,0.2...1, 0.99,0.98...0.01,0,... Multipico per 20 el sinus perquè vagi des de -20 pixels fins +20 pixels. FrameCount serveix per contar fotogràmes i al contar fotogàmes, 50 per seg. perquè funciom draw es resfreca 50 vegades per segon.
y=sin (frameCount*0.1)*30
z=sin (frameCount*0.1)*20
k=sin (frameCount*0.1)*10
t=sin (frameCount*0.1)*40
e=cos (frameCount*0.1)*40
q=cos (frameCount*0.1)*15
rand= random (255); //Rand és una variable aleatoria i dona lloc a núm. sencers (int=integer) entre 0 i 255 gràcies a la funció predefinida random.
let vol= mic.getLevel();
let h= map (vol,0,1,0,800);
fill (200,rand,255);
beginShape(); //Comença una forma.
//Soporte antena
vertex(416,178);vertex(431,157);vertex(452,144);vertex(475,139);vertex(497,146);vertex(514,154);vertex(523,166);vertex(531,176);vertex(531,177); endShape (CLOSE);
fill ("#696B65");
beginShape(); //Palo antena
vertex(473,55);vertex(472,138);vertex(477,139);vertex(476,58); endShape (CLOSE);
fill (rand,80,255);
beginShape(); //Bola antena
vertex(469,29);vertex(482,29);vertex(489,43);vertex(479,56);vertex(469,55);vertex(460,43);vertex(460,41); endShape (CLOSE);
fill(rand,143,187+rand);
beginShape(); //Cara
vertex(339,182);vertex(339,368);vertex(610,371);vertex(609,182); endShape (CLOSE);
fill(219+rand,17,22)
beginShape(); //Boca
vertex(432,329);vertex(424,329);vertex(424,332+h);vertex(424,339+h);vertex(431,343+h);vertex(443,344+h);vertex(452,346+h);vertex(463,346+h);vertex(472,346+h);vertex(479,346+h);vertex(486,346+h);vertex(492,345+h);vertex(499,345+h);vertex(510,344+h);vertex(517,343+h);vertex(525,341+h);vertex(530,339+h);vertex(529,331+h);vertex(528,327);vertex(516,330);vertex(506,332);vertex(500,332);vertex(489,332);vertex(476,333);vertex(469,334);vertex(463,333);vertex(458,332);vertex(449,330);vertex(442,329);vertex(432,328);vertex(424,328); endShape (CLOSE);
fill ("#F7F9F7");
beginShape(); //Parte blanca ojo izquierdo
ellipse(412,254,49,49); endShape (CLOSE);
fill (50,40,45+h*6);
beginShape(); //iris ojo izquierdo
ellipse(411,255,14+q,14+q); endShape (CLOSE);
fill("#181819");
beginShape(); //pupila ojo izquierdo
ellipse(411,255,1+q,1+q); endShape (CLOSE);
fill ("#F7F9F7");
beginShape(); //Parte blanca ojo derecho
ellipse(539,256,52,52); endShape (CLOSE);
fill (50,40,45+h*6);
beginShape(); //iris ojo derecho
ellipse(538,255,14+x,14+x); endShape (CLOSE);
fill("#181819");
beginShape(); //pupila ojo derecho
ellipse(538,255,3+x,3+x); endShape (CLOSE);
fill(209,17+rand,245);
beginShape(); //Cuello
vertex(377,367);vertex(377,395);vertex(576,396);vertex(574,370); endShape (CLOSE);
fill(rand, rand, 250);
beginShape(); //Cuerpo
vertex(311,397);vertex(641,396);vertex(643,716);vertex(307,716); endShape (CLOSE);
fill(rand,33,193);
beginShape(); //barriga
vertex(311,397);vertex(641);vertex(643,716);vertex(307,716); endShape (CLOSE);
fill(29,17+rand,255)
beginShape(); //Brazo izquierdo
vertex(310,407);vertex(241,502+x);vertex(255,504+x);vertex(265,509+x);vertex(272,515+x);vertex(278,520+x);vertex(280,529+x);vertex(311,491); endShape (CLOSE);
fill(29,17,255)
beginShape(); //Codo izquierdo
ellipse(246,535+z,77,77); endShape (CLOSE);
fill (29,17+rand,255)
beginShape(); //Antebrazo izquierdo
vertex(234,502+k);vertex(130,431+y);vertex(102,471+y);vertex(208,543+k);vertex(211,530+k);vertex(212,523+k);vertex(218,516+k);vertex(225,509+k);vertex(232,507+k);vertex(233,507+k);vertex(233,508+k);
endShape (CLOSE);
fill (rand,rand,255);
beginShape(); //Mano izquierda
vertex(17,443+y);vertex(30,471+y);vertex(98,477+y);vertex(137,422+y);vertex(107,361+y);vertex(76,360+y);vertex(98,408+y);vertex(73,448+y); endShape (CLOSE);
fill (29,17+rand,255)
beginShape(); //Brazo derecho
vertex(641,403);vertex(642,456);vertex(729,494+x);vertex(729,484+x);vertex(732,474+x);vertex(736,467+x);vertex(740,465+x);vertex(743,461+x);vertex(750,458+x);vertex(753,456+x); endShape (CLOSE);
fill(29,17,255)
beginShape(); //Codo derecho
ellipse(767,485+z,77,77); endShape (CLOSE);
fill (29,17+rand,255)
beginShape(); //Antebrazo derecho
vertex(762,449+x);vertex(814,340+x);vertex(854,361+x);vertex(803,474+x);vertex(796,465+x);vertex(791,461+x);vertex(786,459+x);vertex(781,454+x);vertex(772,452+x);vertex(767,451+x); endShape (CLOSE);
fill (rand,rand,255);
beginShape(); //Mano derecha
vertex(800,266+x);vertex(804,333+x);vertex(864,364+x);vertex(921,326+x);vertex(917,296+x);vertex(869,326+x);vertex(829,306+x);vertex(825,253+x); endShape (CLOSE);
fill (219,117,22+rand)
beginShape(); //Pierna izquierda
vertex(370,715);vertex(371,903+e);vertex(384,897+e);vertex(399,894+e);vertex(406,897+e);vertex(418,899+e);vertex(427,901+e);vertex(431,906+e);vertex(432,715); endShape (CLOSE);
fill(rand,120,170)
beginShape(); //Pie izquierdo
vertex(373,903+e);vertex(367,906+e);vertex(356,914+e);vertex(348,921+e);vertex(342,937+e);vertex(340,949+e);vertex(339,962+e);vertex(463,964+e);vertex(463,955+e);vertex(463,945+e);vertex(461,936+e);vertex(457,929+e);vertex(452,921+e);vertex(446,916+e);vertex(440,909+e);vertex(433,906+e);vertex(428,904+e);vertex(424,900+e);vertex(415,897+e);vertex(406,896+e);vertex(399,894+e);vertex(391,894+e);vertex(384,897+e);vertex(379,899+e); endShape (CLOSE);
fill (219,117,22+rand)
beginShape(); //Pierna derecha
vertex(521,714);vertex(579,715);vertex(578,903+t);vertex(570,898+t);vertex(561,894+t);vertex(555,892+t);vertex(545,895+t);vertex(535,895+t);vertex(525,899+t);vertex(519,901+t); endShape (CLOSE);
fill(rand,120,170)
beginShape(); //Pie derecho
vertex(517,902+t);vertex(509,911+t);vertex(504,914+t);vertex(498,922+t);vertex(496,928+t);vertex(492,938+t);vertex(492,951+t);vertex(492,960+t);vertex(492,963+t);vertex(612,963+t);vertex(611,959+t);vertex(611,955+t);vertex(610,949+t);vertex(610,942+t);vertex(608,936+t);vertex(607,930+t);vertex(604,928+t);vertex(601,922+t);vertex(598,919+t);vertex(595,915+t);vertex(590,912+t);vertex(583,907+t);vertex(579,903+t);vertex(569,900+t);vertex(561,895+t);vertex(553,892+t);vertex(548,892+t);vertex(543,894+t);vertex(536,894+t);vertex(531,895+t);
endShape (CLOSE); //Acaba una forma.
}
El projecte thermin consisteix en conectar un sensor de llum LDR a un arduino i depenent de la quantitat de llum rebuda per aquest sensor s'activa un altaveu de forma que la freqüència del so és diferent depenent de la llum rebuda.