Se connecter
Se connecter

ou
Créer un compte

ou
FR
EN

Convertisseur Midi/CV

  • 45 réponses
  • 4 participants
  • 3 533 vues
  • 8 followers
Sujet de la discussion Convertisseur Midi/CV
est ce que certains auraient déja travailler sur un projet tel que celui-ci ?

faute d'avoir trouver quelque chose d'approchant (ou trop complexe) je me suis dis qu'il fallait que je me remonte les manches. Je veux vraiment le convertisseur le plus bete qui soit (dans un premiers temps du moins) qui convertit un message midi et une tension (cv).

L'idée étant d'utiliser un atmega et son périphérique UART. Il réceptionne les 3 bytes (channel, note, velocity) le dernier étant ignoré. Si le canal est bon, il décode le second byte et envois la valeur correspondante sur un DAC 8 bit (surement celui là).

parallèlement a ca, fait un circuit de gate qui doit rester a l'état haut tout le temps que la touche est maintenus.

déja est ce que 8bit serait suffisant ? ca fait une résolution de 19.5mV pour 1V/octave (j'ai pas poussé plus loins mais ca m'a l'air acceptable)

est ce que la méthode (interuption) vous semble logique ?

rumorofsmoke.github.io/

Afficher le sujet de la discussion
26
Citation :
Peut etre qu'un DAC integré serait l'idéale

C'est la solution que je conseillerais... un DAC fait maison avec un réseau R/2R impose pour une précision équivalente à celle d'un DAC tout fait, des résistances de précisions qui coûtent au final plus cher. Un DAC externe qui se pilote en I2C, SPI ou même en parallèle, sera très bien pour ton usage. On en trouve en boîtier 8 broches (DIL ou CMS), facile à ajouter sans perdre trop de place.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

27
j'avais l'idée d'utiliser ce réseau là : https://uk.farnell.com/bourns/4310r-r2r-103lf/resistor-ladder-n-w-10-10kohm-2/dp/2112797?Ntt=ladder+network

je voulais un circuit intégré plutot que de faire moi-meme avec un réséau pour les raisons que tu décris.

Mais effectivement je vais peut etre songer a mettre un DAC plus précis et avec une meilleur résolution, d'autan qu'on peut en trouver a deux cannaux (pour le CV note et la vélocité) comme le MCP4802 ou ceux que tu as mentionné plus haut il me semble.

cependant faut déja que je voille a transformer les notes midi en valeur binaire pour le DAC et là va falloir que je me casse un peu la tête.

rumorofsmoke.github.io/

28
Oui, quelque soit le DAC utilisé, tu devras adapter la valeur MIDI en une valeur qui correspond à la tension de sortie désirée. Mais tu verras, ce n'est pas très compliqué. Une formule simple, avec des opérateurs de base ;-)

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

29
bon ba je l'avais pré-sentit j'ai un peu de mal a faire la conversion midi/cv. Si on fait un cv sur l'intégralité des notes, jusqu'a la note C127 (G9) il faut que C0 (12) soit 0V et G9(127) a 5V (a condition d'avoir un ampli x2 en sortie) mais alors la conversion a proprement parler icon_facepalm.gif

Dans un premier temps je vais tacher de le faire sur 8bit en attendant les Dac 12bits.

si quelqu'un a une idée.

rumorofsmoke.github.io/

30
Simple division et multiplication :D:

Pitch = 0 pour C0, 1 pour C0#, 2 pour D0, etc.
- pour DAC 12 bits, diviser Pitch par 128 et multiplier par 4095
- pour DAC 8 bits, diviser Pitch par 128 et multiplier par 255

function DAC_PitchToWord(Pitch: byte): word;
var
  iDacValue: word;
begin
  iDacValue := word(Pitch / 128 * 255);   // 8 bits
  iDacValue := word(Pitch / 128 * 4095);  // 12 bits
  result := iDacValue;
end;

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

31
Merci Chimimic.

en fait c'est tout la manipulation que je comprends pas.

pour que je comprenne du coup

On "ré-index" les notes a partir de C0, donc on soustrait 12 a chaque message "note" de facon avoir la bonne référence (par rapport a C0)
Ensuite on mets a l'échelle par rapport a l’intégralité des notes (128).
Et ensuite on voit a quelque quantité de bits sans correspond dans la résolution (8 ou 12bits).

c'est ca ?

J'ai fait quelques tests et évidement avec un gain de 2.2 en sortie, en 8 bits, on tombe sur les bonnes valeurs. Va falloir que je trouve un AOP avec un faible taux d'offset.

Je vais tenter le coup, j'ai trouvé de PCF8591P (j'ai passé 20min a me prendre la tete pour apercevoir que j'avais oublié de mettre une patte a la masse, donc "adresse fausses" icon_facepalm.gif). Ce sont des DAC SPI, mais j'ai l'impression qu'ils sont un peu lent (j'ai une clock assez lente), faudra que je creuse un peu plus le protocol SPI.

Ceci étant, ca a remis en cause le projet de synthé. j'avais l'idée de le faire "simple" mais avec l'histoire de l'octet de velocité ca m'a donner l'idée de faire quelques chose de plus modulaire. Voire avec une matrice numérique (avec mémoires) si j'avais vraiment des ambitions démesurées :D:

http://www.acxsynth.com/matrix/matrixfr.htm

rumorofsmoke.github.io/

32
Citation :
On "ré-index" les notes a partir de C0, donc on soustrait 12 a chaque message "note" de facon avoir la bonne référence (par rapport a C0) Ensuite on mets a l'échelle par rapport a l’intégralité des notes (128). Et ensuite on voit a quelque quantité de bits sans correspond dans la résolution (8 ou 12bits). c'est ca ?

Il faut juste diviser la plage de tension 0-5 V en 128 tranches si tu veux couvrir toutes les notes.
Première note (C0) -> 0 V
Seconde note (C#0) -> (5 V / 128) * 1
Troisième note (D0) -> (5 V / 128) * 2
Quatrième note (D#0) -> (5 V / 128) * 3
etc.

Citation :
J'ai fait quelques tests et évidement avec un gain de 2.2 en sortie, en 8 bits, on tombe sur les bonnes valeurs.

Super, bravo !

Citation :
Je vais tenter le coup, j'ai trouvé de PCF8591P (j'ai passé 20min a me prendre la tete pour apercevoir que j'avais oublié de mettre une patte a la masse, donc "adresse fausses" ). Ce sont des DAC SPI, mais j'ai l'impression qu'ils sont un peu lent (j'ai une clock assez lente), faudra que je creuse un peu plus le protocol SPI.

La vitesse de conversion est spécifiée dans la doc fabricant (il est de l'ordre de une à quelques us). Si la fréquence d'horloge de ton bus SPI est de 400 kHz, la mise à jour de ta tension de sortie sera assez rapide. Si tu utilise une routine toute faite que tu trouves trop lente, rien ne t'empêche d'en créer une de ton cru, c'est très simple à faire.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

33
en fait je me suis trompé c'est un dac I2C, mais il me semble assez rapide. De tout facon la version finale sera surement en 12Bit avec un petit MCP4822 ou equivalent.

Quand je dis "test" je veux dire que j'ai fait des calculs pour voir si ca collait, mais pas encore fait en vrai. En fait j'ai essayé une fonction mais j'ai mal choisis le type de variable. Je viens de vérifier avec un petit programe et effectivement si la variable ne vas pas dans le négatif, elle va pas me donner grand chose aprés la divion par 128 :-D

ceci étant avec suelement le max et le min en guise de note (pour voir la réactivité du bus) ca marche bien.

Ceci étant, ca bugg pas mal en l'état.Le LCD dans l’interruption doit bien mettre le bazar.

rumorofsmoke.github.io/

34
Citation :
Le LCD dans l’interruption doit bien mettre le bazar.

Ca dépend de quelle interruption tu parles. S'il s'agit de l'interruption de l'UART, alors oui, ça peut poser problème. Mieux vaut laisser la priorité aux événements entrant, et utiliser le temps libre pour les ressources "affichage".

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

35
le lcd étati surtout là en guise de "débugg", je vais tacher maitenant de supprimer le superflus.

j'ai tester en "vrai", et le résutlat est assez mitigé (en 8bit du moins), la tension de sortie est quand meme un peu loins des résultats attendus. Sur le C, ca tombe pile poil mais évidement sur les autres, il y a un facteur d'erreur plus ou moins grande.

je me suis servis de ce tableau : http://www.experimentalistsanonymous.com/ve3wwg/doku.php?id=midi_note_values

rumorofsmoke.github.io/

36
Dans un premier temps, assures-toi que les infos fixes envoyées au DAC (sans tenir compte des données MIDI reçues) provoquent la tension de sortie fixe attendue. Par exemple $00 pour 0 V et $FF pour +5 V.
Ensuite, multiplie simplement par deux la valeur de la donnée de hauteur MIDI reçue avant de l'envoyer au DAC, et vois ce que ça donne.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

37
effectivement, toujours vérifier ce qu'on pense etre juste. J'ai environs une erreur de 10mV voire meme plus sur la sortie du DAC. 255 donne 4.86V (au lieu de 5V) et 127 donne 2.35V au lieu de 2.41V ect...

Bon je crois qu'il est temps de commander les DAC 12bits pour continuer.

rumorofsmoke.github.io/

38
Ou d'alimenter ton DAC actuel avec une tension d'alim un poil supérieur à +5 V ;-)

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

39
effectivement, j'ai testé hier soir. C'était un peu crade (seulement un point diviseur variable depuis l'alim globale donc sujette au changement de courrant des autre ICs). Ca a amélioré les choses mais reste cependant toujours une petite marge d'erreur.

je vais tenter de faire une alim stable pour le DAC et stabilisé pour voir ce que ca donne.

rumorofsmoke.github.io/

40
Citation :
alim stable pour le DAC

C'est ici indispensable, on travaille dans le domaine des mV.

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

41
je vais voir si il me reste un LM317. Par contre mon unique cable midi vient de me lacher grrr... Ces cables moulés sont vraiment une plaie.

rumorofsmoke.github.io/

[ Dernière édition du message le 31/10/2014 à 21:39:46 ]

42
bon malgrés le regulateur, il reste quand meme un offset de quelques mV. Je vais donc tacher de commander d'autres DAC 12bit. Pendant ce temps là je vais commencer a optimiser le code, ajouter le pitch bend et essayer d'ajouter une deuxieme canal.

rumorofsmoke.github.io/

43
Le régulateur de tension possède lui-même sa propre tolérance, en général +/-5%.
Quand on veut vraiment de la précision, on utilise une tension de référence externe pour le DAC (par exemple ADR4540 pour 4,096 V, ou AD588 pour 5,000 V).

Formateur en techniques sonores ; électronicien ; auteur @ sonelec-musique.com

44
malheuresement j'ai pas ce genre de composant. Je vais en commander en meme temps que je commenderais les DAC 12 bits. Je vais pour l'instant ajouter des fonctionalités code. (je viens d'ajouter le second canal et ca marche mal fois pas trop mal, reste a faire un peu le ménage et de voir a combiner les fonction en double)

rumorofsmoke.github.io/

45
je suis toujours sur le projet.

je n'ai pas les composants necessaires pour la mise en place du DAC. Autan voir directement avec le DAC 12 bit finale plutot que de passer du temps sur la configuration qui ne sera pas utilisé (ceci étant c'est pas perdus)

Néamoins le DAC 8 bit fonctionne mais a un offset. Rien a savoir si c'est significatif ou non dans la pratique.

Je vais donc travailler un peu sur le code en attendant de faire une commande (les frais de port comme toujours sont plus élevé que la commande). Je vais ajouter le pitch bend.

Surtout trouvé un code pour que lorsqu'une succession de note soit jouée, c'est la dernière pressé qui envois 0 au dac lorsqu'elle devient off et pas n'importe quel autre note. Je sais pas si ca fait sens ce que j'écris.

rumorofsmoke.github.io/

46
je remonte le topic pour dire que finalement ce project (comme de nombreux autres ne sera pas terminé) néanmoins il m'a permis d’intégrer le principe dans ce double séquencer CV/MIDI.

img_1758-e1432149853685.jpg

il reste encore un petit offset en sortie, je dois un peu étudier le probleme. Pour l'instant il sort en 8bit mais pas impossible que je passe sur un DAC 12BIT.

rumorofsmoke.github.io/