Clavier MIDI avec Vélocité

Bonjour à tous,
Pour mon nouveau projet, je vais utiliser un clavier 25 touches.

Ce clavier est matricé et utilise 2 switch par touche dans le but de gérer la vélocité.
Il y a donc 8 lignes et deux fois 4 colonnes.
Savez vous s'il existe une bibliothèque ou si cela à déjà été fait ?
merci pour votre aide.

Bonjour,

Tu veux faire quoi avec ce clavier?

Schémas, code, ça manque cruellement de détails comme demande.

Je veux détecter quelles touches sont enfoncées pour les envoyer en MIDI.
Donc gestion d'un clavier matricé 8 x 4 et envoi de la note sur le port série.
Tout cela est archi classique et ne me pose pas de problème.

La question concerne la gestion de la vélocité du jeu sur les touches. Pour cela chaque touche est équipée non pas d'un switch mais de deux et la vélocité correspond au temps écoulé entre la fermeture du switch 1 et la fermeture du switch 2 lors de l'enfoncement de celle-ci. (Plus l'appui est rapide sur la touche, plus le temps est court).

Comme cela est un tout petit problème par rapport à mon projet complet et afin de gagner du temps je voulais juste s'avoir si quelqu'un avait déjà travailler sur le sujet et s'il existe une librairie ou un bout de code gérant cela.

Bonjour,

Je ne connais pas de bibliothèque spécifique à ce genre de problème.

Mais pour ma culture personnelle, le K-25m ne possède pas de MIDI OUT sur prise DIN où tu peux récupérer les infos ?

Non, le K-25m est juste un clavier sans aucune électronique.
Il est utilisé comme clavier de la série Boutique de Roland et la prise midi est sur le synthé.

hello

si j'ai bien compris, il faut imaginer deux claviers l'un sur l'autre.
lorsque tu enfonces une touche, son jumeau sera enfoncé x secondes après.

tu n'enfonces jamais deux touches du clavier supérieur en même temps?

pour moi tu détecte l'enfoncement d'une touche, tu déclenche un compteur( timer ou millis()) que tu relèves lorsque la touche jumeau du deuxième clavier est enfoncé.

avec ce temps, tu gères la vélocité.

et pour l'instant, quel est ton code ?

@dfgh
Oui, ç'est exactement cela, c'est comme un double clavier.
Par contre pour être polyphonique, il faut gérer la possibilité d'enfoncement simultané de plusieurs touches.
@pepe
Les diodes sont présentes sur le pcb du clavier. Il est câblé en 8 lignes et 2 x 4 colonnes. Les anodes des diodes étant sur les lignes.
Comme dans mon projet j'ai aussi un afficheur 4x20 et surtout 9 encodeurs que je vais gérer par interruption, je pense utiliser une DUE.

Bonjour,

Ok, j'ai bien compris que le K-25M ne sort que les contacts sur un connecteur.
Pour économiser des E/S, je te suggère d'utiliser un démultiplexeur 3 par 8 (ex: 74HC238) pour activer les colonnes (par un zéro), et un multiplexeur 8 par 1 (ex: 74HC151) pour scruter les lignes avec une résistance de 'pullup'.
Le nombre d'E/S sera de 7 au lieu 16.
De plus, de mon point de vue, la programmation s'en trouvera simplifiée.

J'utilise la DUE, pour moi c'est un excellent choix, d'autant plus que n'importe quelle entrée digitale peut être utilisée en interruption.

phm78:
Je veux détecter quelles touches sont enfoncées pour les envoyer en MIDI.
Donc gestion d’un clavier matricé 8 x 4 et envoi de la note sur le port série.
Tout cela est archi classique et ne me pose pas de problème.

La question concerne la gestion de la vélocité du jeu sur les touches.

Bonsoir
Tu es absolument certain de la configuration purement matricielle ?
Tu a établi le schema de la matrice ?
lien vers ?

Oui, c'est une double matrice.
Lors de l'appui sur une touche, le switch sur la colonne Cx1 se ferme puis c'est celui de la colonne Cx2. le temps entre les deux permet de mesurer la vélocité.

Voici son schéma de câblage.

Bonjour,
Dans ton message #7 tu dis que les anodes des diodes sont sur les lignes et sur ton dessin ce sont les cathodes.

Je te refais donc ma proposition inversée:

Démulitplexeur 3 vers 8 (74HC238) sur les lignes et multiplexeur (74HC151) 8 vers 1 pour les colonnes.

bilbo83:
Bonjour,
Dans ton message #7 tu dis que les anodes des diodes sont sur les lignes et sur ton dessin ce sont les cathodes.

Je te refais donc ma proposition inversée:

Démulitplexeur 3 vers 8 (74HC238) sur les lignes et multiplexeur (74HC151) 8 vers 1 pour les colonnes.

bonsoir
Une fois le doute levé (diodes) c'est surement une bonne approche pour faire du scan.
Aprés une fois l'info "timing brute" récupérée , il faudra surement adapter la velocité (0/127) , la courbe de progression n'étant peut etre pas vraiment lineaire.

la courbe de progression n'étant peut être pas vraiment linéaire.

Bonjour,
intéressant
une formule pour calculer un tableau ?
je vais épier il y a d'autres applications potentielles

Bonjour,

Désolé pour l'erreur sur le sens des diodes au message #7
Il faut se fier au schéma qui est juste car tout a été vérifié de visu et à l'ohmmètre.

J'utilise une DUE, j'ai donc beaucoup d'entrées sorties je ne vais donc pas utiliser de multiplexeur.

Je connecte les lignes sur les pins 38 à 45 de la DUE comme OUTPUT et les initialise à HIGH
Je connecte les colonnes sur les pins de la DUE de 52 à 46 et de 53 à 47 comme INPUT avec PULLUP
Je scan les lignes avec un niveau LOW et si la colonne = LOW la touche est enfoncée.

Effectivement, pour le calcul de la vélocité, il est possible d'utiliser plusieurs courbes (linéaire, log, expo...)

Bonjour,

Peut-être, dans ce cas, essais d'utiliser pour les sorties et pour les entrées, les 8 broches d'un même port.
Ensuite, soit tu écrit/lit directement les ports en une seule instruction en travaillant directement avec les registres. Ou si tu préfère, utilise la 'lib digitalFast'.

Ci-dessous un petit programme de test pour valider le schéma et le fonctionnement du clavier.
Il reste maintenant à gérer les deux matrices et la vélocité.

//--------------------------------------------------------------------------------------------------------------------
// Roland MIDI Keyboard K-25M, programme de test de chaque matrice SW1 ou SW2 indépendamment (voir ligne 29)
// (c) Philippe MARY
// Version = 20170513-001
// Carte utilisée = Arduino DUE (Attention 3.3v) - Fonctionne aussi directement avec une MEGA
// Les broches ci-dessous sont affectées comme cela pour que le connecteur du clavier s'insère directement sur la DUE
// Keyboard Lignes sur les broches 38 à 45
// Keyboard colonne matrice SW1 52, 50, 48, 46
// Keyboard colonne matrice SW2 53, 51, 49, 47
//--------------------------------------------------------------------------------------------------------------------
void setup() 
{
  for (int i = 0; i < 8; i++)
  {
  pinMode((38 + i), OUTPUT); // Les lignes sont des sorties
  digitalWrite((38 + i), HIGH); // Toutes les lignes sont HIGH
  pinMode((46 + i), INPUT_PULLUP); // Les colonnes sont des entrées avec résistance de PULLUP
  } // Fin de for i
  Serial.begin(115200); // init du terminal
} // Fin de setup()
//--------------------------------------------------------------------------------------------------------------------
void loop() 
{
  for (int ligne = 0; ligne < 8; ligne++) // Scan des lignes
  {
  digitalWrite(ligne+38, LOW); // Parce que les lignes sont sur les ports de 38 à 45
  for (int colonne = 0; colonne < 4 ; colonne++) // Lecture des colonnes
   {
    if (digitalRead(47 + ((3 - colonne) * 2)) == 0) // Mettre 46 pour matrice SW1 & 47 pour matrice SW2
          {
          int key = ((colonne * 8) + (ligne)); // Calcul de la valeur de la touche pressée de 0 à 24
          Serial.print("key = "); Serial.println(key); // Print key sur le terminal pour test
          } // fin de if  
      } // fin de for colonne
   digitalWrite(ligne+38, HIGH); // la ligne est remise à HIGH
  } // fin de for ligne
} // Fin de loop()
//--------------------------------------------------------------------------------------------------------------------

]

