Étape 2: Le schéma / le Code
------------------------------------------------------
Un tableau contenant la forme d’onde
d’un son de guitare
Char [] de forme d’onde =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134 et 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110} ;
Nous utilisons cette forme d’onde pour changer le
volume de la sortie
Char [] waveformVolume =
{125, 148, 171, 194, 209, 230, 252, 255,
253, 244, 235, 223, 207, 184, 169, 167,
163, 158, 146, 131, 126, 129, 134 et 127,
105, 80, 58, 51,38, 22, 12, 2, 10, 35,
58, 75, 89, 103, 120, 141, 150, 148, 145,
144, 140, 129, 116, 105, 95, 86, 75, 72,
73, 76, 88, 103, 117, 121, 120, 115, 120,
143, 159, 162, 156, 155, 163, 184, 202,
214, 215, 211, 213, 212, 205, 196, 182,
162, 142, 118, 99, 84, 68, 54, 40, 28,
19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
49, 59, 65, 75, 92, 110} ;
Un tableau utilisé comme mémoire tampon afin d’éviter
distance de ponctuel erronée
mesures
unsigned int distance_buffer [] = {16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000, 16000, 16000, 16000,
16000, 16000, 16000} ;
const int distance_length = 3 ;
int distance_index = 0 ;
Les valeurs de dépassement de capacité de 2 octaves
la fréquences d’int [] = {39, 42, 44, 47,
50, 52, 56, 59, 63, 66, 70, 74, 79,
84, 89, 94, 100, 105, 112, 118, 126,
133, 141, 149} ;
Hauteur d’origine
hauteur int = 160 ;
Accélération et volume initial
paramètre
int lastAcc = 0 ;
flotteur volume = 0 ;
lecture audio sur la broche 3
speakerpin octets = 3 ;
variable d’index pour la position des
forme d’onde
waveindex volatile octets = 0
currentvalue volatils octets = 0 ;
Broche utilisée pour capteur ultrasons
const int pingPin = 7 ;
Broches pour les potentiomètres
const int sustainPin = 1 ;
const int sensitivityPin = 2 ;
Broches pour chaque doigt de la gauche
main
const int finger1 = 9 ;
const int finger2 = 10 ;
const int finger3 = 11 ;
const int finger4 = 12 ;
int fingerValue = 0 ;
longue durée, pouces, cm ;
void setup() {}
pinMode(3,OUTPUT) ; Haut-parleur sur la broche 3
pinMode(finger1,INPUT) ;
pinMode(finger2,INPUT) ;
pinMode(finger3,INPUT) ;
pinMode(finger4,INPUT) ;
/**************************
Configuration audio PWM
****************************/
la valeur Timer2 rapide mode PWM
(double fréquence PWM)
bitSet (TCCR2A, WGM21) ;
bitSet (TCCR2B, CS20) ;
bitClear (TCCR2B, CS21) ;
bitClear (TCCR2B, CS22) ;
activer les interruptions maintenant qui enregistre
ont été mis en
SEI() ;
/*************************
Configuration d’interrupt Timer 1
*************************/
désactiver les interruptions tout en
registres sont configurés
CLI() ;
/ * Opération de port normal, épingles déconnectés
de fonctionnement de la minuterie (rupture pwm) * /
bitClear (TCCR1A, COM1A1) ;
bitClear (TCCR1A, COM1A1) ;
bitClear (TCCR1A, COM1A1) ;
bitClear (TCCR1A, COM1A1) ;
/ * Mode 4, CTC avec dessus valeur de Registre
OCR1A. Permet de régler le calage variable pour
l’interruption en écrivant de nouvelles valeurs à
OCR1A. */
bitClear (TCCR1A, WGM10) ;
bitClear (TCCR1A, WGM11) ;
bitSet (TCCR1B, WGM12) ;
bitClear (TCCR1B, WGM13) ;
/ * la valeur du diviseur d’horloge 8. */
bitClear (TCCR1B, CS10) ;
bitSet (TCCR1B, CS11) ;
bitClear (TCCR1B, CS12) ;
/ * Désactiver Force sortie comparer pour
Canaux A et B. * /
bitClear (TCCR1C, FOC1A) ;
bitClear (TCCR1C, FOC1B) ;
/ * Initialise la sortie comparer
S’inscrire A à 160 pour définir le
premier pitch * /
OCR1A = 160 ;
désactiver l’interruption de la prise d’entrée
bitClear (TIMSK1, ICIE1) ;
désactiver la sortie
Comparer B interruption de Match
bitClear (TIMSK1, OCIE1B) ;
activer la sortie
Comparer une interruption du Match
bitSet (TIMSK1, OCIE1A) ;
désactiver le débordement interrompre
bitClear (TIMSK1, TOIE1) ;
Enable interrompt maintenant que
registres ont été établis
SEI() ;
}
Gestionnaire de débordement Timer
{ISR(TIMER1_COMPA_vect)}
/ * timer1 ISR. Chaque fois qu’il
est appelé il affecte à speakerpin la
valeur suivante dans la forme d’onde []. Fréquence
modulation s’effectue en modifiant la
synchronisation entre les appels successifs de
Cette fonction, par exemple pour une tonalité de 1KHz,
régler l’allumage pour qu’il fonctionne
par le biais de forme d’onde [] 1000 fois
une seconde. */
réinitialiser le waveindex si elle a atteint
la fin du tableau
Si {(waveindex > 102)
waveindex = 0 ;
}
Définissez la valeur de sortie
Si {(volume > 0,03)
analogWrite (speakerpin,
waveformVolume[waveindex]) ;
}
waveindex ++ ;
Mise à jour le terrain
OCR1A = pitch ;
}
void loop()
{
Désactiver interputs, envoyer un ping
message et attendre la réponse.
CLI() ;
pinMode (pingPin, sortie) ;
digitalWrite (pingPin, basse) ;
delayMicroseconds(2) ;
digitalWrite (pingPin, HIGH) ;
delayMicroseconds(5) ;
digitalWrite (pingPin, basse) ;
durée = pulseIn (pingPin, haute, 2000) ;
SEI() ;
convertir l’heure dans un lointain
en centimètres
et le stocker dans la mémoire tampon
distance_buffer [distance_index ++
distance_length %] = Durée / 20 ;
Trouver dans la mémoire tampon la plus courte
distance mesurée
cm = 16000 ;
pour (int i = 0; i < distance_length; i ++) {}
cm = min (cm, distance_buffer[i]) ;
}
Vérifier quelles les doigts sont pressées
fingerValue = 5 ;
{if(!digitalRead(finger4))}
fingerValue = 4 ;
}
{if(!digitalRead(finger3))}
fingerValue = 3 ;
}
{if(!digitalRead(finger2))}
fingerValue = 2 ;
}
{if(!digitalRead(finger1))}
fingerValue = 1 ;
}
Mise à jour le sustain et
valeurs de sensibilité
flotteur soutenir =
Map(analogRead(sustainPin), 0,
1024, 101, 130) / 100,0 ;
sensibilité de l’int =
Map(analogRead(sensitivityPin),
0, 1024, 100, 200) ;
Mise à jour le volume
volume = volume / subir ;
Si (volume < 0) {}
volume = 0 ;
}
Vérifier l’accéléromètre
acc int = analogRead(0) ;
int accDiff = lastAcc - acc ;
Mise à jour la valeur du volume
Si (accDiff > 5 * (200 - sensibilité)) {}
volume = (float)
Pow (accDiff,
sensibilité / 100,0) / 50000 ;
}
lastAcc = acc ;
Vérifiez que le volume n’est pas supérieur à 1
Si {(volume > 95)
volume =. 95 ;
}
Mise à jour le volume dans la forme d’onde
pour (int i = 0; i < = 102; i ++) {}
waveformVolume [i] =
((forme d’onde [i] - 127) * volume) + 127 ;
}
La valeur du terrain selon la distance
entre les deux mains et la
doigts pressés
Si (cm < 102 & & cm > 0) {}
Si {(cm > 30)
hauteur = fréquences [7 +
(((cm-30) / 24) * 4 + fingerValue - 1)] ;
} else {}
hauteur = carte (cm, 0, 30, 39, 79) ;
}
} else {}
hauteur = fréquences [7 +
(((102-30)/24) * 4 + fingerValue - 1)] ;
}
Délai pour éviter le rebond de signaux
Delay(50) ;
}
------------------------------------------------------