5Square — Final Project, PComp + ICM

5Square

Make your own Music

Collaborators:

Amena Hayat

Max Horwich

Arnav Wagh

Please click the link to go to my previous blog post for the final project proposal:

GESTURAL GRAPHIC INTERFACE

 

 This project consists of
1. code in Tone.js library
2. animations for visuals
3. a glove that adds effects to music
———————————————————————————————–

Tone.js is a framework for creating interactive music in the browser. It provides advanced scheduling capabilities, synths and effects, and intuitive musical abstractions built on top of the Web Audio API.

We used Tone.js to create a musical interface that is easy, fun, interactive and engaging. The intended audience is a non-musician who wants to create music.

CODE

kickOn = false;
snareOn = false;
pianoOn = false;
bassOn = false;

//var upstate = false;
cChordPlaying = false;
fChordPlaying = false;
gChordPlaying = false;
amChordPlaying = false;

cBassPlaying = false;
fBassPlaying = false;
gBassPlaying = false;
amBassPlaying = false;

var serial;
var flex1 = 0,
flex2 = 0,
flex3 = 0;
flex4 = 0;

var pianoAnimation = false;

//KICK SOUND DEFINED
var kick = new Tone.MembraneSynth({
“envelope”: {
“sustain”: 0,
“attack”: 0.02,
“decay”: 0.8
},
“octaves”: 10
}).toMaster();

//KICK LOOP SET
var kickPart = new Tone.Loop(function(time) {
kick.triggerAttack(“C2”);
}, “2n”);

//SNARE FILTER
var snareFilter = new Tone.AutoFilter({
frequency: 1,
type: “sine”,
depth: 1,
baseFrequency: 400,
octaves: 2.6,
filter: {
type: “bandpass”,
rolloff: -12,
Q: 1
}
}).toMaster();

//SNARE SOUND DEFINED
var snare = new Tone.MetalSynth({
volume: -10,
frequency: 60,
envelope: {
attack: 0.001,
decay: 0.4,
release: 0.2
},
harmonicity: 5.1,
modulationIndex: 1,
resonance: 800,
octaves: 1.5
}).connect(snareFilter);

//SNARE LOOP SET
var snarePart = new Tone.Sequence(function(time, freq) {
snare.frequency.setValueAtTime(freq, time, Math.random() * 0.5 + 0.5);
snare.triggerAttack(time);
}, [null, 350, null, 350], “2n”);

//PIANO DELAY
var pianoDelay = new Tone.PingPongDelay({
“delayTime”: “4t”,
“maxDelayTime”: 2,
“wet”: .3,
“feedback”: .1
}).toMaster();

//PIANO TONE DEFINED
var piano = new Tone.MonoSynth(4, Tone.Synth, {
“volume”: -7,
“oscillator”: {
“partials”: [1, 2, 1],
},
“envelope”: {
“attack”: 0.001,
“decay”: 0.1,
“sustain”: 0.3,
“release”: 1
},
“portamento”: 0.001
}).connect(pianoDelay);

//PIANO CHORDS DEFINED
/*
var cChord = [“C4”, [“E4”, “G4”]];
var gChord = [[“B3”, “D4”], “G4”];
var amChord = [[“C4”, “E4”], “A4”];
var fChord = [[“C4”], “F4”, [“A4”]];
*/
var cChord = [“C4”, “E4”, “G4”];
var gChord = [“B3”, “D4”, “G4”];
var amChord = [“C4”, “E4”, “A4”];
var fChord = [“C4”, “F4”, “A4”];

var ellipseCoord = {};

//PIANO LOOP SET

var pianoPart = new Tone.Sequence(function(time, note) {
piano.triggerAttackRelease(note, “16n”, time);
//SEQUENCE OF CHORDS
}, [cChord]);
//pianoPart.probability = 0.5;

//Bass FFT & waveform
var fft = new Tone.FFT(32);
var spectrum = new Tone.Waveform(1024);

var bassDist = new Tone.Distortion({
“distortion”: 0.4,
“oversample”: ‘2x’
}).connect(spectrum).toMaster();

//BASS TONE DEFINED
var bass = new Tone.MonoSynth({
“volume”: -10,
“envelope”: {
“attack”: 0.1,
“decay”: 0.3,
“release”: 2,
},
“filterEnvelope”: {
“attack”: 0.001,
“decay”: 0.01,
“sustain”: 0.5,
“baseFrequency”: 200,
“octaves”: 2.6
}
}).connect(bassDist);

