Le monde intérieur des Formants P432



L'histoire de la façon dont j'ai acheté un synthétiseur de manière inattendue, l'ai réparé, compris comment cela fonctionne et écrit un émulateur.

Cette histoire a commencé lors du festival Chaos Constructions le week-end dernier du mois d'août 2019. En parcourant Avito le soir à la recherche d'artefacts intéressants d'une époque révolue, je suis tombé sur un synthétiseur Formant P432 peu coûteux. Cela semblait assez familier pour les synthétiseurs numériques: dans la partie inférieure, il y a un clavier de 41 touches (3,5 octaves), dans la partie supérieure, il y a des boutons pour sélectionner un son, activer les effets de chœur et d'unisson, ainsi que régler l'effet de vibrato. Un joystick est installé à gauche du clavier, vous permettant de déplacer la hauteur de haut en bas, ainsi que de connecter en douceur le vibrato.

La chose la plus intéressante pour moi était que ce synthétiseur était numérique et produisait des sons en utilisant la méthode de la table d'ondes, c'est-à-dire qu'au moment d'appuyer sur la touche, il générait un son basé sur des données tabulaires stockées dans des puces ROM. Après une rapide connaissance des circuits sur Internet, il est devenu clair que le contrôle du synthétiseur est construit sur le microprocesseur bien connu KP580VM80 (i8080), et les sons sont stockés dans 8 puces ROM avec un volume total de 8 * 2 = 16 Kb.

Le synthétiseur a été acheté et est parti lentement de la ville du vendeur vers le bureau local de la société de transport, et j'ai continué à étudier les plans. Le vendeur a écrit dans une annonce que l'outil présente un défaut qui se manifeste sous la forme d'une respiration sifflante lorsque vous appuyez sur plusieurs touches. D'autant plus intéressant, pensai-je. "Il faudra trouver et éliminer."

Mais le principal motif d'achat était le désir de traiter avec l'appareil interne et d'extraire des échantillons de sons de la ROM du synthétiseur.

AVERTISSEMENT : Les noms des composants des nœuds et signaux du synthétiseur (autres que ceux indiqués entre «guillemets» et en grosses lettres) ont été inventés par moi et peuvent différer de ce que les développeurs voulaient. La description du fonctionnement des nœuds est basée sur mes connaissances (limitées), les matériaux provenant d'Internet et les conseils de personnes expérimentées.

Réparer


Lorsque P432 [ 2 ] est arrivé sain et sauf, la première chose que j'ai faite a été de le démonter. À l'intérieur, je ne m'attendais pas à une vue très agréable de faisceaux de fils et de plusieurs cartes de circuits imprimés.

Noeud de contrôle
La carte sur laquelle les boutons et les commandes du panneau avant sont soudés, ainsi qu'une indication des modes de fonctionnement.

Nœud de processeur
Il contient le microprocesseur KR580VM80 et d'autres puces du kit 580, une ROM de 2 Ko sur RF2, deux puces RAM statiques d'une capacité totale de 256 octets (K541RU2). De plus, des décodeurs sont installés sur la carte, qui allouent des parties de l'espace d'adressage pour l'interaction avec le clavier, avec des boutons de commande et des registres, à la sortie desquels des signaux de commande sont générés pour le nœud générateur.

Nœud d'interface MIDI
Il est installé au-dessus du nœud du processeur et se compose d'une ROM séparée avec des routines de messagerie MIDI, une logique fine et deux grands microcircuits: le contrôleur d'interruption VN59 et l'interface BB51 en série. Aux contacts TX / RX VN51, un circuit d'implémentation de boucle de courant midi standard avec isolation optocoupleur est connecté.

Noeud de choeur
Sous la forme d'une carte isolée avec uniquement entrée, sortie et alimentation analogiques. Il est implémenté sur les microcircuits KA528BR2 - lignes à retard analogiques. L'unité est très bruyante, mais donne au son une couleur intéressante.

