Polyfoniska köket (6 / 8 steg)
Steg 6: Koden: bearbetning
Zip-filen har båda datafilerna (ljudklipp) och bearbetning skissen i rätt mapphierarki så bara ladda ner zip-filen, extrahera mappen med dess som innehåller filer ut och öppna upp bearbetning skissen! (Om något hände det, se bara till att både mappen och filen .pde är inne i mappen med samma namn som filen .pde.)
Anteckningar om koden:
1) den seriella porten definieras i den här koden måste matcha den seriella porten du har anslutit din Arduino att. I setup-funktionen, ställer vi in variabla porten till en seriell objekt som representerar den port som används för att läsa data. För närvarande, det är satt till den första tillgängliga porten, men om det inte fungerar, ändra det andra argumentet till namnet på den port som din Arduino är ansluten till.
2) vi har i förväg två genrer av musik. Om du vill växla mellan två, måste du ställa in i varierande tempo och räkna till rätt nummer enligt definitionen i kommentarerna.
Bearbetar koden:
/*
Polyfoniska köket
Sara Montoro
Karl Landin
Alice Lee
Noah Pitts
University of California, Berkeley
CNM290/CS294-85
Kritiska göra: Material, protokoll och kultur
Lämna oss en kommentar om du har förslag och andra idéer!
*/
import processing.serial.*;
import ddf.minim.*;
int [] mag = {0,0,0,0}.
int [] pot = {0,0,0,0,0}. Potentiometrar lagras inte i ordning. I mitten
ansluten till pin A3 är faktiskt matas in följetongen efter
alla de andra potentiometrar. Det kommer att bli det sista värdet av
denna array (pot[4]).
float volumeCab;
int mot = 0; rörelsesensor. (används inte)
int keps;
ljudfiler
String [] låtar;
String [] reggae = {"t75bass1.wav","t75drums1.wav","t75horn1.wav","t75guitar1.wav","t75keys1.wav","t75synth1.wav","t75vocals1.wav","t75backup1.wav"};
String [] flamenco = {"t120bass1.wav", "t120drums1.wav", "t120guitar1.wav", "t120guitarSolo1.wav", "t120percusA1.wav", "t120percusB1.wav", "t120piano1.wav", "t120vocals1.wav"};
booleska minimStarted = false;
Om du vill välja en annan genre, ändra den nedan två variabler med dem på den musik du vill.
REGGAE, tempo = 75, count = 1
FLAMENCO, tempo = 120, count = 1
int tempo = 75.
int count = 1;
int slå, beatSum, lastMillis, fel, mspb, bps;
Seriell port;
Minim minim;
AudioPlayer [] spelare = nya AudioPlayer [8].
void setup() {
mspb = antal * 60000/tempo;
bps = tempo/60.
storlek (512, 200, P3D);
Observera: det andra argumentet i denna uppmaning skall namnet på serieporten som
din Arduino kommunicerar med datorn via. (På din Arduino skiss,
gå till Verktyg > Serial Port. Den markerade porten är den din Arudino använder.)
Om du vill se en lista över tillgängliga portar, kommentera bort den under linjen.
println(Serial.list());
Port = ny följetong (denna, Serial.list() [0], 9600);
att kunna nå datakatalogen
Minim = nya Minim(this);
Switch(tempo) {
fallet 100:
println ("Tempo: 100 - nr Media tillgängliga"); tempo = 100
bryta;
fall 120:
FLAMENCO temp = 120
låtar = flamenco;
bryta;
fall 140:
println ("Tempo: 140 - nr Media tillgängliga"); tempo = 140
bryta;
REGGAE tempo = 75
fall 75:
låtar = reggae;
bryta;
}
loadfiles från datamappen och mappen skiss
för (int x = 0; x < songs.length; x ++) {
spelare [x] = minim.loadFile(songs[x]);
}
Begära värden direkt
port.write(65);
för (int jag = 0; jag < 4; i ++) {
Players[i].loop();
Players[i].setGain(-80);
}
Minim.start(this);
}
void draw() {
Background(0);
stroke(255);
frameRate(120);
Ändra volymen på spisen
för (int jag = 0; jag < 4; i ++) {
Players[i].setGain(Map(float(Pot[i]),0,1023,-80,14));
}
volumeCab = map(float(pot[4]),0,1023,-80,14);
för (int jag = 0; jag < 4; i ++) {
Players[i+4].setGain(volumeCab);
}
hålla musikalisk tid
IF(Millis() > = lastMillis + mspb) {
lastMillis = millis ()-6.
IF(Beat == 32) {
slå = 0;
}
fel = lastMillis % mspb;
Print(Beat);
skriva ut ("," + beatSum);
println (", fel:" + fel + "ms");
för (int jag = 0; jag < 4; i ++) {
om (mag [i] == 1 & &! players[i+4].isPlaying()) {
spelare [1 + 4] .setLoopPoints (0, 5);
Players[i+4].Play(0);
println ("spelare" (jag + 4) + "bara sovit");
}
Players[i+4].setGain(volumeCab);
}
Lägg till att slå räknas
slå = slå + count;
beatSum = beatSum + count;
println ("cap:" + Integer.toString(cap));
}
}
Stäng alla ljudspelare och minim
void stop() {
för (AudioPlayer p: spelare) {
p.Close();
}
Minim.stop();
Super.stop();
}
anropas när det finns något availble att läsa
void serialEvent(Serial port) {
Läsa data
Sträng input = port.readStringUntil('*');
om (input! = null) {
Skarva strängen i en matris av heltal
int [] vals = int (splitTokens (ingång, ", *"));
kolla alla värden finns
om (vals.length! = 10) {
println ("fel: bara fått" + vals.length + "värderingar.");
hemkomst.
}
Tas värdena i variablerna
om (cap! = int(vals[0])) {
Cap = int(vals[0]);
Starta/stoppa minim
}
för (int jag = 1; jag < = 5; i ++) {
om (pot [i-1]! = vals[i]) {
Se upp! Mellersta potentiometern skrivs ut sista och kommer att potten [4]
eftersom det var ugnen i vår prototyp och inte en spisen brännare som den
övriga 4 potentionmeters
potten [i-1] = vals [i];
}
}
för (int jag = 6; jag < = 9; i ++) {
om (mag [i-6]! = vals[i]) {
mag [i-6] = vals [i];
}
}
}
handskakning
port.write(65);
}