Die innere Welt der Formanten P432



Die Geschichte, wie ich unerwartet einen Synthesizer gekauft, repariert, herausgefunden und einen Emulator geschrieben habe.

Diese Geschichte begann während des Chaos Constructions Festivals am letzten Wochenende im August 2019. Als ich abends in Avito nach interessanten Artefakten vergangener Zeiten suchte, stieß ich auf einen billigen Formant P432-Synthesizer. Bei digitalen Synthesizern sah es recht vertraut aus: Im unteren Teil befindet sich eine Tastatur mit 41 Tasten (3,5 Oktaven), im oberen Teil befinden sich Tasten zum Auswählen eines Tons, zum Einschalten der Chorus- und Unisono-Effekte sowie Knöpfe zum Einstellen des Vibrato-Effekts. Links neben der Tastatur befindet sich ein Joystick, mit dem Sie die Tonhöhe nach oben und unten verschieben und das Vibrato reibungslos anschließen können.

Das Interessanteste für mich war, dass dieser Synthesizer digital war und Klänge mit der Wavetable-Methode erzeugte, dh, zum Zeitpunkt des Tastendrucks erzeugte er Klänge basierend auf in ROM-Chips gespeicherten Tabellendaten. Nach einem kurzen Kennenlernen der Schaltkreise im Internet wurde klar, dass die Synthesizer-Steuerung auf dem bekannten Mikroprozessor KP580VM80 (i8080) aufbaut und die Sounds in 8 ROM-Chips mit einem Gesamtvolumen von 8 * 2 = 16 Kb gespeichert sind.

Der Synthesizer wurde gekauft und fuhr langsam von der Stadt des Verkäufers zum örtlichen Büro des Transportunternehmens, und ich fuhr fort, die Pläne zu studieren. Der Verkäufer schrieb in einer Anzeige, dass das Werkzeug einen Defekt aufweist, der sich in Form eines Keuchens bemerkbar macht, wenn Sie mehr als eine Taste drücken. Umso interessanter, dachte ich. "Es wird notwendig sein, zu finden und zu beseitigen."

Das Hauptmotiv für den Kauf war jedoch der Wunsch, sich mit dem internen Gerät zu befassen und Klangbeispiele aus dem ROM des Synthesizers zu extrahieren.

HAFTUNGSAUSSCHLUSS : Die Namen der Komponenten der Synthesizer-Knoten und -Signale (außer den in Anführungszeichen und in GROSSEN Buchstaben angegebenen) wurden von mir erfunden und können von den von den Entwicklern beabsichtigten abweichen. Die Beschreibung der Funktionsweise der Knoten basiert auf meinen (begrenzten) Kenntnissen, Materialien aus dem Internet und dem Rat erfahrener Personen.

Reparieren


Als P432 [ 2 ] sicher zu mir kam, war das erste, was ich tat, es auseinanderzunehmen. Drinnen erwartete ich keinen sehr angenehmen Anblick von Bündeln von Drähten und mehreren Leiterplatten.

Steuerknoten
Die Platine, auf der die Tasten und Bedienelemente auf der Frontplatte eingelötet sind, sowie eine Anzeige der Betriebszustände.

Prozessorknoten
Es enthält den Mikroprozessor KR580VM80 und weitere 580 Chips, 2 KB ROM auf RF2 sowie zwei statische RAM-Chips mit einer Gesamtkapazität von 256 Byte (K541RU2). Außerdem sind auf der Karte Decoder installiert, die Teile des Adressraums für die Interaktion mit der Tastatur mit Steuertasten und Registern zuweisen, an deren Ausgang Steuersignale für den Generatorknoten erzeugt werden.

MIDI Interface Node
Es ist oberhalb des Prozessorknotens installiert und besteht aus einem separaten ROM mit MIDI-Messaging-Routinen, feiner Logik und zwei großen Mikroschaltkreisen: dem VN59-Interrupt-Controller und der in Reihe geschalteten BB51-Schnittstelle. An die TX / RX VN51-Kontakte ist eine Standard-Midi-Stromschleifen-Implementierungsschaltung mit Optokoppler-Isolation angeschlossen.

