Volume MIDI / Cry Baby Midi

Le module doit intégrer :
- Le réglage de volume
- un bargraph présentant le niveau de volume
- une fonction BYPASS
- une fonction MUTE
- possibilité de modifier le gabari de variation de volume
Il dispose :
- d'une LED rouge qui indique une activité MIDI
- une LED verte qui indique l'état MUTE
- une LED verte qui indique l'état BYPASS
- un bouton poussoir permettant de passer d'un gabari à l'autre
- une prise d'entrée MIDI
- une prise de sortie MIDI
- une prise d'entrée jack 6.3mm
- une prise de sortie jack 6.3mm
Hormis le titre, le programme ne nécessite pas de modification.
De la même manière il n'y a pas de modification à apporter à la partie électronique.
Principe de fonctionnement


La variation de volume est faite grâce à deux photo-résistances (LDR) en série qui sont éclairées par deux diodes électroluminescentes dont l'intensité lumineuse est inversement proportionnelle grâce à une porte NON qui inverse leur signal d'alimentation.
Ce dernier est un signal modulé en largeur d'impulsion.
Schéma structurel

Le coeur du système est un microcontroleur PIC 16877 de 20MHz.
Le choix du canal MIDI se fait grâce à 4 dip switch qui permettent de sélectionner les canaux 1 à 16. les autres dip-switch permettent de choisir la courbe de variation du volume par défaut.
A la mise sous tension, le fait de garder le bouton poussoir enfoncé lance un programme de test des éléments du circuit. Le même bouton poussoir permet également de changer de courbe de variation.
Les fonctions MUTE et BYPASS sont assurées par deux relais.
L'afficheur LCD porte la référence PC1602-LRS de la marque POWERTIP
Réalisé en C avec le logiciel d'essai MikroC de Mikroelectronica.
//-----Constantes d'affichage------------------------------------------------ const char *msg[] = { "Volume MIDI v.2 ", //0 "-----NB 2016----", //1 "----- TEST -----", //2 "canal: ", //3 " V", //4 " F", //5 " ", //6 "linear", //7 " log1 ", //8 " log2 ", //9 " log3 ", //10 "lead1 ", //11 "lead2 ", //12 "lead3 ", //13 "Mut/Bp"}; //14 //-------Tableaux de valeurs---------------------------------------------- const int nbCourbe=8; unsigned char step[nbCourbe][10] = { //courbes de variations différentes {0,40,70,100,130,155,185,210,234,255}, //0 : linear {40,150, 163,176,189,202,215,228,241,255}, //1 : log1 {40,150, 180,200,210,220,230,240,248,255}, //2 : log2 {40,170, 205,220,230,238,245,250,253,255}, //3 : log3 {200,200, 200,200,200,200,255,255,255,255}, //4 : lead1 {210,210, 210,210,210,210,255,255,255,255}, //5 : lead2 {220,220, 220,220,220,220,255,255,255,255}, //6 : lead3 {0,0, 0,0,0,0,255,255,255,255} //7 : bypass }; //---- Variables globales ------------------------------------------------ int i; // Loop variable unsigned char config; unsigned char mode; unsigned char canal;//canal MIDI (numero du canal MIDI -1) unsigned char courbe; // courbe de progression unsigned char codeMidi;//code midi unsigned char Msg_PC;//Program change unsigned char Msg_CC;//Control change char canalTxt[4]; //canal Midi en texte char codeTxt[10]; unsigned char oldNVol=0; //valeur precedente de volume unsigned char paramCC; //----------------------------------------------------------------------------- // Fonction qui prend le texte en ROM pour l'utiliser // car Lcd_Out ne gere pas les constantes (Sources Mikroelectronica) char* message(const char* ctxt) { static char txt[18]; char j; for (j=0; txt[j]=ctxt[j]; j++); return txt; } //------------------------------------------------------------------------------ void affichercanal() {
Lcd_Out(1, 1,message(msg[3])); // Ecrit le mot canal Lcd_Chr(1, 7, canalTxt[1]); Lcd_Chr(1, 8, canalTxt[2]); } //------------------------------------------------------------------------------ void afficherCourbe() { Lcd_Out(1, 10,message(msg[7+courbe])); // Ecrit le nom de la courbe } //------------------------------------------------------------------------------ void initialisation() { IRP_bit=0; //config du port A : SWITCH adcon1=6;//Port A utilise en logique et non analogique adcon0=0; TRISA = 0x3F;//Port A en entree //Config du port B : LCD TRISB = 0;//Port B en sortie Delay_ms(1000); Lcd_Init(); // Initialize LCD Delay_ms(1000); Lcd_Cmd(_Lcd_CURSOR_OFF); // Cursor off Lcd_Cmd(_Lcd_CLEAR); //Config du port D TRISD = 0x01;//Port D en sortie sauf D0 qui est en entrée PortD.F1 = 0;PortD.F2 = 0;//initialisation des relais //Config du PWM PWM1_Init(30000); // Initialize PWM1 :frequence 30000Hz //Config liaison serie UART1_init(31250); // Vitesse du port MIDI : 31250 bauds Delay_ms(100); //lecture du canal config=PortA; canal=config & 0x0F; courbe=(config & 0xF0)/16; Msg_PC=192+canal; Msg_CC=176+canal; ByteToStr(canal+1,canalTxt); Lcd_Out(1,1,message(msg[0])); // Ecrit sur la 1ere ligne Lcd_out(2,1,message(msg[1])); //ecrit version delay_ms(1000); //**************** bar graph ************************************************ char* bargraph(int blocs) { static char txt[16]="-- --"; int i; for (i=2;i