Arduino Vocal effekter Box (36 / 36 steg)
Steg 36: Slutliga firmware
Slutliga effekter Rutkod
av Amanda Ghassaei
Aug 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
/*
krukor:
våt/torr
kornstorlek
pitch shift
*/
ljud lagring
byte buffer1 [500];
byte buffer2 [500];
buffert inspelning variabler
booleska växla = 0;
booleska rec = 1;
potten kontrollera lagring
int skala = 20;
int scalePot;
int newScale = skala.
byte multiplikator = 0;
int korn = 500.
int grainPot;
int newGrain = korn;
int wetDryPot;
int våt = 16.
int torr = 16-blöta;
int newWetDry = våt;
data hämtning variabler
unsigned int jag = 0; //index variabel
int iscale = 0; //index variabel
int iscalerev = korn-1;
Clipping indicator variabler
booleska klippning;
int clippingCounter = 5000;
omvänd switch variabler
booleska framåt = 0;
booleska newForward = framåt.
void setup() {
DDRD = 0xFE; //set digital stift 0-7 som resultat
DDRB = 0xFD; //set digital stift 10-13 som utgångar, 9 som indata
DDRC = 0x00; //set alla analoga pins som insatsvaror
(CLI); //diable avbrott
Ställ in kontinuerlig provtagning av analoga pin 0
Rensa ADCSRA och ADCSRB register
ADCSRA = 0;
ADCSRB = 0;
ADMUX = 0; //Clear ADMUX registrera
ADMUX | = (1 << REFS0); ange referens spänning
ADMUX | = (1 << ADLAR); Vänsterjustera ADC värde - så jag kan läsa högst 8 bitar från ADCH register endast
eftersom jag läser A0, jag behöver inte att precisera vilken analog pin jag vill läsa från (0 är standard)
ADCSRA | = (1 << ADPS2) | (1 << ADPS0); ställa in ADC klockan med 32 prescaler - 16mHz/32 = 500 kHz
ADCSRA | = (1 << ADATE); enabble automatisk utlösare
ADCSRA | = (1 << Ebba Grön); Aktivera avbrott när mätningen är klar
ADCSRA | = (1 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
SEI (); //enable avbrott
}
ISR(ADC_vect) {//when nya ADC värdet redo
om (rec) {
om (växla) {
buffer1 [i] = ADCH; //store inkommande
om (ADCH == 0 || ADCH == 1023) {//if klippning
PORTB | = 32. //set stift 13 hög
clippingCounter = 5000; //reset klippning counter
klippningen = 1; //currently klippning
}
om (framåt) {//forward
PORTD = (wet*int(buffer2[iscale])+dry*int(ADCH)) >> 4; //send ut DAC
}
annat {//reverse
PORTD = (wet*int(buffer2[iscalerev])+dry*int(ADCH)) >> 4; //send ut DAC
}
}
annat {
buffer2 [i] = ADCH; //store inkommande
om (ADCH == 0 || ADCH == 1023) {//if klippning
PORTB | = 32. //set stift 13 hög
clippingCounter = 5000; //reset klippning counter
klippningen = 1; //currently klippning
}
om (framåt) {
PORTD = (wet*int(buffer1[iscale])+dry*int(ADCH)) >> 4; //send ut DAC
}
annat {
PORTD = (wet*int(buffer1[iscalerev])+dry*int(ADCH)) >> 4; //send ut DAC
}
}
}
annat {
om (växla) {
om (framåt) {
PORTD = (wet*int(buffer2[iscale])+dry*int(ADCH)) >> 4; //send ut DAC
}
annat {
PORTD = (wet*int(buffer2[iscalerev])+dry*int(ADCH)) >> 4; //send ut DAC
}
}
annat {
om (framåt) {
PORTD = (wet*int(buffer1[iscale])+dry*int(ADCH)) >> 4; //send ut DAC
}
annat {
PORTD = (wet*int(buffer1[iscalerev])+dry*int(ADCH)) >> 4; //send ut DAC
}
}
}
i ++; //increment jag
iscale = jag * 10/skala-korn * multiplikator;
iscalerev = korn-iscale-1;
om (jag == korn) {
REC = 0; //stop inspelning
}
om (jag > =(grain*scale/10)) {
om (skala < 10) {
om (jag == korn) {
Jag = 0;
iscale = 0;
iscalerev = korn-1;
framåt = newForward; //update riktning
skala = newScale; //update skala
spannmål = newGrain; //update korn
torr = newWetDry; //update vått torrt
våt = 16-torr;
Toggle ^ = 1; //try ta bort detta
REC = 1;
multiplikator = 0;
}
annars om (iscale > = korn) {
iscale = 0;
iscalerev = korn-1;
multiplikatorn ++;
}
}
annat {
Jag = 0;
iscale = 0;
iscalerev = korn-1;
framåt = newForward; //update riktning
skala = newScale; //update skala
spannmål = newGrain; //update korn
torr = newWetDry; //update vått torrt
våt = 16-torr;
Toggle ^ = 1; //try ta bort detta
REC = 1;
multiplikator = 0;
}
}
om (klippning) {
clippingCounter--, //decrement klippning counter
}
}
void checkScale() {
PORTB & = 251; //set stift 10 låg
scalePot = 0;
While(digitalRead(10)) {
scalePot ++;
}
newScale = scalePot + 2.
}
void checkGrainSize() {
PORTB & = 247; //set stift 11 låg
grainPot = 0;
While(digitalRead(11)) {
grainPot ++;
}
om (grainPot < 1) {
grainPot = 1;
}
annars om (grainPot > 20) {
grainPot = 20;
}
newGrain = grainPot * 25;
}
void checkWetDry() {
PORTB & = 239; //set stift 12 låg
wetDryPot = 0;
While(digitalRead(12)) {
wetDryPot ++; //from 0 till ~ 185
}
om (wetDryPot < 10) {
wetDryPot = 0;
}
annars om (wetDryPot > 160) {
wetDryPot = 160;
}
newWetDry = wetDryPot/10; //scale ner till 16
}
void checkRev() {//check omvänd switch
om (digitalRead(9)) {
newForward = 1;
}
annat {
newForward = 0;
}
}
void loop() {
om (klippning) {//if för närvarande klippning
om (clippingCounter < = 0) {//if tillräckligt med tid har gått sedan klippning
klippningen = 0; //not för närvarande klippning
PORTB & = 223; //turn av klippning led-indikator (stift 13)
}
}
DDRB = 0xFD; //set stift 10-12 som resultat
PORTB | = 28, //set stift 10-12 hög
fördröjning (1), //wait för kondensatorn att fullgöra
checkRev (); //check omvänd växla
DDRB = 0xE1; //set stift 10-12 som insatsvaror
checkScale();
checkGrainSize();
checkWetDry();
}