Ensemble générateur
Le module principal du synthétiseur. Il contient 8 puces ROM de 2 Ko chacune, une logique numérique (registres, additionneurs), deux DAC, un filtre analogique à paramètres variables et une stabilisation thermique. Le noeud contient également un générateur d'horloge avec lequel le fonctionnement des registres du noeud processeur est synchronisé. La carte fille sur ce nœud a une carte VCO (générateur commandé en tension), qui est un raffinement d'usine des révisions ultérieures du synthétiseur.

Ensemble redresseur et stabilisateur
Une alimentation linéaire qui produit + 5V pour la puissance logique et + 12 / -15V pour les amplificateurs opérationnels. Le + 5V est stabilisé par le KR142EN5, dont le radiateur est le boîtier métallique du synthétiseur, et le + 12 / -15V est le stabilisateur paramétrique le plus simple sur les diodes Zener et les transistors. Une tension d'alimentation supplémentaire de -5 V pour le KR580VM50 est formée par une diode zener de -15 V directement sur la carte du processeur. La masse analogique et numérique est séparée séparément et connectée uniquement dans ce bloc.

Clavier d'instrument
Commutateur à anche, non sensible à la vélocité, comme sur les autres synthétiseurs de la radio Kachkanar de Formant.



La suppression du nœud MIDI sur une carte séparée avec sa ROM est due à la présence d'un autre synthétiseur dans la ligne P432 - le «Formant MINI», qui n'a pas d'interface MIDI et l'effet HOR. Le nœud du processeur MINI est légèrement différent dans le micrologiciel et le nœud du générateur est le même que sur P432.

Ainsi, lorsque j'ai allumé pour la première fois, j'ai remarqué deux problèmes: un niveau de signal très faible à la sortie linéaire et le son déjà mentionné lorsque vous appuyez sur plusieurs touches à la fois. Il est à noter que le P432 est un synthétiseur polyphonique, et qu'il peut jouer simultanément 4 voix (fréquences) d'un timbre. Et avec l'inclusion de l'effet UNISON, le nombre de voix simultanément augmentées à 8, deux pour chaque touche.

La raison du son silencieux a été trouvée presque immédiatement, la sortie brûlée OU K544UD1A était à blâmer.

Après l'avoir remplacé, l'instrument a commencé à sonner fort même lorsque des écouteurs passifs étaient connectés à la sortie.

Mais avec des sons étranges, la situation était très incompréhensible, car même lorsque des touches individuelles étaient enfoncées, les sons des tonalités n'étaient pas comme la démonstration P432 de YouTube.

Il a fallu un certain temps pour trouver le problème, mais finalement il a été localisé au niveau du DAC principal. Le bit élevé de l'entrée numérique n'était pas suffisant pour le reconnaître comme logique 1, donc le signal de sortie analogique a été déformé. Le coupable de cette histoire a été trouvé et éliminé, après quoi le problème a été résolu. Toutes les tonalités ont commencé à sonner clairement et sans problème en quelques clics.

Il y aurait une fin à l'histoire, mais beaucoup de temps avait déjà été consacré à la réparation, j'ai donc décidé que nous ne devrions pas nous arrêter là et nous devons le comprendre:

  • comment est le processus de synthèse sonore
  • ce qui est stocké dans la ROM du générateur
  • comment fonctionne le filtre et ses caractéristiques
  • où la configuration de chaque paramètre de tonalité et d'enveloppe est stockée

Le résultat de ce travail devait être une émulation logicielle de P432 en utilisant les données de la ROM d'origine.

Ensemble générateur


La forme d'onde en sortie du DAC principal du générateur est formée par le principe de la synthèse numérique directe (DDS) [ 1 ]. Le signal analogique reçu est passé à travers un filtre passe-bas, puis, si nécessaire, il est mélangé à la sortie de l'ensemble de chœur, amplifié par un amplificateur de sortie et envoyé à une sortie linéaire. Le filtre en P432 est fabriqué selon le schéma précédemment utilisé dans le synthétiseur Polyvox [ 3 ].