//BASS LOOP SET
var bassPart = new Tone.Sequence(function(time, note) {
bass.triggerAttackRelease(note, “16n”, time);
//SEQUENCE OF BASS NOTES
}, [“C2”]);
//bassPart.probability = 0.5;

//LEAD DELAY
var leadDelay = new Tone.PingPongDelay({
“delayTime”: “8n”,
“maxDelayTime”: 1,
“feedback”: 0.82,
“wet”: .40

}).toMaster();

//LEAD TONE DEFINED
var leadPaint = new Tone.PolySynth({
“volume”: -10,
“oscillator”: {
“type”: “square”
},
“envelope”: {
“attack”: 0.2
},
“portamento”: 0.05

}).connect(leadDelay);

//FX SENDS
var delayKickSend = kick.send(“delayKick”, -Infinity);
var delaySnareSend = snare.send(“delaySnare”, -Infinity);
var crushSend = piano.send(“crush”, -Infinity);
var chebySend = bass.send(“cheby”, -Infinity);

var delayKick = new Tone.FeedbackDelay(“4t”, 0.38)
.receive(“delayKick”)
.toMaster();
var delaySnare = new Tone.FeedbackDelay(“8t”, 0.25)
.receive(“delaySnare”)
.toMaster();
var crushPiano = new Tone.BitCrusher(4)
.receive(“crush”)
.toMaster();
var chebyBass = new Tone.Chebyshev(10)
.receive(“cheby”)
.toMaster();

//SLOWEST POSSIBLE TEMPO
//ALL OTHERS ARE SET AS MULTIPLE OF THIS
//
Tone.Transport.bpm.value = 60;

//HIT IT!!!
Tone.Transport.start();

//—————————————————————-
//BEGINNING OF SETUP

function setup() {
createCanvas(windowWidth, windowWidth/2);
background(230);

serial = new p5.SerialPort();
serial.on(‘list’, printList);
serial.on(‘data’, serialEvent);
serial.list();
serial.open(“/dev/cu.usbmodem1431”);
//ALWAYS CHECK IF USB PORT IS CORRECT FOR YOUR PERSONAL LAPTOP

sliderKick = createSlider(1, 6, 2);
sliderKick.position(5, height + 20);
sliderKick.size(width / 4 – 10, 10);
sliderBass = createSlider(1, 4, 1);
sliderBass.position(width / 4 + 5, height + 40);
sliderBass.size(width / 4 – 10, 10);
sliderPiano = createSlider(1, 4, 1);
sliderPiano.position(width / 4 + 5, height + 20);
sliderPiano.size(width / 4 – 10, 10);
sliderSnare = createSlider(1, 6, 2);
sliderSnare.position(5, height + 40);
sliderSnare.size(width / 4 – 10, 10);
//leadDelayPaint = createSlider(1,6,1);

sliderFX1 = createSlider(-100,0,-100);
sliderFX1.position(5, height+60);
sliderFX1.size(width/4-10, 10);
sliderFX2 = createSlider(-100,0,-100);
sliderFX2.position(5, height+80);
sliderFX2.size(width/4-10, 10);
sliderFX3 = createSlider(-100,0,-100);
sliderFX3.position(5, height+100);
sliderFX3.size(width/4-10, 10);
sliderFX4 = createSlider(-100,0,-100);
sliderFX4.position(5, height+120);
sliderFX4.size(width/4-10, 10);

ellipseCoord.c = [width/16, (height/2)*0.2, width/8, (height/2)*0.2, width/5.33, (height/2)*0.2];
ellipseCoord.g = [width/16, (height/2)*0.4, width/8, (height/2)*0.4, width/5.33, (height/2)*0.4];
ellipseCoord.am = [width/16, (height/2)*0.6, width/8, (height/2)*0.6, width/5.33, (height/2)*0.6];
ellipseCoord.f = [width/16, (height/2)*0.8, width/8, (height/2)*0.8, width/5.33, (height/2)*0.8];

// ellipseCoord.c = [80, 80, 160, 80, 240, 80];
// ellipseCoord.g = [80, 80 + 55, 160, 80 + 55, 240, 80 + 55];
// ellipseCoord.am = [80, 80 + 110, 160, 80 + 110, 240, 80 + 110];
// ellipseCoord.f = [80, 80 + 165, 160, 80 + 165, 240, 80 + 165];

}

