Convertisseur Midi/CV
- 45 réponses
- 4 participants
- 3 533 vues
- 8 followers

redpill

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/
- 1
- 2

Rémy M. (chimimic)

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

redpill

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/

Rémy M. (chimimic)


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

redpill


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/

Rémy M. (chimimic)


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

redpill

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"

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

http://www.acxsynth.com/matrix/matrixfr.htm
rumorofsmoke.github.io/

Rémy M. (chimimic)

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.
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 !
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

redpill

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

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/

Rémy M. (chimimic)

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

redpill

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/

Rémy M. (chimimic)

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

redpill

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

Rémy M. (chimimic)


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

redpill

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

Rémy M. (chimimic)

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

redpill

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

redpill

rumorofsmoke.github.io/

Rémy M. (chimimic)

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

redpill

rumorofsmoke.github.io/

redpill

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/

redpill


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/
- < Liste des sujets
- Charte
- 1
- 2