Le schéma montre le générateur et ses principaux blocs fonctionnels. Les flèches orange indiquent les entrées et sorties des signaux numériques externes, les signaux noirs - numériques à l'intérieur du module, les signaux bleus - analogiques.


Tout d'abord, considérez les entrées et sorties:

  • Input “Frequency” (11 bits) - pour chaque voix, y compris à l'unisson, les valeurs correspondant à la touche ou à la note MIDI pressée proviennent du nœud du processeur.
  • Entrée amplificateur (8 bits): valeur d'enveloppe pour l'amplitude du signal.
  • Input “Filter” (8 bits) - valeurs de l'enveloppe de la fréquence de coupure du filtre.
  • Entrée «Contrôle» - (8 bits) - 3 bits de poids faible sont responsables de la sélection de la forme d'onde, 2 bits pour le décalage du filtre, 2 autres pour le niveau de qualité du filtre Q Q (résonance) et le dernier bit détermine si l'effet UNISON est activé ou non.
  • Sortie «Adresse» (3 bits) - responsable de la synchronisation avec le nœud du processeur.

Voyons maintenant comment fonctionnent les principaux blocs du nœud.

Le circuit de synchronisation à l'aide de multivibrateurs, d'un compteur et d'éléments logiques génère des impulsions de commande pour différents modules du générateur et donne le numéro de voix actuel à la sortie «Adresse». Lorsque le mode "Adresse" UNISON est actif, il prend les valeurs [0,1,2,3,4,5,6,7] et lorsqu'il est inactif: [0,2,4,6]. La fréquence de l'oscillateur maître peut être légèrement modifiée avec le bouton de réglage sur le panneau avant et le joystick à gauche du clavier.

Diagramme temporel des impulsions d'horloge. Explications: Unison - log. 0 niveau actif, FA0-2 - Sortie «Adresse», DD8-12 - registre accumulateur de phase, DD33-35 - registre total des votes, DD36-37 - registre DAC.


La partie numérique de la carte génératrice pour chacun des 4 (8) votes simultanément avec un changement de la valeur de la "Adresse" de sortie effectue les opérations suivantes. Depuis le nœud du processeur, l'entrée «Frequency» reçoit les valeurs de fréquence du signal. La valeur linéaire de la fréquence est convertie en incrément de phase par le décodeur sur la ROM. Les incréments sont additionnés dans l'accumulateur de phase (20 bits), composé d'un additionneur et de 8 mots de RAM. Les 9 bits les plus élevés de la somme sont envoyés aux entrées d'adresse de la ROM de forme d'onde. Une zone ROM spécifique est sélectionnée par les trois bits les moins significatifs de l'entrée «Control». 10 bits de la sortie de la ROM sont additionnés avec la valeur à l'entrée de l '«amplificateur» et alimentés aux entrées de la ROM de mise à l'échelle, ce qui génère un code bipolaire pour le DAC. La sortie tombe dans le tampon d'accumulation, construit sur des additionneurs et des registres, qui additionne séquentiellement les valeurs de code des 4 (8) votes. À la fin de chaque cycle, le code final est verrouillé par le registre de stockage et arrive au DAC 12 bits. La fréquence d'émission du code sur le DAC est la fréquence d'échantillonnage du signal et pour P432 est d'environ 33 kilohertz. Selon Nyquist, la fréquence sonore maximale disponible pour le générateur P432 est d'environ 16,5 kHz.

Si le timbre sélectionné nécessite un changement dynamique des paramètres du filtre passe-bas, les valeurs d'enveloppe sont sorties vers l'entrée Filtre qui, en passant par le DAC 10 bits, forment la tension de commande pour le filtre de l'ampli op. Le filtre passe-bas est fabriqué conformément au filtre sans condensateur du filtre à état variable et comprend un circuit de stabilisation de la température, un bloc pour changer le facteur Q de Q et la polarisation initiale.


