Les gens aiment la musique. Beaucoup de gens savent jouer des instruments de musique. Et certains essaient d'improviser et même de composer de la musique. Les instruments de musique électroniques peuvent être connectés à votre ordinateur pour plus de possibilités créatives. Cela semble être une question simple, mais la plupart des adaptateurs USB-MIDI chinois bon marché sont médiocres. Peu importe comment j'ai fabriqué mon adaptateur MIDI2USB, je vous invite à lire
Formulation du problème
Il y a quelques années, mon neveu qui étudie la musique a commencé à improviser et à composer de la musique. Je voulais que son travail ne soit pas perdu, mais j'ai réussi à enregistrer ses études musicales uniquement sur un dictaphone. La qualité de cet enregistrement n'était pas satisfaisante. Je voulais enregistrer des notes directement dans Cubase ou MuseScore, puis les éditer. Pour cela, j'ai décidé d'acheter un adaptateur (convertisseur) USB-vers-MIDI chinois.
Anecdote sur le sujet
:
— , !
— , ?
— !
— , !
— , ?
— !
Ce câble adaptateur est bon marché et ne fonctionne pas bien. Le transfert de données du synthétiseur (piano électrique) vers l'ordinateur ne fonctionne pas. Si vous jouez avec un seul doigt, vous pouvez enregistrer plusieurs notes, et lorsque vous prenez un accord ou jouez des gammes, l'adaptateur se bloque et se transforme en brique. Une autre direction, à savoir le transfert de données de l'ordinateur vers le synthétiseur fonctionne bien. Des histoires similaires peuvent être trouvées dans les critiques de nombreux acheteurs.
Façons de finaliser l'adaptateur chinois
Il existe de nombreuses discussions sur Internet sur la façon d'améliorer ou de modifier l' adaptateur chinois. Dans certaines versions de cet adaptateur, un optocoupleur est fourni, mais non soudé, qui fournit une isolation galvanique entre l'ordinateur et le synthétiseur. Hélas, dans mon cas, la révision a été difficile, car au lieu d'un optocoupleur, deux transistors NPN sont installés. Notez que la norme MIDI spécifie directement l' utilisation d'un opto-isolateur, par exemple PC900V ou 6N138. Les optocoupleurs H11L1M (DIP-8) ou H11L1SM (SO-6) ont des caractéristiques similaires. D'autres composants avec des paramètres appropriés peuvent être utilisés.
Fig. 2. Adaptateur chinois en cours de démantèlement. Photo de l'auteur.
La photo montre qu'il y a suffisamment d'espace dans le boîtier pour accueillir l'opto-isolateur et les éléments associés. Certains artisans soudent les composants existants et installent un opto-isolateur avec un "kit carrosserie" à leur place. Évidemment, cette opération nécessite non seulement des connaissances, mais également une bonne motricité manuelle.
Mais il ne suffit pas de fournir une isolation optique entre l'instrument de musique et l'ordinateur. Un oscillateur ou un résonateur à cristal de précision est également nécessaire pour garantir que l'UART série est cadencé conformément à la norme MIDI. L'adaptateur chinois que j'ai acheté ne dispose pas seulement d'un optocoupleur, mais aussi d'un résonateur à quartz. Bien sûr, il existe des microcircuits dans lesquels les unités d'horloge sont calibrées en usine, mais il n'y a rien de tel. En général, les performances de ce produit chinois sont faibles. Il existe des adaptateurs construits sur la puce CH345 - un convertisseur USB vers MIDI dans le package SSOP-20, mais ce n'est pas mon cas. La puce CH345 est dotée de balises USB matérielles. ID du fournisseur: 1a86, ID du produit: 752d. Cependant, tout microcircuit «de gauche» peut (et fait) donner les mêmes identifiants et peut même «prétendre» être n'importe quoi.
Le dernier petit défaut que j'ai trouvé dans l'adaptateur chinois est le logiciel (firmware). Plus précisément, il s'agit d'une petite taille de tampon pour les points de terminaison, seulement 8 octets chacun. Cela suffit pour transmettre les notes pressées, car le message MIDI via l'interface USB se compose de 4 octets (numéro de câble, numéro de commande et 2 octets de données). Mais toutes les extensions, par exemple SysEx, peuvent être plus volumineuses.
Après un certain temps, j'ai acheté un autre câble adaptateur, qui s'appelait «Professional USB MIDI Interface». Cet adaptateur était nettement plus cher et fonctionnait nettement mieux, mais toujours avec des erreurs. Cela s'est manifesté dans le fait qu'après quelques minutes de lecture du synthétiseur, il a soudainement commencé à manquer les frappes, ou vice versa - n'a pas perçu le relâchement de la touche. J'ai été déçu des résultats des adaptateurs chinois et j'ai décidé de suivre le conseil: "Si vous voulez bien faire quelque chose, faites-le vous-même."
Partie matérielle
Tout d'abord, il était nécessaire de réfléchir au schéma du futur appareil et d'étudier l'expérience d'autres ingénieurs. L'adaptateur existant avait l'air très bien à l'extérieur, j'ai donc décidé d'utiliser un boîtier, des LED et des câbles blindés. De plus, à Moscou, les câbles MIDI sont plus chers qu'un adaptateur chinois prêt à l'emploi. J'ai sorti la carte chinoise, mesuré ses dimensions et commencé à étudier la norme MIDI et les projets MIDI réussis dans le domaine public.
Fig. 3 Adaptateur USB-MIDI dans le boîtier et avec les câbles.
Au moment d'écrire ces lignes, je connais plusieurs projets intéressants:
- Schéma de la documentation de la puce CH345 de Nanjing Qinheng Microelectronics.
- Anciens projets sur microcontrôleurs Atmega avec implémentation logicielle du protocole USB. Ils utilisent le mode basse vitesse, qui est obsolète et non pris en charge dans Windows 7.
- Bibliothèque MIDIUSB pour cartes Arduino avec prise en charge matérielle de l'interface USB (Atmega32u4, Cortex-M), ainsi que Maple, etc.
Les schémas électriques de tous les projets contiennent de nombreux fragments d'échantillons basés sur les recommandations de la norme MIDI . Il restait donc à choisir un microcontrôleur avec prise en charge du mode USB Full Speed, trouver un optocoupleur PC900V et une prise DIN-5 (MIDI) en vente.
Disposition du conseil
Le cœur de mon adaptateur MIDI2USB est un microcontrôleur EFM8UB20F64G 8 bits de Silicon Laboratories. Je l'aime vraiment et je l'utilise partout où je peux. Ce contrôleur est le successeur (après le changement de marque) du contrôleur C8051F380, qui a remplacé le légendaire C8051F320 - un développement réussi de Cygnal, qui a été acheté par SiLabs en 2003.
Je vais lister mes arguments en faveur du microcontrĂ´leur EFM8UB20F64:
- la commodité du développement logiciel, qui se traduit par la présence de GPIO, SPI, UART, USB, PCA rapides et faciles à utiliser;
- amélioré 8051-core (1-2 cycles par instruction, 48MIPS), changement de fréquence "à la volée";
- régulateur de tension intégré, tolérance de sortie à + 5V, courant jusqu'à 100 mA;
- générateur d'horloge précis intégré calibré à partir de l'hôte USB (± 0,25%);
- la disponibilité des bibliothèques USBXpress, VCPXpress, USB Device API et des exemples pour un démarrage rapide;
- pur errata.
C'est un plaisir de programmer ce contrôleur, car il existe peu de registres et vous pouvez vous concentrer sur la résolution d'un problème appliqué. Hélas, les opérations arithmétiques (en particulier celles de 32 bits) sont lentes, mais sinon EFM8 est bon. Le développement de logiciels pour les périphériques USB n'est pas une tâche facile. Et ici, le principal avantage des contrôleurs SiLabs est les bibliothèques USBXpress, VCPXpress, USB Device API. Même Texas Instruments utilise des contrôleurs C8051F320 dans leurs cartes SmartRF.
L'optocoupleur est le deuxième composant le plus important de l'adaptateur. J'ai décidé de prendre le Sharp PC900V car c'est exactement ce qui est indiqué dans le diagramme de spécifications MIDI recommandé. La particularité de cet optocoupleur est des temps d'allumage et d'extinction rapides (1 μs et 2 μs), ainsi que la présence d'une sortie numérique. Mais il y a aussi des inconvénients - la grande taille du microcircuit (7x10 mm) et l'épuisement de 50% après 5 ans de fonctionnement. Les dimensions de l'optocoupleur ne permettaient pas de marquer tous les composants sur un côté de la carte. Je ne voulais pas non plus abandonner le connecteur MIDI, qui prenait beaucoup de place.
Fig. 4 Face arrière de la carte avec optocoupleur PC900V et LED. Photo de l'auteur.
L'étage de sortie est assemblé selon le schéma standard recommandé sur une puce logique 74LVC2G04, composée de deux onduleurs. L'objectif principal de ce composant est de convertir les niveaux de signaux logiques de 3V => 5V et de fournir un courant de sortie d'au moins 10 mA.
Une autre anecdote
:
- , , , , , …
. :
— - ?
— , !
- , , , , , …
. :
— - ?
— , !
Les autres composants remplissent des fonctions auxiliaires et n'affectent pas de manière significative le fonctionnement de l'appareil. Les résistances, condensateurs, diodes et LED peuvent être remplacés raisonnablement. Au lieu d'un connecteur mini-USB, vous pouvez mettre un micro-USB ou créer un connecteur à broches pour souder le câble, comme le font les Chinois. Le connecteur MIDI prend beaucoup de place et ne rentre pas dans le boîtier, il n'est donc utilisé que dans la version adaptateur sans boîtier. Les signaux MIDI-IN et MIDI-OUT sont acheminés vers l'en-tête de broche pour le câblage du câble. En général, l'emplacement des LED et des connecteurs doit être ajusté pour leur placement optimal dans le boîtier.
Fig. 5 Versions de débogage et en boîte de l'adaptateur MIDI2USB. Photo de l'auteur.
Le courant de consommation totale ne dépasse pas 50 mA. Il se compose des parties suivantes:
- microcontrĂ´leur, 15mA;
- trois LED, 15mA (3x5mA);
- microcircuit 74LVC2G04, 10 mA;
- optocoupleur PC900V, 10 mA.
Le PCB à 2 couches a été fabriqué par des Américains à OSH Park , 1,6 mm d'épaisseur, 0,035 mm de cuivre, matériau FR-4.
Partie logicielle
La création de logiciels pour les équipements est une étape importante et cruciale du développement. Heureusement, tous les systèmes d'exploitation modernes ont des pilotes pour les périphériques MIDI USB. La tâche est réduite et il vous suffit d'écrire le firmware de l'adaptateur.
J'utilise généralement Keil uVision PK51 en conjonction avec Configuration Wizard 2, parfois IAR Embedded Workbench et très rarement SiLabs Simplicity Studio. Chaque environnement a des avantages et des inconvénients. Dans ce projet, j'ai décidé d'utiliser IAR parce que je voulais avoir "C avec classes". De plus, le compilateur IAR permet d'accéder à tous les bits des registres système. Par exemple, P2_bit.B0 = 1; ou PCA0MD_bit.WDTE = 0;
Il n'est pas nécessaire d'utiliser les "constantes magiques" ou les expressions de bits à plusieurs niveaux qui sont pleines de CMSIS ou "SI_EFM8UB2_Register_Enums.h". Hélas, toutes ces fonctionnalités sont déclarées dans le fichier ioEFM8UB20F64G.h, qui s'est avéré incompatible avec les bibliothèques si_toolchain.h (par exemple, la macro B0..B3). Je n'ai pas traduit le projet en Keil uVision PK51, mais j'ai simplement écrit du code C compatible pour tous les environnements de développement.
Le code du projet est divisé en plusieurs parties fonctionnelles
- Le fichier "main.c" contient le point d'entrée, les déclarations des variables globales, un appel pour initialiser les périphériques et la boucle principale du programme.
- Le fichier "init.c" contient les paramètres de synchronisation, les ports, l'UART et ses interruptions.
- Le fichier descriptors.c contient des descripteurs USB pour le périphérique Audio Class.
- Le fichier "midi.c" contient deux fonctions pour convertir les messages MIDI en événements USB et vice versa. Une machine à états est utilisée.
- Le fichier "usbconfig.h" contient des macros et des définitions (#define) pour configurer les modes de fonctionnement de la bibliothèque d'API du périphérique USB.
Jetons un coup d'œil à la fonction main () avec les ports, les périphériques et la boucle principale.
int main( void )
{
WDT_Init(); // Disable WDTimer (not used)
PORT_Init(); // Initialize ports (UART, LEDs)
SYSCLK_Init(); // Set system clock to 48MHz
UART0_Init(); // Initialize UART0 @31250, 8-N-1
USBD_Init( &usbInitStruct ); // Initialize USB, clock calibrate
LED_IN = 1; // Blink LED
LED_OUT = 1; // Blink LED
IE_EA = 1; // Global enable IRQ
while(1)
{
//--- MIDI => USB
if( nMidiCount > 0 )
{
IE_EA = 0; // Begin: Critical section
if( USB_STATUS_OK==USBD_Write(EP1IN,aMidiBuffer,nMidiCount,false) )
{
nMidiCount = 0; // Reset MIDI data byte counter
}
IE_EA = 1; // End of: Critical section
LED_IN = 0; // Turn off input LED
}
//--- USB => MIDI
if( nUsbCount )
{
uint8_t i;
LED_OUT = 1; // Turn on Led on New packet
for(i = 0; i < nUsbCount; i++) // Process every data byte
{
USB2MIDI( aUsbBuffer[i] ); // Convert USB packet into MIDI
}
nUsbCount = 0; // Reset counter
USBD_Read(EP2OUT, aUsbBuffer, sizeof(aUsbBuffer), true);
LED_OUT = 0; // Turn off Led, when done
}
}
}
La bibliothèque SiLabs pour les périphériques USB se compose d'un ensemble de sous-programmes qui sont compilés et inclus dans le projet en fonction des paramètres du fichier «usbconfig.h». Ceci est très similaire à la bibliothèque "libusb, V-USB" trouvée dans le code pour les microcontrôleurs d'Atmel (maintenant Microchip). Il convient de noter que SiLabs a une bonne bibliothèque pratique du point de vue du programmeur.
Les descripteurs (descripteurs) du périphérique, la configuration et les interfaces jouent un rôle important dans le fonctionnement de tout périphérique USB. À l'aide de ces descripteurs, l'appareil informe l'hôte (ordinateur) de ses exigences, capacités, paramètres, etc. Une fonction pour gérer les demandes de descripteurs se trouve généralement dans chaque bibliothèque USB, et le programmeur est seulement tenu de remplir correctement les structures de données contenant ces descripteurs.
Code avec descripteurs
SI_SEGMENT_VARIABLE
(usbDeviceDesc[], const USB_DeviceDescriptor_TypeDef, SI_SEG_CODE) =
{
USB_DEVICE_DESCSIZE, // bLength, 18 bytes
USB_DEVICE_DESCRIPTOR, // bDescriptorType, 1
htole16(0x0110), // bcdUSB Ver, 1.10
0x00, // bDeviceClass, 0 for Audio
0x00, // bDeviceSubClass, 0 for Audio
0x00, // bDeviceProtocol, 0 for Audio
SLAB_USB_EP1IN_MAX_PACKET_SIZE, // bMaxPacketSize0, 64 bytes
htole16(0x1209), // idVendor, Free GPL (SiLabs 0x10C4)
htole16(0x7522), // idProduct
htole16(0x0100), // bcdDevice, 1.00
0x01, // iManufacturer string
0x02, // iProduct string
0x03, // iSerialNumber (no serial string)
0x01 // bNumConfigurations
};
Tous les descripteurs, la topologie et la terminologie sont détaillés et détaillés dans la norme «Définition de classe de périphérique de bus série universel pour les périphériques MIDI» . Et pour un démarrage rapide et une immersion dans le sujet, il suffit d'étudier les informations fournies par les programmes "usbview.exe" du Windows Driver Kit 7600 ou "USB Descriptor Dumper" . Quelque chose que vous pouvez même copier dans votre programme.
Fig.6 Informations sur les descripteurs dans le programme "usbview.exe" Les
descripteurs et les tableaux et structures correspondants se trouvent dans la mémoire flash du microcontrôleur (segment de code), car ces données ne changent pas (constantes). Le stockage des constantes dans la mémoire flash est une astuce de programmation typique qui vous permet d'économiser de la RAM.
Faites attention aux champs Vendor_ID et Product_ID dans la structure du descripteur de périphérique. Il s'agit d'une paire de chiffres permettant d'identifier de manière unique le périphérique USB. Pour obtenir un tel numéro pour votre appareil, vous devez payer de l'argent à l'organisation USB-IF ou envoyer une demande au propriétaire du Vendor_ID existant (fabricant du microcontrôleur) et obtenir le Product_ID. Et vous pouvez, par exemple, aimer les Chinois pour utiliser le VID et le PID les plus appropriés des autres. Pour les projets open source, il existe une option pour obtenir un Product_ID gratuit .
Un autre point à prendre en compte lors du développement de périphériques USB de la classe audio MIDI Streaming sont les connecteurs (Jack). Les connecteurs sont des entités imaginaires (virtuelles) pour décrire la topologie et les connexions entre un périphérique et un hôte. Ils sont d'entrée (In Jack) et de sortie (Out Jack), internes (Embedded) et externes (External). Chaque connecteur a un Jack_Id unique (nombre de 0 à 15). Les connecteurs de sortie contiennent le numéro d'identification de la source, c'est-à -dire numéro de connecteur pour la connexion. Enfin, les points de terminaison audio (EP) fonctionnent au-dessus des canaux formés (flux d'entrée et de sortie). Ce sont des EP en masse presque ordinaires qui contiennent des informations de liaison de connecteur dans leurs descripteurs.
Figure: 7 Jacks et flux virtuels vers USB (classe MIDI).
Descripteurs de prise MIDI
// EMB: IN Jack #1 <-----> EXT: OUT Jack #4
// EMB: OUT Jack #3 <-----> EXT: IN Jack #2
//--- Class-Specific MS Interface Header Descriptor, p.40
USB_MIDI_INTERFACE_DESCSIZE, // bLength, 7 bytes
USB_CS_INTERFACE_DESCRIPTOR, // bDescriptorType, 0x24
MIDI_CS_IF_HEADER, // bDescriptorSubtype, 0x01
0x00, // bcdADC(LSB)
0x01, // bcdADC(MSB), 0x0100 (version)
0x41, // wTotalLength(LSB), 65 bytes
0x00, // wTotalLength(MSB)
//--- MIDI IN JACK EMB(it connects to the USB OUT Endpoint), p.40
USB_IN_JACK_DESCSIZE, // bLength, 6 bytes
USB_CS_INTERFACE_DESCRIPTOR, // bDescriptorType, 0x24
MIDI_CS_IF_IN_JACK, // bDescriptorSubtype, 0x02
MIDI_JACK_TYPE_EMB, // bJackType, 0x01 (embedded)
1, // bJackID, #1
0, // Jack string descriptor, unused
//--- MIDI IN JACK EXT, p.40
USB_IN_JACK_DESCSIZE, // bLength, 6 bytes
USB_CS_INTERFACE_DESCRIPTOR, // bDescriptorType, 0x24
MIDI_CS_IF_IN_JACK, // bDescriptorSubtype, 0x02
MIDI_JACK_TYPE_EXT, // bJackType, 0x02 (external)
2, // bJackID, #2
0, // Jack string descriptor, unused
//--- MIDI OUT JACK EMB (connects to IN Endpoint), p.41
USB_OUT_JACK_DESCSIZE, // bLength, 9 bytes
USB_CS_INTERFACE_DESCRIPTOR, // bDescriptorType, 0x24
MIDI_CS_IF_OUT_JACK, // bDescriptorSubtype, 0x03
MIDI_JACK_TYPE_EMB, // bJackType, 0x01
3, // bJackID
1, // bNrInputPins
2, // baSourceID, this <=> Jack #2
1, // baSourcePin
0, // iJack, unused
//--- MIDI OUT JACK EXT, p.41
USB_OUT_JACK_DESCSIZE, // bLength, 9 bytes
USB_CS_INTERFACE_DESCRIPTOR, // bDescriptorType, 0x24
MIDI_CS_IF_OUT_JACK, // bDescriptorSubtype, 0x03
MIDI_JACK_TYPE_EXT, // bJackType, 0x02
4, // bJackID
1, // bNrInputPins
1, // baSourceID, this <=> Jack #1
1, // baSourcePin
0, // iJack, unused
L'échange de données dans un appareil audio USB de classe MIDI consiste en la transmission de paquets 32 bits (USB-MIDI Event Packet). Des messages de 1, 2 ou 3 octets sont reçus de l'appareil MIDI. Lors du transfert via USB, un octet de tête avec un numéro de câble et un code de commande est ajouté à ces octets. Si le paquet est inférieur à 4 octets, il est complété par 0. Dans la version actuelle du micrologiciel, je ne remplis pas de zéros jusqu'à la bordure 32 bits. Ça marche. La question reste ouverte.
Par exemple, dans le câble n ° 1, la commande pour appuyer sur la touche Note On (temps de transmission 960us) est convertie en le paquet suivant:
MIDI: 0x90 0x60 0x7f => USB: 0x19 0x90 0x60 0x7f
Fig.8 Schéma du paquet d'événements USB-MIDI de la spécification USB.
typedef union
{
struct PACKET
{
uint8_t cable : 4; // Cable Number (we use #0)
uint8_t cin : 4; // Code Index Number (cmd: 0x08)
uint8_t cmd; // MIDI command (status byte)
uint8_t data1; // MIDI data byte #1
uint8_t data2; // MIDI data byte #2
};
uint8_t buffer[sizeof(struct PACKET)];
} MIDI_EVENT_PACKET;
La conversion directe et inverse est effectuée par les fonctions MIDI2USB () et USB2MIDI () . Dans ces fonctions, une machine à états est utilisée, lorsque, à l'arrivée des données d'entrée, la fonction passe de l'état inactif (IDLE) à l'état de réception des commandes (STATUS), puis à l'état de réception des données (DATA), et, enfin, à l'envoi des données avec un retour à son état d'origine attentes.
Dans le protocole MIDI, les octets de données sont essentiellement 7 bits (0..127). Ils ont toujours le 8ème bit le plus significatif mis à 0. Les commandes (octets d'état), au contraire, viennent toujours avec le bit le plus significatif mis à 1, c'est-à -dire ont des valeurs de 128 à 255.
Fig. 9 Types d'octets dans le protocole MIDI.
Blague sur la capacité numérique des nombres
:
— , ?
— H, .
— , 11-22-33?
— H, 11-22-34.
— H ! , !
— , ?
— H, .
— , 11-22-33?
— H, 11-22-34.
— H ! , !
Tous les schémas et sources, ainsi que le firmware fini sont dans mon référentiel git . Licence MIT.
Logiciel
Après avoir installé la carte, le microcontrôleur doit être programmé. Pour ce faire, vous pouvez utiliser soit un adaptateur de débogage SiLabs C2 de marque / clone, soit J-Link v10 + (avec prise en charge EFM8), soit un chargeur de démarrage flashé en usine (révision Rev-B), ou, enfin, Arduino avec un script approprié. Pour vérifier et déboguer les messages MIDI, MIDI-OX est d'une grande aide .
Fig.10 Interface du programme MIDI-OX.
Si vous travaillez avec Cubase, vous devez installer les pilotes Asio, car lorsque vous utilisez DirectSound et DirectInput, il y a un délai entre la pression d'une touche et la lecture de la note. La latence n'est pas liée au matériel et est une caractéristique de l'implémentation du système d'exploitation. En général, l'appareil remplit parfaitement ses fonctions avec l'instrument Casio CDP-100.
Fig.11 Interface de Cubase 5.
Le micrologiciel expérimental a généré le plus grand flux possible de notes et d'autres commandes MIDI. La cacophonie était terrible, mais tout fonctionnait comme prévu. Et avec MuseScore 3.2, vous pouvez enregistrer et lire des fichiers intermédiaires.
Dernière blague
1990-. . — . . :
— , !
— , ! — !
— ! !
— … . !
— ! !
. . , , , … . , . :
— , , ?
— , !
— , ! — !
— ! !
— … . !
— ! !
. . , , , … . , . :
— , , ?
RĂ©sultats des travaux
L'adaptateur fonctionne! Il semble que j'ai réussi à faire un bon convertisseur MIDI vers USB. Pour mon appareil, j'ai utilisé un étui, des pièces et des câbles d'un adaptateur chinois. Le connecteur mini-USB s'est retrouvé profondément dans le boîtier et j'ai dû refaire le câble USB et travailler avec un fichier. Les LED, bien qu'à un angle, s'insèrent étroitement dans les trous. La carte doit être modifiée pour le cas chinois.
Figure: 12. Fiche mini-USB démontée compacte.
La décision d'utiliser le microcontrôleur EFM8UB20 8 bits peut sembler controversée à certains. Il existe bien sûr d'autres options et contrôleurs. Une autre manière est de choisir une solution purement matérielle sur le convertisseur CH345 et de fabriquer l'appareil selon le circuit de référence recommandé par les chinois. Mais ma version est universelle, tk. vous permet de modifier le micrologiciel, d'ajouter la fonctionnalité souhaitée ou de corriger les erreurs trouvées. En fin de compte, j'ai acquis des connaissances, de l'expérience et une satisfaction morale du projet fini. Et enfin, j'ai terminé mon article, et vous avez fini de le lire.
Liens utiles
- Norme USB pour les appareils MIDI
- Spécification MIDI 1.0
- Comparaison des adaptateurs USB-MIDI
- Puce CH345T
- Écoutez les œuvres du jeune compositeur
- Projets ouverts de l'auteur
Merci de votre attention.