Chor Knoten
In Form einer isolierten Karte mit nur analogem Eingang, Ausgang und Leistung. Es ist in KA528BR2-Mikroschaltungen implementiert - analoge Verzögerungsleitungen. Das Gerät ist sehr laut, verleiht dem Klang jedoch eine interessante Farbe.

Generatoranordnung
Das Hauptmodul des Synthesizers. Es enthält 8 ROM-Chips mit je 2 KB, digitale Logik (Register, Addierer), zwei DACs, ein analoges Filter mit variablen Parametern und eine thermische Stabilisierung. Der Knoten enthält auch einen Taktgenerator, mit dem der Betrieb der Register des Prozessorknotens synchronisiert wird. Die Tochterplatine dieses Knotens verfügt über eine VCO-Platine (Voltage Controlled Generator), die eine Weiterentwicklung späterer Versionen des Synthesizers darstellt.

Baugruppe aus Gleichrichter und Stabilisator
Ein lineares Netzteil, das + 5V für Logikstrom und + 12 / -15V für Operationsverstärker erzeugt. + 5V wird durch KR142EN5 stabilisiert, dessen Strahler das Metallgehäuse des Synthesizers ist, und + 12 / -15V ist der einfachste parametrische Stabilisator für Zenerdioden und Transistoren. Eine zusätzliche Versorgungsspannung von -5V für den KR580VM50 wird durch eine Zenerdiode von -15V direkt auf der Prozessorplatine gebildet. Analoge und digitale Masse sind getrennt und werden nur in diesem Block angeschlossen.

Instrumententastatur
Reed-Schalter, nicht anschlagdynamisch, wie bei anderen Synthesizern der Kachkanar-Radiofabrik von Formant.



Das Entfernen des MIDI-Knotens auf einer separaten Karte mit ROM ist darauf zurückzuführen, dass ein anderer Synthesizer in der P432-Reihe vorhanden ist - der „Formant MINI“, der keine MIDI-Schnittstelle und keinen HOR-Effekt hat. Der MINI-Prozessorknoten unterscheidet sich geringfügig in der Firmware, und der Generatorknoten ist der gleiche wie bei P432.

Beim ersten Einschalten fielen mir also zwei Probleme auf: ein sehr schwacher Signalpegel am linearen Ausgang und der bereits erwähnte Ton, wenn mehr als eine Taste gleichzeitig gedrückt wurde. Es ist zu beachten, dass der P432 ein polyphoner Synthesizer ist und gleichzeitig 4 Stimmen (Frequenzen) eines Timbres spielen kann. Mit dem UNISON-Effekt erhöht sich die Anzahl der gleichzeitig gesprochenen Stimmen auf 8, zwei für jede Taste.

Der Grund für das leise Geräusch wurde fast sofort gefunden, der verbrannte Ausgang OU K544UD1A war schuld.

Nach dem Ersetzen begann das Instrument laut zu klingen, auch wenn passive Kopfhörer an den Ausgang angeschlossen waren.

Aber mit seltsamen Geräuschen war die Situation sehr unverständlich, denn selbst wenn einzelne Tasten gedrückt wurden, entsprachen die Geräusche der Töne nicht der P432-Demonstration von YouTube.

Es dauerte eine Weile, bis das Problem gefunden wurde, aber am Ende wurde es auf der Ebene des Haupt-DAC lokalisiert. Das High-Bit des Digitaleingangs reichte nicht aus, um es als logische 1 zu erkennen, sodass das analoge Ausgangssignal verzerrt war. Der Täter dieser Geschichte wurde gefunden und beseitigt, woraufhin das Problem behoben wurde. Alle Töne begannen klar und ohne Probleme mit ein paar Klicks zu klingen.

Es würde ein Ende der Geschichte geben, aber es wurde bereits viel Zeit für die Reparatur aufgewendet, und ich entschied, dass wir hier nicht aufhören sollten, und wir müssen es herausfinden:

  • Wie ist der Klangsynthesevorgang?
  • Was ist in dem ROM der Generatoreinheit gespeichert
  • Wie der Filter funktioniert und welche Eigenschaften hat er?
  • wo die Konfiguration für jeden Ton und Hüllkurvenparameter gespeichert wird

Das Ergebnis dieser Arbeit war die Software-Emulation von P432 unter Verwendung von Daten aus dem ursprünglichen ROM.

