# Customisation (Arduino)

# Code Principale

<p class="callout success">Documentation développeur : [https://usini.github.io/m1d1\_36/docs/index.html](https://usini.github.io/m1d1_36/docs/index.html)</p>

Afin de simplifier la modification du fonctionnement de l'instrument, tout le code est basé sur un [système événementielle](https://doc.labsud.org/Programmation%20%C3%A9v%C3%A9nementielle)  
Chaque fonctionnalité est rangé dans un fichier.h

- OLED.h (Afficheur)
- buttons.h (Boutons)
- midi.h (Midi)
- mpr121.h (Module capacitif)
- pots.h (Potentiomètre)
- settings.h (Paramètres)

Voici les 3 événements disponibles dans ces 3 fonctions

- MPREvent
- potsEvent
- buttonsEvent

## MPREvent (PAD)

[![image-1594105051570.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594105051570.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594105051570.png)

Lorsqu'un pad est appuyé ou relâché, cette fonction devient active.

**<span style="text-decoration: underline;">Voici les paramètres de cette fonction:</span>**

**capPos** : Position du l'ensemble des pads De 0 à 36 (noté sur le PCB comme U16, U17, U18 par ex)  
[![image-1594117745644.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594117745644.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594117745644.png)  
**note** : La note correspondant à la position du pad comme noté dans settings.h (voir capNote\[36\])

```C++
uint8_t capNote[36] = {28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
                       40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
                       52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
                      }; ///< Note from pad (when transpose = 0)
```

**state** : **true** si appuyé et **false** si relaché  
**mpr\_id** : id du module capacitif, chaque ligne correspond à un module et commence par la ligne du bas

[![image-1594118050992.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594118050992.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594118050992.png)  
**cap\_id** : id du pad par rapport au module (de 0 à 12)

<span style="text-decoration: underline;">**Exemple, jouer une note du tableau capNote\[36\]**  
</span>

```C++
if (state) { //Pad appuyé
 noteOn(note, 120, 1) //Note midion (équivalent à capNote[capPos]), velocité, canal)
} else { // Pad Relaché
 noteOff(note, 0, 1) //Note midioff (équivalent à capNote[capPos]), velocité, canal)
}
```

## potsEvent (Potentiomètre)

[![image-1594118746314.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594118746314.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594118746314.png)  
Lorsqu'un potentiomètre est tourné, cette fonction s'active

<span style="text-decoration: underline;">**Voici les paramètres de cette fonction:**  
</span>**pot\_id :** Le numéro correspondant au potentiomètre **(noté A0 à A3 sur le PCB)  
pots\_cc\[\] :** Le [paramètre](https://www.midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2) lié au potentiomètre **sous la forme de 0x01 à 0x7F (voir settings.h)  
pots\_val\[\] :** La valeur du potentiomètre de 0 à 127

<p class="callout info">pots\_cc et pots\_val sont des variables globales</p>

**<span style="text-decoration: underline;">Exemple</span>**

```C++
switch (pot_id) {
    case 0:
      controlChange(0x01, pots_val[pot_id], 1);
      break;
    case 1:
      controlChange(0x02, pots_val[pot_id], 1);
      break;
    case 2:
      controlChange(0x03, pots_val[pot_id], 1);
      break;
    case 3:
      controlChange(0x04, pots_val[pot_id], 1);
      break;
}
```

## buttonsEvent (Boutons)

[![image-1594119492003.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594119492003.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594119492003.png)

Lorsqu'un bouton est **appuyé**, **relaché**, **appuyé deux fois**, **laissé appuyer** et **appuyé plusieurs fois**  
Pour gérer les boutons, je suis passé par la bibliothèque [AceButton](https://github.com/bxparks/AceButton) qui permet de facilement pouvoir gérer plusieurs évènements.

<span style="text-decoration: underline;">**Voici les paramètres de cette fonction:**  
</span>**button** : Objet bouton, ici nous ne l'utilisons uniquement pour récupérez son identifiant  
**button-&gt;getid()** : Identifiant du bouton  
**eventType** : L’évènement qui a déclenché cette fonction  
**buttonState** : État numérique du bouton (LOW/HIGH)  
**btn\[\]** : État sauvegardé du bouton  
**btn\_cc\[\]** : Le [paramètre](https://www.midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2) lié au potentiomètre **sous la forme de 0x01 à 0x7F (voir settings.h)**

<p class="callout info">btn\[\] et btn\_cc sont des variables globales</p>

**<span style="text-decoration: underline;">Exemple</span>**

```C++
uint8_t id = button->getId();
switch (eventType) {
case AceButton::kEventPressed:
  btn[id] = !btn[id]; //Inversement de l'état du bouton
  if(btn_id){
    controlChange(btn_cc[id], 0, 1);
  } else {
    controlChange(btn_cc[id], 127,1);
  }
  break;
}
```

# Afficheur (OLED.h)

Le fichier **OLED.h** gère l'afficheur OLED : [**SSD1306** ](https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf)

Nous allons utiliser pour cela, la bibliothèque d'Adafruit SSD1306.  
Celle-ci utilise une bibliothèque générique pour les afficheurs : [Adafruit GFX](https://learn.adafruit.com/adafruit-gfx-graphics-library)

[![image-1594125319859.png](https://doc.labsud.org/uploads/images/gallery/2020-07/scaled-1680-/image-1594125319859.png)](https://doc.labsud.org/uploads/images/gallery/2020-07/image-1594125319859.png)

## Initialisation de l'afficheur

L'afficheur s'in

# Boutons (buttons.h)



# Midi USB et série (midi.h)



# Pads (mpr121.h)