//END OF SETUP
//—————————————————————-
//BEGIN OF DRAW
function draw() {

var kickPulse = kickPart.progress;
var snarePulse = snarePart.progress;
var pianoPulse = pianoPart.progress;
var bassPulse = bassPart.progress;
var loopstate = pianoPart.state;

var pp = map(pianoPulse, 0, 1, 0.5, 1.1);
var pt = map(snarePulse, 0, 0.3, 1, 1.2);
var pg = map(snarePulse, 0, 1, 1, 0.5);
var pf = map(snarePulse, 0, 1, 1, 0.2);

kickSwellOuter = map(kickPulse, 0, 1, 0, (width / 4.57)/35);
kickSwellMiddle = map(kickPulse, 0, 1, 0, (width / 5.33)/9);
kickSwellInner = map(kickPulse, 0, 1, 0, (width / 6.66)/3);

alphaOuter = map(kickSwellOuter, 0, 5, 50, 20);
alphaMiddle = map(kickSwellMiddle, 0, 16.7, 90, 30);

var wave = spectrum.getValue();
var fftwave = fft.getValue();

// fill(0);
// stroke(0);
// strokeWeight(2)
// //rect(width / 4, 0, width / 4, height / 2);
// rect(0,width,0,height);

//—————————–ANimations———————————
//KICK CIRCLE
push();
translate(0, 0);
fill(225);
noStroke();
rect(0, 0, width / 4, height / 2);
noFill();
ellipseMode(CENTER);

stroke(135, 206, 250, alphaOuter);
strokeWeight(2);
ellipse(width / 8, height / 4, width / 4.57 + (kickSwellOuter * -1));

stroke(135, 206, 250, alphaMiddle);
strokeWeight(2);
ellipse(width / 8, height / 4, width / 5.33 + (kickSwellMiddle * -1));

stroke(135, 206, 250);
strokeWeight(2);
ellipse(width / 8, height / 4, width / 6.66 + (kickSwellInner * -1));
//print(width/4-80);

pop();

//BASS SQUARE
beginShape();
push();
translate(width * 3 / 8, height * 3 / 4);
noStroke();
fill(225);
rect(0 – (width / 8), 0 – (height / 4), width / 4, height / 2)
//rect(0, 0, width / 4, height / 2)
beginShape();
noFill();
stroke(255, 100, 0); // waveform is red
strokeWeight(2);
rectMode(CENTER)
for (var i = 0; i < wave.length; i += 600) {
//var a = map(i, 0, wave.length, -3, 3);
var b = map(wave[i], -1, 1, -40, 40);
rect(0, 0, width / 6.15 + b, height / 3.07 + b);
}
pop();
endShape();

//PIANO TRIANGLE
push();
translate(width * 1 / 8, height/1.25);
print(height*1.25)
noStroke();
fill(225);
rect(0 – (width / 8), 0 – (height*0.25+height*0.05), width / 4, height / 2)
scale(pg);
stroke(255);
point(0, 0)
noFill();
strokeWeight(1);
triangle(width/-11.42, height/9.83, 0, height/-4.917, width/11.42, height/9.83);
//triangle(-70, 40.67, 0, -81.35, 70, 40.67); //for 800/400
pop();

//SLIDERS FOR TEMPO OF DIFFERENT INSTRUMENTS
//PLAYBACK RATE MULTIPLIES TEMPO FOR THAT PART
kickPart.playbackRate = sliderKick.value();
snarePart.playbackRate = sliderSnare.value();

// sliderKick.value(map(flex1, 0, 250, 1, 6));
// sliderSnare.value(map(flex1, 0, 250, 1, 6));
// sliderPiano.value(map(flex2, 0, 250, 1, 4));
// sliderBass.value(map(flex2, 0, 250, 1, 4));
// a = map(flex3, 0, 250, 0.1, 0.9);

push();
translate(width*0.25,0);
fill(225);
noStroke(0);
rect(0,0,width*0.25,height/2);
pop();

if (pianoAnimation == true) {
animateEllipseC(pianoPulse);
}
if (pianoAnimation == true) {
animateEllipseG(pianoPulse);
}
if (pianoAnimation == true) {
animateEllipseAM(pianoPulse);
}
if (pianoAnimation == true) {
animateEllipseF(pianoPulse);
}

//PIANO CHORD SLIDER
if (sliderPiano.value() == 1) {
if (cChordPlaying == false) {
//console.log(“inside value 1”);
pianoPart.removeAll();
pianoPart.add(0, cChord);
cChordPlaying = true;
fChordPlaying = false;
gChordPlaying = false;
amChordPlaying = false;
}
} else if (sliderPiano.value() == 2) {
if (fChordPlaying == false) {
pianoPart.removeAll();
pianoPart.add(0, fChord);
cChordPlaying = false;
fChordPlaying = true;
gChordPlaying = false;
amChordPlaying = false;
}
} else if (sliderPiano.value() == 3) {
if (gChordPlaying == false) {
pianoPart.removeAll();
pianoPart.add(0, gChord);
cChordPlaying = false;
fChordPlaying = false;
gChordPlaying = true;
amChordPlaying = false;
}
} else if (sliderPiano.value() == 4) {
if (amChordPlaying == false) {
pianoPart.removeAll();
pianoPart.add(0, amChord);
cChordPlaying = false;
fChordPlaying = false;
gChordPlaying = false;
amChordPlaying = true;
}
}

//BASS NOTE SLIDER
if (sliderBass.value() == 1) {
if (cBassPlaying == false) {
bassPart.remove(0);
bassPart.add(0, “C2”);
cBassPlaying = true;
fBassPlaying = false;
gBassPlaying = false;
amBassPlaying = false;
}
} else if (sliderBass.value() == 2) {
if (fBassPlaying == false) {
bassPart.remove(0);
bassPart.add(0, “F2”);
cBassBassPlaying = false;
fBassBassPlaying = true;
gBassBassPlaying = false;
amBassBassPlaying = false;
}
} else if (sliderBass.value() == 3) {
if (gBassPlaying == false) {
bassPart.remove(0);
bassPart.add(0, “G1”);
cBassPlaying = false;
fBassPlaying = false;
gBassPlaying = true;
amBassPlaying = false;
}
} else if (sliderBass.value() == 4) {
if (amBassPlaying == false) {
bassPart.remove(0);
bassPart.add(0, “A1”);
cBassPlaying = false;
fBassPlaying = false;
gBassPlaying = false;
amBassPlaying = true;
}
}

//FLEXER FX
delayKickSend.gain.value = sliderFX1.value();
delaySnareSend.gain.value = sliderFX2.value();
crushSend.gain.value = sliderFX3.value();
chebySend.gain.value = sliderFX4.value();

sliderFX1.value(map(flex1,310,400,-100,0));
sliderFX2.value(map(flex2,270,390,-100,0));
sliderFX3.value(map(flex3,230,340,-100,0));
sliderFX4.value(map(flex4,300,370,-100,0));

//RIGHT SIDE DRAWING
if (mouseX > width / 2 && mouseX < width &&
mouseY > 0 && mouseY < width) {
if (mouseIsPressed) {
for (i = 0; i < 15; i++) {
noStroke();
fill(255, 0, 0);
//fill(255, 100 + i * 3, 100 + i * 5, 255 / i);
ellipse(mouseX, mouseY, i, i);
}
}

//SLOW FADE
fill(230,15);
noStroke();
rect(width / 2, 0, width / 2, height);

//ERASE DRAWING AND KILL LEAD
if (keyIsPressed) {
fill(230);
rect(width / 2, 0, width / 2, height);
leadPaint.triggerRelease();
}

}
}