Ce chronogramme montre deux périodes de discrétisation de la carte du générateur. UNISON est éteint. L'entrée de fréquence (Freq_in) de manière synchrone avec le changement d'adresse reçoit les numéros de fréquence de quatre touches différentes. Mais seuls les deux derniers d'entre eux sont pressés (Volume_in = 0xFF). En même temps, une valeur constante (Filter_in = 0x60) est émise à l'entrée «Filter». Le code final est entré dans le DAC (DAC) après s'être enclenché dans les registres de stockage (DD36-37).

Pour UNISON inclus
tout a la même apparence, seule l'entrée «Frequency» reçoit une paire de chiffres: pour la voix principale et l'unisson.

Remarque: une seule période est affichée.



Une description plus détaillée de l'ensemble générateur


Vous trouverez ci-dessous les détails et les schémas électriques pour ceux qui souhaitent comprendre le synthétiseur plus en détail. Les circuits ont été trouvés sur Internet, bien qu'un manuel d'utilisation [ 4 ] et un ensemble complet de circuits papier [ 5 ] aient été attachés à mon synthétiseur. Les bonnes personnes ont partagé l'archive avec le contenu de toutes les ROM dans un forum, mais il s'est avéré qu'il y avait une erreur dans l'un des fichiers, j'ai donc dû désinscrire des ROM individuelles et les comparer avec le firmware de l'archive.