phm78:
Ci-dessous un petit programme de test pour valider le schéma et le fonctionnement du clavier.
Il reste maintenant à gérer les deux matrices et la vélocité.

Bonjour
une fois que tua aura validé la bonne reception de l'etat des touches (depart/arrivée)
le plus simple AMHA est de gerer 2 tableaux de 25 "timestamp"
dans lequel tu charge la valeur (microseconde ou milli) de depart pour ensuite la comparer à la valeur d'arrivée pour un indice identique.

Bonjour,
il me semble que cette méthode pallie de fait les problèmes de rebond ...

trimarco232:
Bonjour,
il me semble que cette méthode pallie de fait les problèmes de rebond ...

bonjour
oui , si tu recupere le dernier "timestamp" haut (contact touche non appuyée) et que tu le compare au premier "timestamp" bas (contact touche appuyée) , tu "te fous un peu des eventuels rebonds" 8)

Le but du jeu c'est essentiellement de rafraichir periodiquement (loop) chacune des 25 positions des 2 tables avec une info temporelle.

Si pour un indice identique chaque tables comparée (depart/arrivée) est identique (à +Delta prés, du aux timing MCU ) , c'est qu'il ne c'est rien passé ... et donc qu'il n'y a rien de plus à faire :grin:

Bonjour,
C'est bon, j'ai un programme qui fonctionne bien.
Il restera à gérer divers courbes de vélocité (log et expo) pour le moment je suis en linéaire.
Merci pour vos commentaires.

@trimarco232, je n'ai effectivement pas de problème de rebond.