//END OF DRAW MODE
//—————————————-
//BEGINNING OF FUNCTIONS

function animateEllipseC(pianoPulse) {
//console.log(“inside chordAnimation”);
if (sliderPiano.value() == 1) {
var coord = ellipseCoord.c;
//console.log(coord);
var index = 0;
if (pianoPulse > 0 && pianoPulse < 0.3) {
index = 0;
} else if (pianoPulse > 0.3 && pianoPulse < 0.6) {
index = 2;
} else if (pianoPulse > 0.6) {
index = 4;
}
push();
translate(width / 4, 0)
point(0, 0)
fill(200, 50)
fill(124, 225, 0, 200);
noStroke();
var pp = map(pianoPulse, 0, 1, 0.5, 1.1);
ellipse(coord[index], coord[index + 1], pp*60, pp*60);
pop();
}
}

function animateEllipseF(pianoPulse) {
//console.log(“inside chordAnimation”);
if (sliderPiano.value() == 2) {
var coord = ellipseCoord.f;
//console.log(coord);
var index = 0;
if (pianoPulse > 0 && pianoPulse < 0.3) {
index = 0;
} else if (pianoPulse > 0.3 && pianoPulse < 0.6) {
index = 2;
} else if (pianoPulse > 0.6) {
index = 4;
}
push();
translate(width / 4, 0)
point(0, 0)
fill(200, 50)
fill(140, 180, 121, 200);
noStroke();
var pp = map(pianoPulse, 0, 1, 0.5, 1.1);
ellipse(coord[index], coord[index + 1], pp*80, pp*80);
pop();
}
}