Generatoranordnung


Die Wellenform am Ausgang des Haupt-DAC der Generatoreinheit wird nach dem Prinzip der direkten digitalen Synthese (DDS) gebildet [ 1 ]. Das empfangene analoge Signal wird durch ein Tiefpassfilter geleitet, dann, falls erforderlich, mit dem Ausgang der Choranordnung gemischt, durch einen Ausgangsverstärker verstärkt und einem linearen Ausgang zugeführt. Der Filter in P432 wird gemäß dem zuvor im Polyvox-Synthesizer verwendeten Schema hergestellt [ 3 ].


Das Diagramm zeigt die Generatoreinheit und ihre Hauptfunktionsblöcke. Orange Pfeile kennzeichnen Ein- und Ausgänge externer digitaler Signale, schwarz - digitale Signale im Modul, blau - analoge Signale.


Betrachten Sie zunächst die Ein- und Ausgänge:

  • Input “Frequency” (11 Bit) - Für jede Voice, einschließlich Unisono, stammen die Werte, die der gedrückten Taste oder der MIDI-Note entsprechen, vom Prozessorknoten.
  • Verstärkereingang (8 Bit) - Der Hüllkurvenwert für die Signalamplitude.
  • Input “Filter” (8 Bit) - Werte der Hüllkurve der Grenzfrequenz des Filters.
  • „Control“ -Eingang - (8 Bit) - 3 niedrigstwertige Bits sind für die Wellenformauswahl verantwortlich, 2 Bits für den Filter-Offset, 2 weitere für die Q-Filter-Qualitätsstufe Q (Resonanz) und das letzte Bit bestimmt, ob der UNISON-Effekt ein- oder ausgeschaltet ist.
  • Ausgang „Adresse“ (3 Bit) - verantwortlich für die Synchronisation mit dem Prozessorknoten.

Nun wollen wir sehen, wie die Hauptblöcke des Knotens funktionieren.

Die Synchronisationsschaltung erzeugt mit Hilfe von Multivibratoren, einem Zähler und Logikelementen Steuerimpulse für verschiedene Module der Generatoreinheit und gibt die aktuelle Sprachnummer an den Ausgang „Adresse“. Wenn der UNISON "Address" -Modus aktiv ist, werden die Werte [0,1,2,3,4,5,6,7] und inaktiv: [0,2,4,6] verwendet. Die Frequenz des Master-Oszillators kann mit dem Einstellknopf an der Vorderseite und dem Joystick links neben der Tastatur geringfügig geändert werden.

Zeitdiagramm der Taktimpulse. Erläuterungen: Unison - Log. 0 aktiver Pegel, FA0-2 - "Adresse" -Ausgang, DD8-12 - Phasenakkumulatorregister, DD33-35 - Stimmengesamtregister, DD36-37 - DAC-Register.


Der digitale Teil der Generatorplatine für jede von 4 (8) Stimmen führt gleichzeitig mit einer Änderung des Werts des Ausgangs „Adresse“ die folgenden Operationen aus. Vom Prozessorknoten empfängt der Eingang „Frequenz“ die Signalfrequenzwerte. Der lineare Wert der Frequenz wird vom Decoder im ROM in Phaseninkrement umgewandelt. Die Inkremente werden im Phasenakkumulator (20 Bit) summiert, der aus einem Addierer und einem 8-Wort-RAM besteht. Die höchsten 9 Bits der Summe werden den Adresseneingängen des Wellenform-ROM zugeführt. Ein bestimmter ROM-Bereich wird durch die drei niedrigstwertigen Bits des Eingangs "Control" ausgewählt. 10 Bits vom Ausgang des ROM werden mit dem Wert am Eingang des "Verstärkers" summiert und den Eingängen des Skalierungs-ROM zugeführt, der einen Bipolarcode für den DAC erzeugt. Die Ausgabe fällt in den Akkumulationspuffer, der aus Addierern und Registern besteht und der nacheinander die Codewerte aller 4 (8) Stimmen summiert. Am Ende jedes Zyklus wird der endgültige Code vom Speicherregister zwischengespeichert und gelangt zum 12-Bit-DAC. Die Frequenz, mit der der Code auf dem DAC ausgegeben wird, ist die Abtastfrequenz des Signals und für P432 etwa 33 Kilohertz. Laut Nyquist beträgt die maximale Schallfrequenz, die dem P432-Generator zur Verfügung steht, ungefähr 16,5 kHz.

