Ziel ist es, eine Art Digitalpiano auf einem FPGA zu implementieren.
Bisher gelang es mir, einzelne Noten mit Zählern zu erzeugen. Grundsätzlich erzeuge ich eine Rechteckwelle einer bestimmten Frequenz, die einer Musiknote entspricht (natürlich verlasse ich mich dazu auf die Frequenz der Uhr, aber das ist kein Problem).
Wie kann ich eine Schaltung entwerfen, die die Überlappung mehrerer Noten erzeugen kann? Grundsätzlich möchte ich in der Lage sein, 2 Töne mit unterschiedlichen Frequenzen gleichzeitig zu erzeugen.
Als Teenager in den 1980er Jahren hatte ich einen Apple II+ Computer, der einen ähnlichen Lautsprecherausgang wie der IBM PC-Lautsprecher hatte. Der Zugriff auf eine speicherabgebildete I/O-Port-Position hatte den Effekt, dass ein mit dem Lautsprecher verbundener Ausgang umgeschaltet wurde.
Ich habe ein Programm in Maschinensprache geschrieben, das Dreiklänge spielte: drei simultane Töne. Eine Nachschlagetabelle konvertierte Notenwerte (indiziert durch Halbtöne) in Zählerwerte. Der Ansatz war einfach: Initialisieren Sie drei Zähler und durchlaufen Sie sie unabhängig voneinander in einer großen Schleife. Schalten Sie bei jeder Iteration, wenn mindestens einer der Zähler herumgerollt ist, den Lautsprecher um.
Diese Routine, gekoppelt mit einem BASIC-Programm, um sie mit Daten anzutreiben, spielte eine sehr gut klingende Wiedergabe der Synthesizer-Akkordfolge aus Van Halens Jump .
Es ist ein einzigartiger Klang. Es gibt Verzerrungen, aber die Notentrennung ist ziemlich klar.
Variationen in der Klangfarbe lassen sich übrigens mit Duty-Cycle-Variation erzeugen. Ich meine mich zu erinnern, dass dies die wahrgenommene Lautstärke bedeutet.
Es hängt viel von der Art der Hardware ab, die Sie haben.
Wenn Sie nur einen 1-Bit-Ausgang auf dem FPGA haben, können Sie das Audiosignal überabtasten (1 MHz oder mehr) und einen PWM- oder Delta-Sigma-Modulator verwenden, um effektiv ein Signal mit variabler Amplitude zu erzeugen (Sie können einen Tiefpassfilter hinzufügen, einen einfachen RC-Beschaltung ist ausreichend).
Sie können dann Ihre synthetisierten Signale (Sinus, Rechteck, Dreieck ...) hinzufügen und polyphone Klänge erzeugen. Stellen Sie beispielsweise bei einem 8-Bit-Addierer (vorzeichenbehaftet) die Amplitude der beiden Rechteckgeneratoren auf +50/-50 ein.
Eine einfache Möglichkeit besteht darin, jeden Ausgang der Zähler zu nehmen, ihn durch einen Widerstand zu leiten und dann das andere Ende der Widerstände miteinander zu verbinden. Nun würden die einzelnen Zählerausgänge gedämpft, während der endgültige Ausgang die Summe der Zählerausgänge wäre.
Zwei Möglichkeiten (die mir einfallen):
Wenn Sie nur mit einem einzigen digitalen Ausgang arbeiten und Rechteckwellen erzeugen, besteht die einfachste Möglichkeit darin, zwei (oder n) Zähler bei jeder gewünschten Frequenz zu haben und ihre Ausgänge mit XOR zu verknüpfen, bevor sie an den Pin ausgegeben werden. Dies erzeugt ein äquivalentes Ergebnis zu Kaz' Toggle-Ansatz.
Paul92
Kaz
Das Photon