Auteur Rémi Sarrailh (µsini) | Dernière modification 9/12/2019 par Clementflipo
Musique, Arduino, MIDI, Instrument de musique Pavé_Numérique_MIDI_keypadmidi.jpg fr none Technique 0
Afin d’apprendre à créer des instruments MIDI (c.a.d des instruments utilisable dans des logiciels de musique), je me suis entraîné à l’aide de simples boutons.
Puis je me suis dit que je pourrais aussi directement utilisé un pavé numérique (keypad).
En soit ça m’a paru une bonne idée car cela permet d’avoir 16 boutons facilement.
Mais les pavés numériques ne sont pas pensés pour pouvoir être utilisés avec plusieurs boutons en même temps donc si cela est important pour vous, vous êtes prévenus.
Youtube
Tout d’abord il nous faut couper deux headers femelles de 17 broches (pour l’arduino) et un de 4 broches (pour l’écran OLED)
Voici une méthode pour le faire: https://www.youtube.com/watch?v=qDG3VFSMSPQ
Souder les headers sur la stripboard, vous pouvez vous aider de l’arduino micro pour ne pas vous tromper sur l’espacement (de 5 cases entre les deux)
Personnellement, je n’ai pas utilisé de headers pour l’afficheur OLED, car j’avais retirer les broches.
Vous pouvez soit coller le keypad (avec un pistolet à colle à chaud) où soit le visser en faisant des trous sur la stripboard.
Il vaut mieux fixer le keypad avant de souder les câbles pour pouvoir plus facilement vérifier la longueur des câbles.
Bon passons au vif du sujet, voilà comment souder le keypad.
Faites très attention à ne pas vous tromper en regarder votre arduino, tout est inversé.
Je vous conseille de partir de la broche 11, et de faire les suivantes.
Voici comment relier notre écran OLED, cette écran est relié en I2C (un protocole de communication) et utilise donc les broches 3 et 2 (c’est toujours le cas sur les cartes qui utilise un atmega32u4)
Noter que le GND (la terre) et le 5v est sur la même colonne.
Maintenant que notre keypad midi est prêt, il nous reste à programmer notre arduino micro, mon code a été fait d’une traite donc je ne garantis pas que tout marche correctement.
Le code est disponible ici : https://github.com/usini/keypad_midi
Le code utilise 3 bibliothèques qu’ils nous faut installer.
Voici un petit rappel de comment gérer les bibliothèques.
https://www.arduino.cc/en/Guide/Libraries
MidiUSB et U8g2 s’installe depuis le gestionnaire de bibliothèque d’Arduino.
Pour Keypad c’est plus complexe, il s’agit d’une version modifié de la bibliothèque Keypad de Mark Stanley, Alexander Brevig.
C’est la seul qui est capable de gérer l’appui de 4 touches en simultanée.
L’appui simultanée marche plus où moins, vu que mon objectif est surtout de faire un instrument monophonique (c.a.d une note à la fois) ça suffit mais si vous voulez jouer des accords, il y a aura un léger décalage dans le son.
Pour installer Keypad, il faut
J’ai essayé de commenter au mieux le code, donc je ne vais pas trop rentrer dans les détails, n’hésitez pas à me demander si vous voulez plus d’informations sur une partie en particulier.
J’ai du faire des compromis dans le programme, principalement faute de l’écran.
En effet la bibliothèque U8g2 consomme beaucoup de mémoire dynamique (utiliser par les variables), j’aurais pu utilisé U8x8 ou la bibliothèque d’Adafruit mais malheureusement les lettres sur l’écran sont soit trop gros soit trop petit.
J’ai donc dû limiter le nombre de preset à 8, il est surement possible d’augmenter le nombre de preset en ne personnalisant pas la velocité par ex.
Le plus important est le début du programme, c’est ici que l’on va définir nos notes et la velocité de celle-ci (velocité est le volume des notes)
Le nom des preset est stocké dans un tableau
String preset_name[PRESET] = {"Du Riechst So Gut", "FF - Replica", "DrumKit", "A", "4", "5", "6", "B"};
Les notes sont stockés dans un tableau à deux dimensions, les notes sont dans l’ordre des boutons (la première est le 1 , la deuxième le 2 etc…)
int notes[PRESET][NB_BUTTONS] = {
{38, 38, 39, 39, 43, 46, 38, 38, 48, 46, 45, 45, 57, 60, 60, 57}, //Preset 1
{37, 40, 42, 39, 40, 38, 41, 40, 48, 46, 45, 45, 57, 60, 60, 57}, // Preset 2
{35, 35, 38, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 57}, // Preset 3
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset A
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 4
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 5
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 6
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //Preset B
};
Les notes sont stockés en tant que notes midi (elles vont de 0 à 127) voici un tableau de correspondances avec la notation anglaise.
Si vous êtes plus habitués au DO,RE,MI … voici la correspondance des notes
https://bassandbeatbox.com/lire-la-musique-avec-la-notation-americaine/
Même chose pour la velocité (pareil de 0 à 127) (
int velocity[PRESET][NB_BUTTONS] = {
{70, 70, 70, 70, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, //Preset 1
{70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, //Preset 2
{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, //Preset 3
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset A
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 4
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 5
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 6
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset B
};
Prominy Metal-V permet de gérer si les cordes sur une guitare sont étouffés ou pas selon que la vélocité soit inférieur à 70 ou supérieur à 100.
J’ai donc crée un système pour que quand D est appuyé la velocité monte à 100.
Un tableau de booléen permet d’activer ou non cette fonctionnalité.
const int velocity_button = 15; // The D key is used to change velocity if velocity changer is true
const int VELOCITY_CHANGE = 100; //Velocity when D is pressed (should probably be changeable)
bool velocity_changer[PRESET] = {false, true, false, false, false, false, false, false};
Draft
Vous avez entré un nom de page invalide, avec un ou plusieurs caractères suivants :
< > @ ~ : * € £ ` + = / \ | [ ] { } ; ? #