Wenn das ausgewählte Timbre eine dynamische Änderung der Tiefpassfilterparameter erfordert, werden die Hüllkurvenwerte an den Filtereingang ausgegeben, der über den 10-Bit-DAC die Steuerspannung für das Operationsverstärkerfilter bildet. Das Tiefpassfilter ist gemäß dem Nichtkondensatorfilter des Filters mit variablem Zustand hergestellt und enthält eine Temperaturstabilisierungsschaltung, einen Block zum Ändern des Q-Faktors von Q und die anfängliche Vorspannung.


Dieses Zeitdiagramm zeigt zwei Diskretisierungsperioden der Generatorplatine. UNISON ist aus. Der Frequenzeingang (Freq_in) empfängt synchron zur Adressänderung die Frequenznummern von vier verschiedenen Tasten. Es werden jedoch nur die letzten beiden gedrückt (Volume_in = 0xFF). Gleichzeitig wird ein konstanter Wert (Filter_in = 0x60) an den Eingang „Filter“ ausgegeben. Der endgültige Code wird nach dem Einrasten in die Speicherregister (DD36-37) in den DAC (DAC) eingegeben.

Für mitgelieferte UNISON
Alles sieht gleich aus, nur der Eingang „Frequenz“ erhält ein Zahlenpaar: für die Hauptstimme und für den Gleichklang.

Hinweis: Es wird nur eine Periode angezeigt.



Eine detailliertere Beschreibung der Generatoranordnung


Nachfolgend finden Sie die Details und elektrischen Schaltpläne für diejenigen, die das Synthesizer-Gerät genauer verstehen möchten. Die Schaltkreise wurden im Internet gefunden, obwohl meinem Synthesizer eine Bedienungsanleitung [ 4 ] und ein kompletter Satz von Papierschaltkreisen [ 5 ] beigefügt waren. Gute Leute teilten das Archiv mit den Inhalten aller ROMs in einem Forum, aber es stellte sich heraus, dass eine der Dateien einen Fehler aufwies, sodass ich separate ROMs extrahieren und sie mit der Firmware im Archiv vergleichen musste.