function animateEllipseG(pianoPulse) {
//console.log(“inside chordAnimation”);
if (sliderPiano.value() == 3) {
var coord = ellipseCoord.g;
//console.log(coord);
var index = 0;
if (pianoPulse > 0 && pianoPulse < 0.3) {
index = 0;
} else if (pianoPulse > 0.3 && pianoPulse < 0.6) {
index = 2;
} else if (pianoPulse > 0.6) {
index = 4;
}
push();
translate(width / 4, 0)
point(0, 0)
fill(200, 50)
fill(100, 120, 190, 200);
noStroke();
var pp = map(pianoPulse, 0, 1, 0.5, 1.1);
ellipse(coord[index], coord[index + 1], pp*40, pp*40);
pop();
}
}

function animateEllipseAM(pianoPulse) {
//console.log(“inside chordAnimation”);
if (sliderPiano.value() == 4) {
var coord = ellipseCoord.am;
//console.log(coord);
var index = 0;
if (pianoPulse > 0 && pianoPulse < 0.3) {
index = 0;
} else if (pianoPulse > 0.3 && pianoPulse < 0.6) {
index = 2;
} else if (pianoPulse > 0.6) {
index = 4;
}
push();
translate(width / 4, 0)
point(0, 0)
fill(200, 50)
fill(90, 100, 60, 200);
noStroke();
var pp = map(pianoPulse, 0, 1, 0.5, 1.1);
ellipse(coord[index], coord[index + 1], pp*50, pp*50);
pop();
}
}

//DRAG TO PLAY FUNCTION
function touchMoved() {
var paintNote = [“C4”, “E4”, “G4”, “A4”, “C5”, “E5”, “G5”, “A5”, “C6”]

//right side of canvas
if (mouseX > width / 2 && mouseX < width &&
mouseY > 0 && mouseY < height) {

//————NOTE GRID!!!
//column1
if (mouseX > width / 2 && mouseX < width * 5 / 8 &&
mouseY < height && mouseY > height * 3 / 4) {
leadPaint.triggerAttackRelease(paintNote[0], “8n”);
} else if (mouseX > width / 2 && mouseX < width * 5 / 8 &&
mouseY < height * 3 / 4 && mouseY > height / 2) {
leadPaint.triggerAttackRelease(paintNote[1], “8n”);
} else if (mouseX > width / 2 && mouseX < width * 5 / 8 &&
mouseY < height / 2 && mouseY > height / 4) {
leadPaint.triggerAttackRelease(paintNote[2], “8n”);
} else if (mouseX > width / 2 && mouseX < width * 5 / 8 &&
mouseY < height / 2 && mouseY > 0) {
leadPaint.triggerAttackRelease(paintNote[3], “8n”);
//column2
} else if (mouseX > width * 5 / 8 && mouseX < width * 3 / 4 &&
mouseY < height && mouseY > height * 3 / 4) {
leadPaint.triggerAttackRelease(paintNote[1], “8n”);
} else if (mouseX > width * 5 / 8 && mouseX < width * 3 / 4 &&
mouseY < height * 3 / 4 && mouseY > height / 2) {
leadPaint.triggerAttackRelease(paintNote[2], “8n”);
} else if (mouseX > width * 5 / 8 && mouseX < width * 3 / 4 &&
mouseY < height / 2 && mouseY > height / 4) {
leadPaint.triggerAttackRelease(paintNote[3], “8n”);
} else if (mouseX > width * 5 / 8 && mouseX < width * 3 / 4 &&
mouseY < height / 4 && mouseY > 0) {
leadPaint.triggerAttackRelease(paintNote[4], “8n”);
//column3
} else if (mouseX > width * 3 / 4 && mouseX < width * 7 / 8 &&
mouseY < height && mouseY > height * 3 / 4) {
leadPaint.triggerAttackRelease(paintNote[2], “8n”);
} else if (mouseX > width * 3 / 4 && mouseX < width * 7 / 8 &&
mouseY < height * 3 / 4 && mouseY > height / 2) {
leadPaint.triggerAttackRelease(paintNote[3], “8n”);
} else if (mouseX > width * 3 / 4 && mouseX < width * 7 / 8 &&
mouseY < height / 2 && mouseY > height / 4) {
leadPaint.triggerAttackRelease(paintNote[4], “8n”);
} else if (mouseX > width * 3 / 4 && mouseX < width * 7 / 8 &&
mouseY < height / 4 && mouseY > 0) {
leadPaint.triggerAttackRelease(paintNote[5], “8n”);
//column4
} else if (mouseX > width * 7 / 8 && mouseX < width &&
mouseY < height && mouseY > height * 3 / 4) {
leadPaint.triggerAttackRelease(paintNote[3], “8n”);
} else if (mouseX > width * 7 / 8 && mouseX < width &&
mouseY < height * 3 / 4 && mouseY > height / 2) {
leadPaint.triggerAttackRelease(paintNote[4], “8n”);
} else if (mouseX > width * 7 / 8 && mouseX < width &&
mouseY < height / 2 && mouseY > height / 4) {
leadPaint.triggerAttackRelease(paintNote[5], “8n”);
} else if (mouseX > width * 7 / 8 && mouseX < width &&
mouseY < height / 4 && mouseY > 0) {
leadPaint.triggerAttackRelease(paintNote[6], “8n”);
}
}

// print(flex1);
}

