I2L 2024 Groupe6

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Proposition de système

Un clavier midi constitué de 12 touches permettant de produire du son, 2 touches permettant d'augmenter ou diminuer d'une octave, et un bouton permettant de gérer le volume. Un écran affiche l'octave (de 0 à 7) et le volume (de 0 à 100).

Contre-proposition

OK pour la proposition mais il est demandé impérativement d'implanter un périphérique USB de classe MIDI.

Pour la gestion des touches en matrice voyez le projet [1].

Pour la gestion de l'écran LCD vous pouvez vous inspirer du code des groupes 3 et 4 I2L en 2023/2024.

La démonstration MIDI de la bibliothèque LUFA semble être adaptée au projet. Vous pourriez d'ailleurs ajouter une fonctionnalité de cette démonstration consistant en le changement d'instrument. Pour cela vous pouvez utiliser une combinaison de touches comme appuyer simultanément sur un bouton de changment d'octave et sur une touche du clavier.

Si vous avez accès à un imprimante 3D vous pouvez tenter la fabrication de capuchons de touche à mettre sur les boutons poussoirs KAILH, regardez par exemple [2].

Proposition définitive

Clavier MIDI :

4x4 boutons en matrice dont

  • 12 boutons de touches de piano
  • 2 boutons pour changer d'octave
  • un potentiometre pour régler le son

Un écran LCD pour afficher l'octave sur laquelle on est actuellement.

Le code doit utiliser une bibliothèque permettant de bancher le clavier en MIDI et de le passer en USB pour le lire sur une application adaptée.

Répartition du travail

Carte

Schéma initial

I2L-2024-Carte-G6a.png

Carte routée

Schéma de la carte
vue de la carte

Composants

  • ATmega32u4 : disponible
  • quartz GND24 : disponible
  • perle ferrite MH2029-300Y : commandée
  • potentiomètre écran : disponible
  • potentiomètre volume : disponible
  • connecteur femelle 16 contacts : commandé
  • écran LCD 2 lignes : commandé
  • touches KAILH BOX-BLACK : disponibles

Carte au 23/02/2025

Première réalisation

Carte au 27/02/2025

Carte avec la quasi totalité des composants insérés

Non encore réalisé :

  • ajouter la perle de ferrite.

Carte au 07/03/2025

Fontionnement

La carte fonctionne comme un clavier MIDI et permet d'émuler un clavier sur un loiciel de MOA (Musique assistée par Ordinateur).

La carte possède :

  • 18 touches de piano
  • Un potentiomètre pour le son
  • Deux touches permettant de séléctionner une octave ou un instrument.
  • Un écran LCD permettant de visualiser l'instrument, le volume actuel, l'octave actuelle.


Afin de séléctionner un instrument ou un octave il suffit d'appuyer sur les deux boutons au dessus du potentiomètre simultanément.

Ensuite, il ne vous reste plus qu'a augmenter ou baisser l'instrument ou l'octave.

En tout, il y a 7 octaves disponibles et les instruments enregistrés dans notre carte sont :

  • Drums (Tambours)
  • Pad
  • Trumpet
  • Violon
  • Bass
  • Guitar
  • Percussion
  • Piano


Au niveau du clavier, l'oblie de diodes reliées aux touches fait que nous ne pouvons appuyer que sur 2 boutons simultanément maximum, autrement nous avons des boutons fantômes.


Le son produit par clavier sort depuis les enceintes de l'ordinateur.

Code

  • pin_t représente une broche E/S :
    typedef struct {
    	volatile unsigned char *dir;
    	volatile unsigned char *port;
    	volatile unsigned char *pin;
    	unsigned char bit;
    } pin_t;
    
  • Analyse le clavier matriciel pour détecter les pressions et les relâchements de touches. Définit les variables isPressed, isReleased et toProcess en conséquence.
    void scanKeyboard(void) {
    	for(uint8_t l = 0; l < NB_LINES ; l++) {
    
    		*lines[l].port &= ~(1 << lines[l].bit);
    
    		for(uint8_t c = 0; c < NB_COLS; c++) {
    
    			int t = l * NB_COLS + c;
    
    			if(!(*cols[c].pin & (1 << cols[c].bit))) {
    				if(!buttonPressed[t]){
    					buttonPressed[t] = true;
    					isPressed = t;
    					isReleased = -1;
    					toProcess = true;
    				}
    			} else {
    				if(buttonPressed[t]){
    					buttonPressed[t] = false;
    					isReleased = t;
    					isPressed = -1;
    					toProcess = true;
    				} 			
    			}	
    		}
    
    		*lines[l].port |= (1 << lines[l].bit);
    	}
    }
    
    Avec notre système de matrice de boutons, nous pouvons détecter jusqu'à deux touches appuyées simultanément. Au-delà, des touches "fantômes" sont détectées comme étant appuyées.
  • Nous avons créé une structure de données pour lier un bouton à une note MIDI.
    // 60 to 71 => Octave 3 in order C, C#, D, D#, E, F, F#, G, G#, A, A#, B
    // 72 TO 77 => Octave 4 up to F
    NoteMIDI notes[NB_NOTES] = { 
    	{4, 60}, {3, 61}, {1, 62}, {2, 63}, {0, 64}, {9, 65},
    	{8, 66}, {7, 67}, {6, 68}, {5, 69}, {14, 70}, {13, 71},
    	{12, 72}, {11, 73}, {10, 74}, {19, 75}, {18, 76}, {17, 77}
    };
    
    Notre clavier permet de changer d'octave, et donc la hauteur de nos notes.
  • Concernant le volume (potentiomètre) :
    unsigned int ad_capture(void){
        ADCSRA |= (1<<ADSC);                      // Start conversion
        while(bit_is_set(ADCSRA, ADSC));          // Wait for conversion to complete
        return ADCH;                              // Return 8-bit result (0-255)
    }
    
    
    uint8_t convert_volume(uint8_t volume, uint8_t maxVolume) {
    	return (volume * maxVolume) / MAX_POT; 
    }
    

Démonstrations

Rendus

Projet KiCAD : Fichier:I2L-2024-Carte-G6.zip

Programmes : Fichier:I2L-2024-Programmes-G6.zip