Es ist zu beachten, dass der Hersteller während der Produktion von P432 mehrere Revisionen der Synthesizer-Boards herausgegeben hat, um die technischen Eigenschaften zu verbessern, die von den im Folgenden vorgestellten ersten Revisionsschemata abweichen können.



  1. Der Frequenzinkrement-Umwandlungs-ROM - DD1-2, der an zwei 573RF2 ausgeführt wird, enthält eine Entsprechungstabelle des linearen Frequenzwerts zum exponentiellen Phaseninkrement. Grafisch sieht der Inhalt so aus



    Synchron mit einer Änderung des Wertes am Ausgang „Adresse“ gibt der Prozessorknoten einen 11-Bit-Frequenzwert der entsprechenden Stimme an den Eingang „Frequenz“ aus, der in 16-Bit-Inkremente umgewandelt wird.

    Wenn wir den Inhalt der ersten 16 Wörter von DD1-2 betrachten, dann werden dort einige seltsame Zahlen geschrieben, die bei der Synthese des Klangs anscheinend nicht verwendet werden:

  2. Phasenakkumulator - besteht aus DD3-7-Addierern (561IM1) und DD8-12-Registern (561IR11). Addierer sind in der Kette mit einer Gesamtkapazität von 20 Bits enthalten. Mit dem Registerblock können Sie acht 20-Byte-Signalphasenwerte speichern. Die Adresseneingänge der Lese- / Schreibregister sind mit dem Bus "Adresse" verbunden. Diese Einbeziehung ermöglicht es Ihnen, den vorherigen Wert am Ausgang des Taktimpulses zu empfangen und den aktuellen Wert vom Eingang zu speichern. Dies stellt die Akkumulation der Phase für jeden Sprachsynthesizer separat sicher. Die hohen 9 Bits des Registerausgangs werden den Adresseneingängen des Wellenform-ROM zugeführt.
  3. Die ROM-Wellenform - DD13-14, DD18-19 (5732) enthält Tabellen mit acht Wellenformen, die von einer Generatorbaugruppe synthetisiert werden können. Ein bestimmter Speicherbereich und ein Paar von ROMs werden durch die Bits S0-S2 des "Steuer" -Signals ausgewählt. Bei der Beschreibung jedes Signals werden 512 Wörter mit einer Bitkapazität von 11 Bits zugewiesen. Das höchstwertige 10-Bit hat einen Nutzwert, der die Polarität des Signals angibt: 1-positiv, 0-negativ. Das Erscheinungsbild der Wellenformen wird unter Berücksichtigung der Umkehrung negativer Werte angegeben:

    Wave_00
    Wave_01
    Wave_02
    Wave_03
    Wave_04
    Wave_05
    Wave_06
    Wave_07
  4. Hüllkurven-Addierer - Am Verstärkereingang werden 8 Hüllkurven-Bits (um 2 Bits nach links verschoben) empfangen, die auf den DD23-25 ​​(561IM1) -Elementen mit den 10 niedrigstwertigen Bits des Wellenform-ROM-Ausgangs summiert werden. Die Hüllkurve hat 4 Phasen: Attack, Decay, Sustain, Release, die von der Prozessoreinheit für jede der 4 Hauptstimmen separat gebildet werden, je nachdem, wann die Taste gedrückt / losgelassen wird.
    Ein Beispiel für eine Hüllkurve für Ton 00: Es ist deutlich ein schneller Angriff auf 255 zu erkennen, dann eine Abnahme auf Unterstützungsstufe 239, dann eine sanfte Abnahme der Stufe, die beim Loslassen der Taste mit einer starken Dämpfung auf 0 endet. Auf der horizontalen Achse steht die Zeit in Sekunden, auf der vertikalen Achse der Wert des Eingangs „Verstärker“.

    Hüllkurve des Eingangs "Verstärker"


    Die Werte im Synthesizer-ROM werden so gewählt, dass bei 0 am Eingang des „Verstärkers“ der Ausgang des DAC ebenfalls einen Null-Signalpegel aufweist, obwohl alle Zwischenkreise ständig die Werte der Variablen verändern und unterschiedliche Signale erzeugen.
  5. Das aus DD27-28 (573 DD2) bestehende Skalierungs-ROM enthält Kurven zum Erhalten des Codes des bipolaren Signals in Übereinstimmung mit dem Wert des höherwertigen Bits der Wellenform. In grafischer Form sieht der Inhalt des ROM so aus.



    Wenn das 10. Bit 1 ist, wird der Wert vom Ausgang DD28 + 256 verwendet, und wenn 0, dann DD27 + 1.
  6. Der Akkumulator der Stimmen von DD30-32 (561IM1) und die Register DD33-DD35 (5619) mischen die Werte der Codes aller Stimmen, bevor sie an den DAC ausgegeben werden. Nach dem Verarbeiten des Codes der letzten Stimme wird der empfangene Wert weiter in das Speicherregister übertragen und das Addiererregister auf Null zurückgesetzt.

    Beispiel: Wie oben erwähnt, erhalten wir, wenn "Verstärker" = 0 und der maximal mögliche Amplitudenwert am Ausgang des Wellenform-ROM (1 << 10) -1 = 1023 ist, am Ausgang des Skalierungs-ROM entweder 0 + 256 oder 255+ 1 abhängig von 10 Bits der Wellenform, was insgesamt 256 * 8 = 2048 ergibt und 0 am Ausgang des DAC entspricht.
  7. Das Speicherregister der Elemente DD36-37 (555TM9) empfängt und speichert den Wert des Codes während des Abtastintervalls am Ausgang. Die Abtastfrequenz des Generatorknotens beträgt ungefähr 33000 Hz.
  8. DAC DA38 (534PA1) - wandelt einen 12-Bit-Wert in ein analoges bipolares Signal um, Code 2048 entspricht analog 0.
  9. Tiefpassfilter - gebaut nach dem Schema, das Vladimir Kuzmin für den Polivox-Synthesizer entwickelt hat. P432 wurde jedoch um einen Knoten zur thermischen Stabilisierung des OA-Filtersteuerstroms erweitert. Darüber hinaus stammt es aus demselben Polivox, in dem es zur Frequenzstabilisierung von Generatoren eingesetzt wurde. Auf der Website des Autors finden Sie Anweisungen zum Konfigurieren dieses Knotens [ 6 ].

    Über den Filter selbst ist schon viel geschrieben worden, so dass wir auf Details verzichten können.
    Die Filtersteuerung basiert auf einem 10-Bit-DAC (572PA1), dessen Eingang ein 8-Bit- „Filter“ -Signal ist, das die Filterhüllkurve darstellt. Je nach Klangfarbe kann es ein konstanter Wert sein und im Allgemeinen gleich Null sein. Die Filterparameter werden auch durch den Wert von 4 Bit des Signals „Control“ beeinflusst: F0-F1 legt den Offset der DAC-Ausgangsspannung fest, und Q0-Q1 sind für den Qualitätsfaktor (Resonanzpegel) des Filters verantwortlich.
  10. Nach dem Filter ist ein Schalter installiert, mit dem Sie das Mischen mit dem vom HOP-Effekt verarbeiteten Hauptsignal seiner Kopie aktivieren können. In früheren Modifikationen des P432 wurde der Tonausgang mit demselben Schalter ausgeschaltet, wenn keine Taste gedrückt wurde. Aber in späteren Überarbeitungen wurde dies abgelehnt, sie begannen, Wege zu schneiden, Drähte zu werfen und der Schaltung neue Elemente hinzuzufügen.
  11. Verstärker - Erhöht den Ausgangssignalpegel auf 250 mV.

