Soc un estudiant de 3r d'ESO de l'assignatura de Robòtica i Programació, em dic Martí 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 per una variable anomenada micròfon
let micVariable = 100; //guarda un espai a la memòria per una variable anomenada micVariable amb un valor inicial de 100. Aquestes variables són globals i afecten a tot el codi. Si estiguessin dintre d'una funció, no es podrien utilitzar fora d'aquesta perquè son variables locals si estan dintre d'una funció.
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à totes 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() {//cara
background(255,255,255);
let vol = mic.getLevel();
console.log ("volume is" + vol); //veure la consola del desenvolupador que es troba en el navegador els números de volum que va entre 0 i 1 i que van canviant.
micVariable= map(vol,0,1,0,500); //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);
fill(micVariable-50,micVariable +225,micVariable); //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. El color variarà amb el micròfon, quan pujo la veu la variable mic disminuirà la intensitat del color vermell perquè li he restat 50 i augmentarà la intensitat del verd perquè li he sumat 225 i el color blau no variarà. No es pot posar micVariable en tots els colors perquè sortiria sempre la mateixa tonalitat de color.
ellipse(400,micVariable+50,400,300); //els dos primers paràmetres son el centre de la el·lipse, el primer és el centre de la "x" i el segon és el centre de la "y". El penúltim nombre és l'amplada de la el·lipse i l'últim és l'alçada de la el·lipse. La unitat que s'utilitza són els píxels. El penúltim nombre, en aquest cas, és una variable (mic) perquè la veu canvï l'amplada de la el·lipse.
//ull dret
fill("#ffffff");
ellipse(350,micVariable,25,25);
//ull esquerre
fill("#ffffff");
ellipse(450,micVariable,25,25);
//boca
fill("#E35656");
arc(400,micVariable+90,150,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 l'alçada. El cinquè i el sisè son com es veu l'arc, de 0 a PI, és una circumferència (la part de dalt, en aquest cas) i PI 0 és al contrari.
//celles
strokeWeight(8); //és el gruix del contorn de la el·lipse.
fill("#ffffff"); //en aquest cas les celles seràn de color negre perquè el nombre "FFFFFF" és el negre en el sistema hexadecimal.
line(325,225,250,250); //això és una línia i els dos primers números són els vèrtexs inicials i finals.
//celles
//strokeWeight(16);
//fill("#ffffff");
//line(510,215,610,240)
}
let mic,h;
//let micVariable = 100;
function setup(){
createCanvas(551,601);
mic = new p5.AudioIn();
mic.start();
}
function draw(){
x1=sin(frameCount*0.1)*40; //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 contínua: -1, -0.99, -0.98,... -0.01, 0, 0.01, 0.02,... 1, 0.99, 0.98,... 0.01, 0,... Multiplico per 40 el sinus perquè vagi des de -40 píxels fins a 40 píxels. frameCount serveix per contar fotogrames, 50 per seg. function draw es refresca 50 vegades per seg.
x2=cos(frameCount*0.1)*20;
background(255,255,255);
let vol = mic.getLevel();
h= map(vol,0,1,0,50);
fill("#EECC98")
beginShape(); //cap, comença una forma.
vertex(373,66+h);vertex(375,72+h);vertex(372,77+h);vertex(370,78+h);vertex(373,81+h);vertex(374,82+h);vertex(374,87+h);vertex(373,92+h);vertex(370,99+h);vertex(364,102+h);vertex(353,104+h);vertex(352,103+h);vertex(348,104+h);vertex(344,104+h);vertex(329,115+h);vertex(327,118+h);vertex(327,127+h);vertex(287,109+h);vertex(299,90+h);vertex(299,80+h);vertex(299,76+h);vertex(305,66+h);vertex(313,55+h);vertex(319,53+h);vertex(327,48+h);vertex(337,44+h);vertex(347,44+h);vertex(358,48+h);vertex(370,60+h);vertex(372,63+h);vertex(373,68+h);vertex(373,67+h); endShape(CLOSE); // tanca una forma.
fill("#EECC98")
beginShape(); //braç esquerre
vertex(258,131+x1*0.1);vertex(250,134+x1*0.1);vertex(244+x1*0.1);vertex(136+x1*0.2);vertex(238,139+x1*0.2);vertex(233,140+x1*0.2);vertex(228,140+x1*0.2);vertex(217,140+x1*0.2);vertex(212,142+x1*0.3);vertex(200,147+x1*0.3);vertex(187,152+x1*0.3);vertex(175,156+x1*0.3);vertex(166,157+x1*0.3);vertex(151,159+x1*0.3);vertex(144,160+x1*0.5);vertex(141,157+x1*0.5);vertex(133,154+x1*0.5);vertex(131,153+x1*0.5);vertex(127,151+x1*0.5);vertex(120,149+x1*0.5);vertex(114,146+x1*0.5);vertex(111,146+x1*0.5);vertex(109,149+x1*0.5);vertex(109,153+x1*0.5);vertex(112,155+x1*0.5);vertex(119,158+x1*0.5);vertex(123,159+x1*0.5);vertex(125,161+x1*0.5);vertex(125,164+x1*0.5);vertex(122,168+x1*0.5);vertex(116,170+x1*0.5);vertex(114,173+x1*0.5);vertex(113,176+x1*0.5);vertex(92,191+x1*0.5);vertex(91,199+x1*0.5);vertex(100,195+x1*0.5);vertex(101,193+x1*0.5);vertex(101,197+x1*0.5);vertex(106,196+x1*0.5);vertex(108,195+x1*0.5);vertex(116,190+x1*0.5);vertex(118,194+x1*0.5);vertex(121,195+x1*0.5);vertex(126,194+x1*0.5);vertex(127,192+x1*0.5);vertex(129,193+x1*0.5);vertex(130,194+x1*0.5);vertex(138,193+x1*0.5);vertex(147,190+x1*0.5);vertex(153,185+x1*0.3);vertex(158,182+x1*0.3);vertex(170,180+x1*0.1);vertex(182,178+x1*0.1);vertex(193,177+x1*0.1);vertex(203,176+x1*0.1);vertex(212,174+x1*0.1);vertex(224,173+x1*0.1);vertex(233,171+x1*0.1);vertex(237,168+x1*0.1);vertex(240,166+x1*0.1);vertex(257,132+x1*0.1); endShape(CLOSE);
fill("#EECC98")
beginShape(); //braç dreta
vertex(356,48+h);vertex(377,31);vertex(402,11);vertex(410,8);vertex(422,9);vertex(427,11);vertex(442,1);vertex(448,2);vertex(418,32);vertex(428,41);vertex(429,47);vertex(416,41);vertex(400,34);vertex(371,61+h);vertex(357,47+h); endShape(CLOSE);
fill("#EECC98")
beginShape(); //cama esquerra
vertex(348,292);vertex(349,222);vertex(361,227);vertex(381,227);vertex(396,225);vertex(421,218);vertex(437,218);vertex(452,212);vertex(453,186);vertex(465,168);vertex(489,144);vertex(496,139);vertex(489,134);vertex(488,124);vertex(499,114);vertex(509,110);vertex(513,102);vertex(518,95);vertex(518,89);vertex(528,87);vertex(535,91);vertex(535,119);vertex(530,136);vertex(522,146);vertex(514,157);vertex(492,211);vertex(486,236);vertex(478,247);vertex(466,254);vertex(427,268);vertex(395,279);vertex(369,288);vertex(348,293); endShape(CLOSE);
if(keyIsPressed) {
if((key == "r") || (key == "R")) {
fill("#D5A36B")
}
}else{
fill("#ffffff")
}
fill("#EECC98")
beginShape(); //cama dreta
vertex(268,290);vertex(349,294);vertex(333,317);vertex(310,340);vertex(283,365);vertex(248,392);vertex(238,399);vertex(221,424);vertex(212,440);vertex(198,454);vertex(133,494);vertex(131,499);vertex(129,517);vertex(123,522);vertex(104,522);vertex(64,542);vertex(55,543);vertex(54,538);vertex(58,534);vertex(59,531);vertex(63,524);vertex(64,520);vertex(75,511);vertex(85,498);vertex(106,480);vertex(133,462);vertex(174,423);vertex(190,407);vertex(198,392);vertex(204,379);vertex(205,380);vertex(207,372);vertex(210,373);vertex(213,364);vertex(255,306);vertex(261,304);vertex(267,289); endShape(CLOSE);
if(keyIsPressed) {
if((key == "p") || (key == "P")) {
fill("#EE98DE")
}
}else{
fill("#ffffff")
}
if(keyIsPressed) {
if((key == "r") || (key == "R")) {
fill("#E73D1B")
}
}else{
fill("#ffffff")
}
if(keyIsPressed) {
if((key == "b") || (key == "B")) {
fill("#000000")
}
}else{
fill("#ffffff")
}
beginShape(); //cos
vertex(286,109);vertex(285,114);vertex(274,118);vertex(264,127);vertex(242,137);vertex(246,162);vertex(239,168);vertex(236,191);vertex(236,226);vertex(242,244);vertex(259,278);vertex(267,289);vertex(349,294);vertex(349,222);vertex(341,218);vertex(327,219);vertex(314,211);vertex(311,196);vertex(315,178);vertex(323,166);vertex(326,150);vertex(328,133);vertex(327,126);vertex(287,109); endShape(CLOSE);
}
El projecte Theremin consisteix en connectar 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.