Il convient de noter que lors de la production de P432, le fabricant a publié plusieurs révisions des cartes de synthétiseur afin d'améliorer les caractéristiques techniques, qui peuvent différer des premiers schémas de révision présentés ci-dessous.



  1. La ROM de conversion d'incrément de fréquence - DD1-2, exécutée sur deux 573RF2, contient un tableau de correspondance de la valeur de fréquence linéaire avec l'incrément de phase exponentielle. Graphiquement, son contenu ressemble à ceci



    De manière synchrone avec un changement de la valeur à la sortie "Adresse", le nœud de processeur émet une valeur de fréquence de 11 bits de la voix correspondante à l'entrée "Fréquence", qui est convertie en incréments de 16 bits.

    Si nous considérons le contenu des 16 premiers mots de DD1-2, alors des nombres étranges y sont écrits qui semblent ne pas être utilisés dans la synthèse du son:

  2. Accumulateur de phases - se compose d'additionneurs DD3-7 (561IM1) et de registres DD8-12 (561IR11). Les additionneurs sont inclus dans la chaîne avec une capacité totale de 20 bits. Le bloc de registre vous permet de stocker huit valeurs de phase de signal de 20 octets. Les entrées d'adresse des registres de lecture / écriture sont connectées au bus "Adresse". Cette inclusion vous permet de recevoir la valeur précédente à la sortie de l'impulsion d'horloge et de sauvegarder la valeur actuelle de l'entrée. Cela garantit l'accumulation de phase séparément pour chaque synthétiseur vocal. Les 9 bits supérieurs de la sortie de registre sont envoyés aux entrées d'adresse de la ROM de forme d'onde.
  3. La forme d'onde ROM - DD13-14, DD18-19 (5732) contient des tableaux de huit formes d'onde qui peuvent être synthétisées par un ensemble générateur. Une zone mémoire spécifique et une paire de ROM sont sélectionnées par les bits S0-S2 du signal "Control". Sous la description de chaque signal, 512 mots sont attribués avec une capacité en bits de 11 bits. Le 10 bits le plus significatif a une utilité, indiquant la polarité du signal: 1 positif, 0 négatif. L'apparition des formes d'onde est donnée en tenant compte de l'inversion des valeurs négatives:

    Wave_00
    Wave_01
    Wave_02
    Wave_03
    Wave_04
    Wave_05
    Wave_06
    Wave_07
  4. Additionneur d'enveloppe - 8 bits d'enveloppe (décalés de 2 bits vers la gauche) sont reçus à l'entrée de l'amplificateur, qui sont additionnés sur les éléments DD23-25 ​​(561IM1) avec les 10 bits de poids faible de la sortie ROM de forme d'onde. L'enveloppe a 4 phases: Attack, Decay, Sustain, Release, qui sont formées par l'unité de traitement séparément pour chacune des 4 voix principales selon le moment où la touche est enfoncée / relâchée.
    Un exemple d'enveloppe pour le ton 00: une attaque rapide à 255 est clairement visible, puis une baisse pour supporter le niveau 239, puis une baisse progressive du niveau, se terminant par une forte atténuation à 0 lorsque vous relâchez la touche. Sur l'axe horizontal est le temps en secondes, sur l'axe vertical est la valeur de l'entrée "Amplificateur".

    Enveloppe de l'entrée \ "Amplificateur \"


    Les valeurs dans la ROM du synthétiseur sont sélectionnées de telle manière qu'à 0 à l'entrée de l '«amplificateur», la sortie du DAC aura également un niveau de signal nul, malgré le fait que tous les circuits intermédiaires changent constamment les valeurs des variables et génèrent des signaux différents.
  5. La ROM de mise à l'échelle, composée de DD27-28 (5732), contient des courbes pour obtenir le code du signal bipolaire en fonction de la valeur du bit de poids fort de la forme d'onde. Sous forme graphique, le contenu de la ROM ressemble à ceci.



    Si le 10e bit est 1, alors la valeur de la sortie DD28 + 256 est utilisée, et si 0, alors DD27 + 1.
  6. L'accumulateur de votes sur DD30-32 (561IM1) et les registres DD33-DD35 (5619) mélange les valeurs des codes de tous les votes avant d'émettre au CAD. Après avoir traité le code de la dernière voix, la valeur reçue est ensuite transférée vers le registre de stockage et le registre additionneur est remis à zéro.

    Exemple: Comme mentionné ci-dessus, si "Amplifier" = 0, et la valeur d'amplitude maximale possible à la sortie de la ROM de forme d'onde (1 << 10) -1 = 1023, alors à la sortie de la ROM de mise à l'échelle, nous obtiendrons soit 0 + 256 ou 255+ 1 en fonction de 10 bits de la forme d'onde, ce qui donne un total de 256 * 8 = 2048 et correspond à 0 en sortie du DAC.
  7. Le registre de stockage sur les éléments DD36-37 (555TM9) reçoit et stocke la valeur du code en sortie pendant l'intervalle d'échantillonnage. La fréquence d'échantillonnage du nœud générateur est approximativement égale à 33000 Hz.
  8. DA38 DAC (534PA1) - convertit une valeur de 12 bits en un signal bipolaire analogique, le code 2048 correspond à l'analogique 0.
  9. Filtre passe-bas - construit selon le schéma développé par Vladimir Kuzmin pour le synthétiseur Polivox, cependant, un nœud pour la stabilisation thermique du courant de contrôle du filtre OA a été ajouté au P432. De plus, il provient du même Polivox, où il a été utilisé pour stabiliser la fréquence des générateurs. Sur le site de l'auteur, vous pouvez trouver des instructions sur la façon de configurer ce nœud [ 6 ].

    Beaucoup de choses ont déjà été écrites sur le filtre lui-même, nous pouvons donc nous passer de détails.
    Le contrôle du filtre est basé sur un DAC 10 bits (572PA1), dont l'entrée est un signal "Filtre" 8 bits, qui est l'enveloppe du filtre, et selon le timbre, il peut être une valeur constante, et généralement égale à zéro. Les paramètres du filtre sont également affectés par la valeur de 4 bits du signal «Control»: F0-F1 définit le décalage de la tension de sortie du DAC, et Q0-Q1 sont responsables du facteur de qualité (niveau de résonance) du filtre.
  10. Après le filtre, un interrupteur est installé qui vous permet d'activer le mixage avec le signal principal de sa copie traitée par l'effet HOP. Dans les premières modifications du P432, le même interrupteur était utilisé pour désactiver la sortie audio lorsqu'aucune touche n'était enfoncée. Mais dans les révisions ultérieures, cela a été refusé, ils ont commencé à couper les chemins, à jeter des fils et à ajouter de nouveaux éléments au circuit.
  11. Amplificateur - élève le niveau du signal de sortie à 250 mV.