CPU-Konfiguration und Knoten


Also haben wir die Generatoren herausgefunden. Jetzt bleibt zu verstehen, woher alle Steuersignale kommen und wo die sie beschreibenden Parameter gespeichert sind.

Zunächst plante ich, alle Steuersignale mit einem Logikanalysator zu entfernen und einen Algorithmus zu entwickeln, der sie beschreibt. Beispielsweise können die Hüllkurven des Verstärkers und des Filters durch eine stückweise lineare Funktion beschrieben werden, die eine begrenzte Anzahl von Parametern erfordert.

Mit dem „Frequency“ -Eingang war es auch ausreichend, die Frequenzwerte eines einzelnen Keys für jedes Timbre aufzuzeichnen und alle anderen darauf basierend zu berechnen.

Laut Bedienungsanleitung verfügt das P432 über eine Tastatur mit 41 Tasten und einer Lautstärke von 3 und 5/12 Oktaven mit einem Bereich von C1-E4 in wissenschaftlicher Notation oder C1-e1 in Helmholtz-Notation. In der Praxis (für Ton 00) stellte sich jedoch anhand der Entsprechung A4 = 440 Hz heraus, dass die Taste A in der zweiten linken Oktave einen Ton dieser Frequenz erzeugt, und dies ergibt bereits den Bereich C3-E6. Wie sich später herausstellte, kann der Bereich der wiedergegebenen Frequenzen je nach aktivem Ton variieren und sich um 1 oder 2 Oktaven verschieben.

«» .

«»

, , DD16 . , 5732 2048 .



1024 32 , 32 . , . .

.
, 00/FF, .
SymbolBeschreibung
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??
29.00
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'] 

Ein Beispiel für Ton 00, wobei FREQ_1 = 6, FREQ_2 = 8 ergibt: 6 * 0x100 + 0x50 + 8 = 0x658, was mit den Logikanalysatordaten für alle Töne übereinstimmt. Für unisono ist die Berechnung ähnlich.

Es ist anzumerken, dass für Ton 00 der Wert 0x658 einer Frequenz von 440 Hz oder der Note A4 entspricht.
Es wurde experimentell festgestellt, dass das Frequenzintervall für benachbarte (einschließlich schwarzer) Tasten 16 (0x10) Einheiten beträgt. Wenn wir also den Wert für die 22. Taste links (A der zweiten Oktave) - 0x658 kennen, können wir leicht den Wert für die ganz linke (Nr. 1): 0x508 und die ganz rechte (Nr. 41): 0x788 ermitteln.