//CLICK 2 PLAY FUNCTION
function mousePressed() {
if (mouseX > 0 && mouseX < width / 4 &&
mouseY > 0 && mouseY < height / 2) {
loopKick();
} else if (mouseX > width / 4 && mouseX < width / 2 &&
mouseY > 0 && mouseY < height / 2) {
loopPiano();
pianoAnimation = true;
} else if (mouseX > 0 && mouseX < width / 4 &&
mouseY > height / 2 && mouseY < height) {
loopSnare();
} else if (mouseX > width / 4 && mouseX < width / 2 &&
mouseY > height / 2 && mouseY < height) {
loopBass();
}
}

//LOOP FUNCTIONS
function loopKick() {
if (!kickOn) {
kickPart.start(0);
kickOn = !kickOn;
} else {
kickPart.stop();
kickOn = !kickOn;
}
}

function loopSnare() {
if (!snareOn) {
snarePart.start(0);
snarePart.loop = true;
snareOn = !snareOn;
} else {
snarePart.loop = false;
snareOn = !snareOn;
}
}

function loopPiano() {
if (!pianoOn) {
pianoPart.start(0);
pianoPart.loop = true;
pianoOn = !pianoOn;
} else {
pianoPart.loop = false;
pianoOn = !pianoOn;
}
}

function loopBass() {
if (!bassOn) {
bassPart.start(0);
bassPart.loop = true;
bassOn = !bassOn;
} else {
bassPart.loop = false;
bassOn = !bassOn;
}
}

function printList(portList) {
for (var i = 0; i < portList.length; i++) {
print(i + ” ” + portList[i]);
}
}

function serialEvent() {
var stringFromSerial = serial.readLine();
if (stringFromSerial.length > 0) {
var trimmedString = trim(stringFromSerial);
var myArray = split(trimmedString, “,”)
flex1 = Number(myArray[0]);
flex2 = Number(myArray[1]);
flex3 = Number(myArray[2]);
flex4 = Number(myArray[3]);
}
}

document.ontouchmove = function(event){
event.preventDefault();

}

ANIMATIONS

BEAT

BASS

PIANO

SNARE

LEAD MELODY

 

THE SKETCH

Click around and draw on the fifth square!

GLOVE

To make the glove, we used Adafruit Flora. FLORA is Adafruit’s fully-featured wearable electronics platform. It’s a round, sewable, Arduino-compatible microcontroller designed to empower  wearables.

Diagram 1: Sensor position on the glove

Arduino Code:

Diagram 2: Circuit for the glove

Initial testing

Serial communication from breadboard circuit:

Soldering:

Using potentiometers for controls for user testing

—————————————————————————

5square

performed by Max Horwich

enjoy

 

Leave a Reply

Your email address will not be published. Required fields are marked *