Configuration et nœud du processeur


Nous avons donc compris les générateurs. Reste maintenant à comprendre d'où viennent tous les signaux de contrôle et où sont stockés les paramètres les décrivant.

Au début, j'avais prévu de supprimer les vidages de tous les signaux de contrôle par un analyseur logique et de trouver un algorithme pour les décrire. Par exemple, les enveloppes de l'amplificateur et du filtre peuvent être décrites par une fonction linéaire par morceaux, qui nécessite un nombre limité de paramètres.

Avec l'entrée «Frequency», il suffisait également d'enregistrer les valeurs de fréquence d'une seule touche pour chaque timbre, et de calculer toutes les autres en fonction de celui-ci.

Selon le manuel d'instructions, le P432 dispose d'un clavier à 41 touches avec un volume de 3 et 5/12 octaves avec une gamme de C1-E4 en notation scientifique ou C1-e1 en notation Helmholtz. Cependant, en pratique (pour le ton 00), sur la base de la correspondance A4 = 440 Hz, il s'est avéré que la touche A dans la deuxième octave gauche produit un son de cette fréquence, ce qui donne déjà la gamme C3-E6. Comme il s'est avéré plus tard, selon la tonalité active, la plage de fréquences reproduites peut varier, décalant de 1 ou 2 octaves.

«» .

«»

, , DD16 . , 5732 2048 .



1024 32 , 32 . , . .

.
, 00/FF, .
0FA_min
1FA_dt
2FA_max
3??
4FD_ft
5FD_dt
6FS_lvl
7FREQ_u1
8FS_ft
9FS_dt
10FR_ft
11FR_dt
12??
1300
14FREQ_u2
15Ctrl«»
16A_min
17A_dt
18A_max
19FF
20D_ft
21D_dt
22S_lvl
23FF
24S_ft
2500
2600
27R_dt
28??
2900
30FREQ_1
31FREQ_2

, : «», «», «» , «».

, . , , - .

*_dt , , 00: A_min=0, A_dt=48 A_max=255. , 0 48, 255. D_dt A_max S_lvl, S_ft>0, S_ft 1, . R_dt : R_dt 0. dt 1, *_dt<=1 *_dt .

*_ft , , . , ~ 100 ~ 3 . int(256 / *_ft) * 100 , .. *_ft 100 .