Auf dieser Grundlage können Sie den Tastaturbereich und die wiedergegebenen Frequenzen für verschiedene Töne berechnen. Die Spalte „Frequenz“ ist nur für einfache Wellenformen korrekt.
FREQ_1ReichweiteFrequenz 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
Das oben Genannte ist mehr als genug, um den P432-Emulator zu erstellen. Fahren wir also damit fort.

P432-Emulation in Python erstellen


Ich dachte, es wäre schön, Konfigurationsspeicher und Klangerzeugung zu trennen, also wurden zwei Hauptklassen erstellt:

  • P432data, verantwortlich für das Laden von Werten aus ROM-Images und das Bringen der Konfiguration von Tönen in eine bequeme Form zur Verwendung;
  • P432 mit Methoden zum Erstellen von Hüllkurven und zum tatsächlichen Erzeugen von digitalen Samples.
Ich werde nicht im Detail auf P432data eingehen, der Quellcode kann auf Github eingesehen werden.
Die Methoden von P432 werden jedoch ausführlicher betrachtet.

Das wichtigste ist natürlich gen_samples mit einem Parameter, der die Anzahl der zurückzugebenden Samples angibt. Bei diesem Verfahren wird die Verarbeitung der Signale vom Empfang des Wertes am Eingang „Frequenz“ bis zum Ausgang zum DAC so nah wie möglich am Prototyp neu erstellt. Im Prinzip können Sie, wenn Sie sich auf das P432-Schema konzentrieren, schnell die Python-Entsprechungen der Module der Generatorbaugruppe finden. Das einzige, was explizit hinzugefügt werden musste, war die Reduzierung der Variablen auf die angegebene Dimension: 20 Bit für den Phasenakkumulator, 11 Bit für den Hüllkurvenaddierer und 12 Bit für den Stimmenaddierer. Diese Einschränkung ist erforderlich, damit die Logik des Überlaufs dieser Variablen normal funktioniert.

Die Methoden zum Erstellen von Hüllkurven des getADS- Verstärkers und des getFADS- Filterformulars enthalten Werte für die Hüllkurvenamplitude, aus denen gen_samples beim Drücken der Tasten Werte entnimmt. Sie haben einige getR- und getFR- Methoden in ihrem Unternehmen, die die Envelope Attenuation-Phase bilden. Sie nehmen den Pegelparameter als Eingabe - den aktuellen Wert des Hüllkurvenpegels, von dem aus er auf 0 abfällt.

Die vier Hauptstimmen haben die gleiche Hüllkurvenform von Verstärker und Filter. Wenn die Hüllkurve jedoch für jede Stimme eine eigene Hüllkurve hat und beim Drücken einer Taste startet, wird sie für den Filter für alle Stimmen ab dem ersten Drücken verwendet, nach dem nächsten neu gestartet und dauert bis zum letzten loslassen. Schau oben

Gemäß der Bedienungsanleitung gibt P432 MIDI-Notennummern von 36 bis 77 (in Wirklichkeit 76) für die Tastaturtasten 1 bis 41 aus. Um das Rad nicht neu zu erfinden, entschied ich mich, den Bereich 36-76 im Emulator als Nummer der gedrückten Taste zu verwenden, und benötigte daher die Methode midi2freq, die die Tastennummer unter Berücksichtigung des ausgewählten Tons in den Wert „Frequency“ umwandelt.

Das letzte Methodenpaar war key_press (midi_note) und key_release (midi_note), die ein Wörterbuch der Entsprechung der Stimme mit der Frequenz des Grundtons, der Phase und der aktuellen Position der Hüllkurve bildeten.

Die letzte Hauptmethode ist setprog (prog, clean = True), um den aktiven Ton auszuwählen. Setprog lädt die Konfiguration des gewünschten Tons und löscht die internen Variablen, wenn das Clean-Flag nicht gelöscht wird. Wenn clean auf False gesetzt ist, werden die internen Variablen nicht zurückgesetzt, sodass Sie während der Klangerzeugung praktisch ohne Klicks oder andere unangenehme Geräusche zwischen den Tönen wechseln können.

Um die generierten Samples in die WAV-Datei zu schreiben, wurde die Dienstprogrammmethode write_wav basierend auf dem Wave-Modul erstellt. Für jedes Sample wird eine Skalierung durchgeführt, um die Amplitude zu erhöhen und auf eine vorzeichenbehaftete 16-Bit-Form zu bringen.

