Vumètre MIDI Arduino
- 27 réponses
- 5 participants
- 874 vues
- 7 followers
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
Sujet de la discussion Posté le 04/04/2022 à 19:17:28Vumètre MIDI Arduino
Bonjour
J’ai réussi à concevoir un contrôleur MIDI type table de mixage DJ 4 voies qui pilote Ableton et Traktor.
5 potentiomètres 1 fader 1 bouton rétro éclairé par voie.
Maintenant je bloque sur les vumètres. J’aimerais mettre 1 vumètre/voie qui serai contrôlé par Ableton.
Je ne sais pas si je dois le créer moi même LED par LED ou s’il existe des tout fait. Et surtout le code, je bloque.
Est-ce qu’une âme charitable pourrait me venir en aide? Je suis preneur de tout conseil!!!!
Merci
J’ai réussi à concevoir un contrôleur MIDI type table de mixage DJ 4 voies qui pilote Ableton et Traktor.
5 potentiomètres 1 fader 1 bouton rétro éclairé par voie.
Maintenant je bloque sur les vumètres. J’aimerais mettre 1 vumètre/voie qui serai contrôlé par Ableton.
Je ne sais pas si je dois le créer moi même LED par LED ou s’il existe des tout fait. Et surtout le code, je bloque.
Est-ce qu’une âme charitable pourrait me venir en aide? Je suis preneur de tout conseil!!!!
Merci
Rémy M. (chimimic)
14205
Modérateur·trice thématique
Membre depuis 22 ans
21 Posté le 25/04/2022 à 08:37:56
Bonjour,
essaie ceci :
A noter que
(velocité = 0)
ne peut que correspondre à un évènement NoteOff.
Mais c'est peut-être ce que tu veux...
essaie ceci :
if (rx.byte1 = 15) & (rx.byte 2 = 21) & (velocity < 1)
A noter que
(velocity < 1)
(velocité = 0)
ne peut que correspondre à un évènement NoteOff.
Mais c'est peut-être ce que tu veux...
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
22 Posté le 25/04/2022 à 14:19:03
En effet c'est la ligne de la NoteOff
J'ai pris ça comme exemple parce que c'était la premiere ligne, mais après j'ai (velocity > 30) par exemple.
Sinon la compile passe pas comme tu l'as écrit.
J'ai ça comme erreur.
J'ai pris ça comme exemple parce que c'était la premiere ligne, mais après j'ai (velocity > 30) par exemple.
Sinon la compile passe pas comme tu l'as écrit.
Citation :
/Users/remybertrand/Documents/Arduino/NeoPixel_Vu/NeoPixel_Vu.ino:159:40: error: invalid operands of types 'uint8_t* {aka unsigned char*}' and 'bool' to binary 'operator&'
if (rx.byte1 = 15) & (rx.byte2 = 21) & (velocity > 30) {
J'ai ça comme erreur.
Zorks
1197
AFicionado·a
Membre depuis 9 ans
23 Posté le 25/04/2022 à 15:17:26
& est un operateur artihmetique, c'est le "et" binaire : 8 & 4 = 0
&& est l’opérateur logique : 8 && 4 = <pas zero>
Attention : "a = b" c'est a prend la valeur de b, et (a = b) peut valoir a peu près n'importe quoi, sans garantie (a, ou zero, ou 1, autre chose). On écrit normalement pas ce genre de chose.
"a == b" c'est un test qui vaut 0 si a n'a pas la même valeur que b, <pas zero> sinon.
La precedence des operateurs "if", "&" ... etc dans ton exemple fait que le code ne veut rien dire (heureusement il n'est pas non plus correct).
suggestion :
J'ai aussi rajoute des parenthèses, ça ne mange pas de pain.
&& est l’opérateur logique : 8 && 4 = <pas zero>
Attention : "a = b" c'est a prend la valeur de b, et (a = b) peut valoir a peu près n'importe quoi, sans garantie (a, ou zero, ou 1, autre chose). On écrit normalement pas ce genre de chose.
"a == b" c'est un test qui vaut 0 si a n'a pas la même valeur que b, <pas zero> sinon.
La precedence des operateurs "if", "&" ... etc dans ton exemple fait que le code ne veut rien dire (heureusement il n'est pas non plus correct).
suggestion :
Citation :
if ((rx.byte1 == 15) && (rx.byte2 == 21) && (velocity > 30)) {
J'ai aussi rajoute des parenthèses, ça ne mange pas de pain.
[ Dernière édition du message le 25/04/2022 à 15:20:34 ]
Rémy M. (chimimic)
14205
Modérateur·trice thématique
Membre depuis 22 ans
24 Posté le 25/04/2022 à 17:00:09
Merci Zorks pour tes corrections.
Cela m'apprendra à donner un exemple dans un langage que je ne maîtrise pas, même si l'idée était là.
Cela m'apprendra à donner un exemple dans un langage que je ne maîtrise pas, même si l'idée était là.
Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
25 Posté le 25/04/2022 à 20:59:25
Ça ne marche pas
les LED ne s'allument meme plus.
J'ai tenté "rx.byte2 == 21", les LED s'allument comme avant, c'est comme si j'avais rien mis.
J'arrive vraiment pas à comprendre comment limiter l'allumage des LED à Channel 16 note A0
Voilà ce que j'ai en entré de l'arduino pour être sûr que je me plante pas.
les LED ne s'allument meme plus.
J'ai tenté "rx.byte2 == 21", les LED s'allument comme avant, c'est comme si j'avais rien mis.
J'arrive vraiment pas à comprendre comment limiter l'allumage des LED à Channel 16 note A0
Voilà ce que j'ai en entré de l'arduino pour être sûr que je me plante pas.
[ Dernière édition du message le 25/04/2022 à 21:11:46 ]
Zorks
1197
AFicionado·a
Membre depuis 9 ans
26 Posté le 26/04/2022 à 01:32:16
C’est difficile à suivre car ton code est morcelé sur plusieurs posts …
Il sort d’où ce “value” ? Dans le décodage de l’entrée midi tu utilise “velocity”, mais après c’est value ?
Ensuite, … dans les exemples ci dessus tu mets strip.offColor quand tu vérifies la condition du if. C’est donc pour l’éteindre
Ensuite encore, avec ces leds série tu ne perds rien à écrire toutes les leds à chaque fois que tu fais un changement. Ou à minima effacer tout strip avant.
Enfin, 21 c’est peut être le décimal pour AO, je ne sais pas. Si tu es sur de ton coup … ok.
Il serait peut-être bien de tester tes fonctions de led dans un sketch à part, t’assurer que tu peux bien allumer les leds que tu veux avec les bonnes commandes, indépendamment des entrées midi et de leur décodage.
Si tu veux un retour sur ton code, il faut le mettre en entier, dans un spoiler.
Il sort d’où ce “value” ? Dans le décodage de l’entrée midi tu utilise “velocity”, mais après c’est value ?
Ensuite, … dans les exemples ci dessus tu mets strip.offColor quand tu vérifies la condition du if. C’est donc pour l’éteindre
Ensuite encore, avec ces leds série tu ne perds rien à écrire toutes les leds à chaque fois que tu fais un changement. Ou à minima effacer tout strip avant.
Enfin, 21 c’est peut être le décimal pour AO, je ne sais pas. Si tu es sur de ton coup … ok.
Il serait peut-être bien de tester tes fonctions de led dans un sketch à part, t’assurer que tu peux bien allumer les leds que tu veux avec les bonnes commandes, indépendamment des entrées midi et de leur décodage.
Si tu veux un retour sur ton code, il faut le mettre en entier, dans un spoiler.
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
27 Posté le 26/04/2022 à 11:49:15
Ok j'avoue que je pars un peu dans tous les sens à chercher à droite à gauche. et du coup j'oublie d'enlever les modifications.
Pour repartir sur un code propre (voir le spoiler) et une explication claire :
J'ai un Arduino Leonardo avec un strip de 8 NeoPixels branché dessus. La DIN du strip est branché sur le PIN 6 de l'Arduino. Mon but est d'allumer les 8 LED du strip au rythme de la musique (style vumètre de table de mixage), en me servant des messages midi que le logiciel Traktor envoi.
voici ce que le mapping de Traktor (à gauche) et ce qu'il envoi comme message(à droite) :
le sketch :
Il semblerait que ce soit bon. j'ai vérifié sur le net avec un MIDI Chart. apparemment le A0 correspond à 21 ou à 33 selon si le Middle C est C3 ou C4. mais j'ai testé les 2 ça change rien.
En l'état ça fonctionne quasiment comme je le voudrais, les LED s'allument au rythme de la musique. Sauf que le strip s'allume que ce soit la deck 1 2 3 ou 4 qui tourne. le strip réagit a tous les messages MIDI venant de Traktor, peut importe le channel et la note.
J'ai aussi fait un test avec le bouton "SYNC" de Traktor qui n'envoie qu'un NoteOn/NoteOff (127/0) en le mettant sur channel 13 note G#3. Le strip s'allume quand je l'active.
Donc pour remédier à ça, je voudrais limiter la réaction du strip à la note A0 channel 16.
Pour repartir sur un code propre (voir le spoiler) et une explication claire :
J'ai un Arduino Leonardo avec un strip de 8 NeoPixels branché dessus. La DIN du strip est branché sur le PIN 6 de l'Arduino. Mon but est d'allumer les 8 LED du strip au rythme de la musique (style vumètre de table de mixage), en me servant des messages midi que le logiciel Traktor envoi.
voici ce que le mapping de Traktor (à gauche) et ce qu'il envoi comme message(à droite) :
le sketch :
Spoiler - Cliquer ici pour lire la suite
int velocity;
#include <MIDIUSB.h>
#include "pitchToFrequency.h"
//#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // pin strip
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 8 // Popular NeoPixel
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint32_t offColor = strip.Color(0, 0, 0); // Strip off
uint32_t whiteColor = strip.Color(255, 255, 255);
uint32_t yellowColor = strip.Color(127, 64, 0);
uint32_t redColor = strip.Color(255, 0, 0);
uint32_t blueColor = strip.Color(0, 0, 255);
#define BUZZ_PIN 9 // pin sortie buzzer
byte ng;
byte oct;
const char* pitch_name(byte pitch) {
static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
return names[pitch % 12];
}
int pitch_octave(byte pitch) {
return (pitch / 12) - 1;
}
void noteOn(byte channel, byte pitch, byte velocity) {
tone(BUZZ_PIN, pitchFrequency[pitch]);
Serial.print("Note On: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print(", velocity=");
Serial.print(velocity);
ng = pitch % 12;
oct = pitch / 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 150, 0);
strip.show();
}
void noteOff(byte channel, byte pitch, byte velocity) {
noTone(BUZZ_PIN);
Serial.print("Note Off: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print(", velocity=");
Serial.println(velocity);
ng = pitch % 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 0, 0);
strip.show();
}
void controlChange(byte channel, byte control, byte value) {
Serial.print("Control change: control=");
Serial.print(control);
Serial.print(", value=");
Serial.print(value);
Serial.print(", channel=");
Serial.println(channel);
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.clear();
}
void loop() {
noPixels();
midiEventPacket_t rx = MidiUSB.read();
switch (rx.header) {
case 0:
break; //No pending events
case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity = rx.byte3;
break;
case 0x8:
noteOff(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity = 0;
break;
case 0xB:
controlChange(
rx.byte1 & 0xF, //channel
rx.byte2, //control
rx.byte3 //value
);
break;
default:
Serial.print("Unhandled MIDI message: ");
Serial.print(rx.header, HEX);
Serial.print("-");
Serial.print(rx.byte1, HEX);
Serial.print("-");
Serial.print(rx.byte2, HEX);
Serial.print("-");
Serial.println(rx.byte3, HEX);
}
//strip.noPixels();
if (velocity > 50) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, whiteColor);
}
else {
strip.setPixelColor(0, offColor);
}
if (velocity > 65) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
else {
strip.setPixelColor(1, offColor);
}
if (velocity > 80) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}
else {
strip.setPixelColor(2, offColor);
}
if (velocity > 95) {
// pixels.setPixelColor(3, whiteColor);
strip.setPixelColor(3, whiteColor);
}
else {
strip.setPixelColor(3, offColor);
}
if (velocity > 100) {
// pixels.setPixelColor(4, whiteColor);
strip.setPixelColor(4, whiteColor);
}
else {
strip.setPixelColor(4, offColor);
}
if (velocity > 110 ) {
// pixels.setPixelColor(5, blueColor);
strip.setPixelColor(5, blueColor);
}
else {
strip.setPixelColor(5, offColor);
}
if (velocity > 120) {
// pixels.setPixelColor(6, blueColor);
strip.setPixelColor(6, blueColor);
}
else {
strip.setPixelColor(6, offColor);
}
if (velocity > 126) {
// pixels.setPixelColor(7, redColor);
strip.setPixelColor(7, redColor);
}
else {
strip.setPixelColor(7, offColor);
}
strip.show();
}
void noPixels()
{
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, offColor);
}
strip.show();
}
#include <MIDIUSB.h>
#include "pitchToFrequency.h"
//#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // pin strip
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 8 // Popular NeoPixel
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint32_t offColor = strip.Color(0, 0, 0); // Strip off
uint32_t whiteColor = strip.Color(255, 255, 255);
uint32_t yellowColor = strip.Color(127, 64, 0);
uint32_t redColor = strip.Color(255, 0, 0);
uint32_t blueColor = strip.Color(0, 0, 255);
#define BUZZ_PIN 9 // pin sortie buzzer
byte ng;
byte oct;
const char* pitch_name(byte pitch) {
static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
return names[pitch % 12];
}
int pitch_octave(byte pitch) {
return (pitch / 12) - 1;
}
void noteOn(byte channel, byte pitch, byte velocity) {
tone(BUZZ_PIN, pitchFrequency[pitch]);
Serial.print("Note On: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print(", velocity=");
Serial.print(velocity);
ng = pitch % 12;
oct = pitch / 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 150, 0);
strip.show();
}
void noteOff(byte channel, byte pitch, byte velocity) {
noTone(BUZZ_PIN);
Serial.print("Note Off: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print(", velocity=");
Serial.println(velocity);
ng = pitch % 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 0, 0);
strip.show();
}
void controlChange(byte channel, byte control, byte value) {
Serial.print("Control change: control=");
Serial.print(control);
Serial.print(", value=");
Serial.print(value);
Serial.print(", channel=");
Serial.println(channel);
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.clear();
}
void loop() {
noPixels();
midiEventPacket_t rx = MidiUSB.read();
switch (rx.header) {
case 0:
break; //No pending events
case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity = rx.byte3;
break;
case 0x8:
noteOff(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity = 0;
break;
case 0xB:
controlChange(
rx.byte1 & 0xF, //channel
rx.byte2, //control
rx.byte3 //value
);
break;
default:
Serial.print("Unhandled MIDI message: ");
Serial.print(rx.header, HEX);
Serial.print("-");
Serial.print(rx.byte1, HEX);
Serial.print("-");
Serial.print(rx.byte2, HEX);
Serial.print("-");
Serial.println(rx.byte3, HEX);
}
//strip.noPixels();
if (velocity > 50) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, whiteColor);
}
else {
strip.setPixelColor(0, offColor);
}
if (velocity > 65) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
else {
strip.setPixelColor(1, offColor);
}
if (velocity > 80) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}
else {
strip.setPixelColor(2, offColor);
}
if (velocity > 95) {
// pixels.setPixelColor(3, whiteColor);
strip.setPixelColor(3, whiteColor);
}
else {
strip.setPixelColor(3, offColor);
}
if (velocity > 100) {
// pixels.setPixelColor(4, whiteColor);
strip.setPixelColor(4, whiteColor);
}
else {
strip.setPixelColor(4, offColor);
}
if (velocity > 110 ) {
// pixels.setPixelColor(5, blueColor);
strip.setPixelColor(5, blueColor);
}
else {
strip.setPixelColor(5, offColor);
}
if (velocity > 120) {
// pixels.setPixelColor(6, blueColor);
strip.setPixelColor(6, blueColor);
}
else {
strip.setPixelColor(6, offColor);
}
if (velocity > 126) {
// pixels.setPixelColor(7, redColor);
strip.setPixelColor(7, redColor);
}
else {
strip.setPixelColor(7, offColor);
}
strip.show();
}
void noPixels()
{
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, offColor);
}
strip.show();
}
Citation :
Enfin, 21 c’est peut être le décimal pour AO, je ne sais pas. Si tu es sur de ton coup … ok.
Il semblerait que ce soit bon. j'ai vérifié sur le net avec un MIDI Chart. apparemment le A0 correspond à 21 ou à 33 selon si le Middle C est C3 ou C4. mais j'ai testé les 2 ça change rien.
En l'état ça fonctionne quasiment comme je le voudrais, les LED s'allument au rythme de la musique. Sauf que le strip s'allume que ce soit la deck 1 2 3 ou 4 qui tourne. le strip réagit a tous les messages MIDI venant de Traktor, peut importe le channel et la note.
J'ai aussi fait un test avec le bouton "SYNC" de Traktor qui n'envoie qu'un NoteOn/NoteOff (127/0) en le mettant sur channel 13 note G#3. Le strip s'allume quand je l'active.
Donc pour remédier à ça, je voudrais limiter la réaction du strip à la note A0 channel 16.
[ Dernière édition du message le 26/04/2022 à 11:55:45 ]
Ray-Me
4687
Squatteur·euse d’AF
Membre depuis 18 ans
28 Posté le 26/04/2022 à 15:31:11
C'est bon j'ai trouvé mon probléme. en regardant le log du serial monitor je me suis rendu compte que je n'avais pas de valeur de pitch qui remontait.
Du coup j'ai rajouté ce qu'il fallait :
Du coup j'ai rajouté ce qu'il fallait :
Spoiler - Cliquer ici pour lire la suite
int velocity;
int canal;
int pitch;
#include <MIDIUSB.h>
#include "pitchToFrequency.h"
//#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // pin strip
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 32 // Popular NeoPixel
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint32_t offColor = strip.Color(0, 0, 0); // Strip off
uint32_t whiteColor = strip.Color(255, 255, 255);
uint32_t yellowColor = strip.Color(127, 64, 0);
uint32_t redColor = strip.Color(255, 0, 0);
uint32_t blueColor = strip.Color(0, 0, 255);
byte ng;
byte oct;
const char* pitch_name(byte pitch) {
static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
return names[pitch % 12];
}
int pitch_octave(byte pitch) {
return (pitch / 12) - 1;
}
void noteOn(byte channel, byte pitch, byte velocity) {
Serial.print("Note On: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print("pitch=");
Serial.println(pitch);
Serial.print(", velocity=");
Serial.print(velocity);
ng = pitch % 12;
oct = pitch / 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 150, 0);
strip.show();
}
void noteOff(byte channel, byte pitch, byte velocity) {
Serial.print("Note Off: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print("pitch=");
Serial.println(pitch);
Serial.print(", velocity=");
Serial.println(velocity);
ng = pitch % 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 0, 0);
strip.show();
}
void controlChange(byte channel, byte control, byte value) {
Serial.print("Control change: control=");
Serial.print(control);
Serial.print(", value=");
Serial.print(value);
Serial.print(", channel=");
Serial.println(channel);
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.clear();
}
void loop() {
noPixels();
midiEventPacket_t rx = MidiUSB.read();
switch (rx.header) {
case 0:
break; //No pending events
case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
canal=rx.byte1 & 0xF;
pitch=rx.byte2;
velocity=rx.byte3;
break;
case 0x8:
noteOff(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity=0;
pitch=rx.byte2;
canal=rx.byte1 & 0xF;
break;
case 0xB:
controlChange(
rx.byte1 & 0xF, //channel
rx.byte2, //control
rx.byte3 //value
);
canal=rx.byte1 & 0xF;
break;
default:
Serial.print("Unhandled MIDI message: ");
Serial.print(rx.header, HEX);
Serial.print("-");
Serial.print(rx.byte1, HEX);
Serial.print("-");
Serial.print(rx.byte2, HEX);
Serial.print("-");
Serial.println(rx.byte3, HEX);
}
//strip.noPixels();
if ((canal == 15) && (pitch == 21) && (velocity > 50)) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, whiteColor);
}
else {
strip.setPixelColor(0, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 65)) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
else {
strip.setPixelColor(1, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 80)) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}
else {
strip.setPixelColor(2, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 95)) {
// pixels.setPixelColor(3, whiteColor);
strip.setPixelColor(3, whiteColor);
}
else {
strip.setPixelColor(3, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 100)) {
// pixels.setPixelColor(4, whiteColor);
strip.setPixelColor(4, whiteColor);
}
else {
strip.setPixelColor(4, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 110)) {
// pixels.setPixelColor(5, blueColor);
strip.setPixelColor(5, blueColor);
}
else {
strip.setPixelColor(5, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 120)) {
// pixels.setPixelColor(6, blueColor);
strip.setPixelColor(6, blueColor);
}
else {
strip.setPixelColor(6, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 126)) {
// pixels.setPixelColor(7, redColor);
strip.setPixelColor(7, redColor);
}
else {
strip.setPixelColor(7, offColor);
}
strip.show();
}
void noPixels()
{
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, offColor);
}
strip.show();
}
int canal;
int pitch;
#include <MIDIUSB.h>
#include "pitchToFrequency.h"
//#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN 6 // pin strip
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 32 // Popular NeoPixel
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
uint32_t offColor = strip.Color(0, 0, 0); // Strip off
uint32_t whiteColor = strip.Color(255, 255, 255);
uint32_t yellowColor = strip.Color(127, 64, 0);
uint32_t redColor = strip.Color(255, 0, 0);
uint32_t blueColor = strip.Color(0, 0, 255);
byte ng;
byte oct;
const char* pitch_name(byte pitch) {
static const char* names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
return names[pitch % 12];
}
int pitch_octave(byte pitch) {
return (pitch / 12) - 1;
}
void noteOn(byte channel, byte pitch, byte velocity) {
Serial.print("Note On: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print("pitch=");
Serial.println(pitch);
Serial.print(", velocity=");
Serial.print(velocity);
ng = pitch % 12;
oct = pitch / 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 150, 0);
strip.show();
}
void noteOff(byte channel, byte pitch, byte velocity) {
Serial.print("Note Off: ");
Serial.print(pitch_name(pitch));
Serial.print(pitch_octave(pitch));
Serial.print(", channel=");
Serial.print(channel);
Serial.print("pitch=");
Serial.println(pitch);
Serial.print(", velocity=");
Serial.println(velocity);
ng = pitch % 12;
Serial.print(", ng= ");
Serial.println(ng);
strip.setPixelColor(ng, 0, 0, 0);
strip.show();
}
void controlChange(byte channel, byte control, byte value) {
Serial.print("Control change: control=");
Serial.print(control);
Serial.print(", value=");
Serial.print(value);
Serial.print(", channel=");
Serial.println(channel);
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.clear();
}
void loop() {
noPixels();
midiEventPacket_t rx = MidiUSB.read();
switch (rx.header) {
case 0:
break; //No pending events
case 0x9:
noteOn(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
canal=rx.byte1 & 0xF;
pitch=rx.byte2;
velocity=rx.byte3;
break;
case 0x8:
noteOff(
rx.byte1 & 0xF, //channel
rx.byte2, //pitch
rx.byte3 //velocity
);
velocity=0;
pitch=rx.byte2;
canal=rx.byte1 & 0xF;
break;
case 0xB:
controlChange(
rx.byte1 & 0xF, //channel
rx.byte2, //control
rx.byte3 //value
);
canal=rx.byte1 & 0xF;
break;
default:
Serial.print("Unhandled MIDI message: ");
Serial.print(rx.header, HEX);
Serial.print("-");
Serial.print(rx.byte1, HEX);
Serial.print("-");
Serial.print(rx.byte2, HEX);
Serial.print("-");
Serial.println(rx.byte3, HEX);
}
//strip.noPixels();
if ((canal == 15) && (pitch == 21) && (velocity > 50)) {
// pixels.setPixelColor(0, whiteColor);
strip.setPixelColor(0, whiteColor);
}
else {
strip.setPixelColor(0, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 65)) {
// pixels.setPixelColor(1, whiteColor);
strip.setPixelColor(1, whiteColor);
}
else {
strip.setPixelColor(1, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 80)) {
// pixels.setPixelColor(2, whiteColor);
strip.setPixelColor(2, whiteColor);
}
else {
strip.setPixelColor(2, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 95)) {
// pixels.setPixelColor(3, whiteColor);
strip.setPixelColor(3, whiteColor);
}
else {
strip.setPixelColor(3, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 100)) {
// pixels.setPixelColor(4, whiteColor);
strip.setPixelColor(4, whiteColor);
}
else {
strip.setPixelColor(4, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 110)) {
// pixels.setPixelColor(5, blueColor);
strip.setPixelColor(5, blueColor);
}
else {
strip.setPixelColor(5, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 120)) {
// pixels.setPixelColor(6, blueColor);
strip.setPixelColor(6, blueColor);
}
else {
strip.setPixelColor(6, offColor);
}
if ((canal == 15) && (pitch == 21) && (velocity > 126)) {
// pixels.setPixelColor(7, redColor);
strip.setPixelColor(7, redColor);
}
else {
strip.setPixelColor(7, offColor);
}
strip.show();
}
void noPixels()
{
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, offColor);
}
strip.show();
}
- < Liste des sujets
- Charte