, . *_ft/*_dt.



«» , .

«». , 4 (), , , 1-2 .

: FREQ_1, FREQ_2 FREQ_u1, FREQ_u2 . A 432.

freq_offset = {4:0xd0, 5:0x90, 6:0x50} freq = (config['FREQ_1'] << 8) + freq_offset[config['FREQ_1']] + config['FREQ_2'] 

Un exemple pour la tonalité 00, où: FREQ_1 = 6, FREQ_2 = 8, nous obtenons: 6 * 0x100 + 0x50 + 8 = 0x658, ce qui est cohérent avec les données de l'analyseur logique pour toutes les tonalités. Pour l'unisson, le calcul est similaire.

Il est à noter que pour la tonalité 00, la valeur 0x658 correspond à une fréquence de 440 Hz ou note A4.
Il a été établi expérimentalement que l'intervalle de «fréquence» pour les touches adjacentes (y compris les touches noires) est de 16 (0x10) unités. Par conséquent, si nous connaissons la valeur de la 22e touche à gauche (A de la deuxième octave) - 0x658, nous pouvons facilement obtenir la valeur pour la plus à gauche (n ° 1): 0x508 et la plus à droite (n ° 41): 0x788.

Sur cette base, vous pouvez calculer la plage du clavier et les fréquences reproduites pour différentes tonalités. La colonne «Fréquence» sera correcte uniquement pour les formes d'onde simples.
FREQ_1GammeFréquence HzTimbres
4C1 - E432,70 - 329,6301, 07, 13, 14, 25, 30, 31, 32, 33, 34, 35
5C2 - E565,41 - 659,2603, 05, 06, 10, 15, 17, 23, 24, 27, 37
6C3 - E6130,81 - 1318,5100, 02, 04, 11, 12, 16, 20, 21, 22, 26, 36
Ce qui précède est plus que suffisant pour créer l'émulateur P432, alors passons-y.

Création d'une émulation P432 en Python


Je pensais que ce serait bien de séparer le stockage de configuration et la génération de sons, donc deux classes principales ont été créées:

  • P432data, chargé de charger les valeurs à partir des images ROM et d'apporter la configuration des tonalités à une forme pratique à utiliser;
  • P432, contenant des méthodes pour créer des formes d'enveloppe et générer des échantillons numériques.
Je ne m'attarderai pas sur P432data en détail, le code source peut être consulté sur github.
Mais les méthodes de P432 sont examinées plus en détail.

Le principal, bien sûr, est gen_samples avec un paramètre indiquant le nombre d'échantillons qu'il doit retourner. Dans cette méthode, le traitement des signaux depuis la réception de la valeur à l'entrée «Fréquence» jusqu'à la sortie du DAC est recréé le plus près possible du prototype. En principe, en se concentrant sur le schéma P432, vous pouvez trouver rapidement les équivalents Python des modules de l'ensemble générateur. La seule chose qui devait être explicitement ajoutée était la réduction des variables à la dimension donnée: 20 bits pour l'accumulateur de phase, 11 bits pour l'additionneur d'enveloppe et 12 bits pour l'additionneur de vote. Cette restriction est nécessaire pour que la logique de débordement de ces variables fonctionne normalement.

Les méthodes de création d'enveloppes de l'amplificateur getADS et du formulaire getFADS filtrent les listes avec les valeurs de l'amplitude de l'enveloppe, à partir desquelles gen_samples prend des valeurs au moment d'appuyer sur les touches. Ils ont quelques méthodes getR et getFR dans leur entreprise qui forment la phase d'atténuation d'enveloppe. Ils prennent le paramètre de niveau comme entrée - la valeur actuelle du niveau d'enveloppe, à partir de laquelle il diminuera à 0.

Les quatre voix principales ont la même forme d'enveloppe que l'amplificateur et le filtre, mais si l'amplificateur a sa propre enveloppe pour chaque voix et démarre lorsqu'une touche est enfoncée, alors pour le filtre, il est commun à toutes les voix, commence à la première pression, redémarre à la pression suivante et dure jusqu'à la dernière lâcher prise. Regardez ci-dessus

Selon le manuel d'instructions, le P432 émet des numéros de note MIDI de 36 à 77 (en réalité 76) pour les touches de clavier 1 à 41, respectivement. Afin de ne pas réinventer la roue, j'ai décidé d'utiliser la plage 36-76 dans l'émulateur comme numéros de la touche enfoncée, j'ai donc eu besoin de la méthode midi2freq, qui convertit le numéro de clé en valeur "Frequency", en tenant compte de la tonalité sélectionnée.

La dernière paire de méthodes était key_press (midi_note) et key_release (midi_note), qui formaient un dictionnaire de correspondance de la voix avec la fréquence du ton fondamental, la phase et la position actuelle de l'enveloppe.

La dernière méthode principale est setprog (prog, clean = True), conçue pour sélectionner la tonalité active. Setprog charge la configuration de la tonalité souhaitée et, si l'indicateur de nettoyage n'est pas effacé, efface les variables internes. Si clean est défini sur False, les variables internes ne sont pas réinitialisées, ce qui vous permet de basculer entre les sons pendant la génération du son sans pratiquement aucun clic ou autre son désagréable.

Pour écrire les échantillons générés dans le fichier WAV, la méthode utilitaire write_wav a été créée sur la base du module Wave. Pour chaque échantillon, une mise à l'échelle est effectuée pour augmenter l'amplitude et l'amener à une forme signée de 16 bits.

Ces méthodes sont suffisantes pour obtenir un fichier wav avec l'enregistrement de quelques secondes de l'un des sons du synthétiseur.

 #    p432=P432() #   p432.setprog(0) #     (  ) p432.unison=False p432.filter_en = False #   A   p432.key_press(57) #  3   samples=p432.gen_samples(33000*3) #   p432.key_release(57) #    p432.write_wav('test_00.wav',samples) 

La forme d'onde du timbre 00 est une sinusoïde, donc à la sortie, nous obtenons une sinusoïde avec une enveloppe superposée. Pour écouter.



Un peu plus intéressant sera l'enregistrement de la tonalité 14 avec l'unisson et le filtre activés. Pour écouter.



GUI


Un générateur de sons de console est bon, mais je veux aussi jouer sur le clavier. J'ai donc décidé de faire une interface graphique simple sur Tkinter.

L'interface a été influencée par le vrai P432 avec l'ajout d'une légende de clavier, un bouton de sélection d'entrée MIDI et la possibilité de désactiver le filtre.


Le bouton «Midi In» apparaîtra si vous avez installé le module «python-rtmidi». Après avoir appuyé dessus et sélectionné le périphérique d'entrée Midi, le programme active une fonction de rappel qui capture les événements de Note-On, Note-Off et Program Change sur les 16 canaux midi. Grâce au changement de programme, vous pouvez modifier le numéro de la tonalité d'émulation active.

Pour intercepter les frappes de clavier, utilisez la méthode Tkinter bind ('<KeyPress') , bind ('<KeyRelease') , puis dans la fonction de rappel, le numéro de clé est vérifié avec la liste autorisée, converti en note midi et les méthodes p432.key_press () sont appelées , p432.key_release () . L'interception est activée au démarrage du programme et désactivée à la fin.

Pour produire un son en streaming, le module pyaudio est utilisé en mode non bloquant. Après avoir rendu l'interface, elle démarre dans un thread de thread séparé et tkinter continue de fonctionner principalement. Dans la fonction de rappel, pyaudio transmet le nombre d'échantillons à générer et en retour, il reçoit des échantillons de gen_samples et un indicateur d'état. Pour réduire la latence entre l'événement note-on (en appuyant sur une touche) et l'apparition du son, un tampon assez petit est sélectionné: 200 échantillons. Il est défini par le paramètre frames_per_buffer de la méthode open pyaudio.

La version pyinstall compilée de P432_emulator pour Windows peut être téléchargée à partir des versions .

Conclusion


Dans cet article, les détails du fonctionnement du filtre analogique dans le nœud générateur (et sa mise en œuvre numérique dans l'émulateur), le nœud processeur, l'effet HOP et l'interface MIDI ne sont presque pas divulgués. L'accent a été mis sur la conception de la partie numérique du générateur, la méthode de stockage des paramètres des timbres et leur utilisation lors de la création de l'émulateur.

Si le sujet vous intéresse, je planifierai un deuxième article avec une analyse du reste.

De plus, s'il vous semble qu'il y a des erreurs ou des inexactitudes dans la description du fonctionnement des nœuds P432, veuillez écrire dans les commentaires.

Le code source du projet, le firmware de la ROM, les diagrammes et le manuel d'utilisation sont disponibles sur github .

Les références


  1. Ridiko L. DDS: Synthèse directe de fréquence numérique.
  2. Musée des synthétiseurs soviétiques, Formant P432. www.ruskeys.net/base/form432.php
  3. Wikipédia Polyvox.
  4. Instrument à clavier électromusical «Formant P432». Manuel d'utilisation .
  5. Schémas électriques du «Formant P432».
  6. Réglage de la stabilité en température de Polyvox.

Source: https://habr.com/ru/post/fr482292/


All Articles