Diese Methoden reichen aus, um eine WAV-Datei zu erstellen, in der einige Sekunden eines Synthesizer-Sounds aufgezeichnet werden.

 #    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) 

Die Wellenform von Timbre 00 ist eine Sinuskurve, daher erhalten wir am Ausgang eine Sinuskurve mit einer überlagerten Hüllkurve. Zuhören.



Etwas interessanter ist die Aufnahme von Ton 14 mit eingeschaltetem Unisono und Filter. Zuhören.



GUI


Ein Konsolensoundgenerator ist gut, aber ich möchte auch auf der Tastatur spielen. Also habe ich beschlossen, eine einfache GUI für Tkinter zu erstellen.

Das Interface wurde vom echten P432 beeinflusst, mit einer zusätzlichen Tastaturlegende, einer Auswahltaste für MIDI-Eingänge und der Möglichkeit, den Filter auszuschalten.


Die Schaltfläche „Midi In“ wird angezeigt, wenn Sie das Modul „python-rtmidi“ installiert haben. Nach dem Drücken und Auswählen des MIDI-Eingabegeräts aktiviert das Programm eine Rückruffunktion, die die Ereignisse Note-On, Note-Off und Program Change auf allen 16 MIDI-Kanälen erfasst. Über Program Change können Sie die Nummer des aktiven Emulatortons ändern.

Verwenden Sie zum Abfangen von Tastaturtastenanschlägen die Tkinter- Bindungsmethode ('<KeyPress') , die Bindungsmethode ('<KeyRelease') , und in der Rückruffunktion wird die Tastennummer mit der zulässigen Liste überprüft, in eine Midi-Note konvertiert und die p432.key_press () -Methode aufgerufen . p432.key_release () . Das Abfangen wird beim Start des Programms aktiviert und am Ende deaktiviert.

Für die Ausgabe von Streaming-Sound wird das Pyaudio-Modul im nicht blockierenden Modus verwendet. Nach dem Rendern der Schnittstelle wird sie in einem separaten Thread gestartet, und tkinter funktioniert hauptsächlich weiter. In der Callback-Funktion übergibt pyaudio die Anzahl der zu generierenden Samples und empfängt im Gegenzug Samples von gen_samples und ein Status-Flag. Um die Latenz zwischen dem Note-On-Ereignis (durch Drücken einer Taste) und dem Erscheinen von Sound zu verringern, wird ein relativ kleiner Puffer ausgewählt: 200 Samples. Sie wird durch den Parameter frames_per_buffer der Methode open pyaudio festgelegt.

Die kompilierte Pyinstall-Version von P432_emulator für Windows kann von Releases heruntergeladen werden.

Fazit


In diesem Artikel werden die Details der Funktionsweise des Analogfilters im Generatorknoten (und seiner digitalen Implementierung im Emulator), des Prozessorknotens, des HOP-Effekts und der MIDI-Schnittstelle fast nicht offenbart. Der Schwerpunkt lag auf dem Design des digitalen Teils der Generatoreinheit, der Methode, die Parameter der Klangfarben zu speichern und sie bei der Erstellung des Emulators zu verwenden.

Wenn das Thema von Interesse ist, plane ich einen zweiten Artikel mit einer Analyse der verbleibenden.

Wenn Sie den Eindruck haben, dass die Beschreibung des Betriebs von P432-Knoten fehlerhaft oder ungenau ist, schreiben Sie dies bitte in die Kommentare.

Der Quellcode des Projekts, die ROM-Firmware, Diagramme und die Bedienungsanleitung sind auf github verfügbar.

Referenzliste


  1. Ridiko L. DDS: Direkte digitale Frequenzsynthese.
  2. Museum der sowjetischen Synthesizer, Formant P432. www.ruskeys.net/base/form432.php
  3. Wikipedia Polyvox.
  4. Elektromusikalisches Tasteninstrument "Formant P432". Bedienungsanleitung .
  5. Elektrische Schaltpläne des „Formant P432“.
  6. Einstellen der Temperaturstabilität von Polyvox.

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


All Articles