Forum: Digitale Signalverarbeitung / DSP / Machine Learning Tonerzeugung und Klangformung mit wenig Rechenbedarf


von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Aufgrund einer Nachfrage in diesem thread:
Beitrag "Digital Waveguide Oscillator - Octave?"

Hier ist eine einfache Möglichkeit, mit wenig Rechenaufwand einen 
ausklingenden Zupfklang, wie bei Zitter, Gitarre oder ähnlich zu 
erzeugen. Je nach Einstellung kann es aber auch ganz anders klingen. 
Urspünglich ist es mal auf einem 8Bit Controller der 90er gelaufen.

Die Methode funktioniert mit einem rückgekoppelten RAM, wie es auch der 
Karplus-Strong verwendet und gehört auch zu den dort angefragten "wave 
guide"-Verfahren.

Allerdings verwendete ich damals mehrere Schleifen und eine negierte 
Rückführung, welche einerseits ein symmetrisches Signal erzeugte und 
andererseits zusammen mit den Filtern eine Stabilisierung der Funktion 
durch Verluste ermöglichte.

Die Rückkopplungen wurden dazu verwendet, bestimmte Frequenzen zu 
betonen, wie es auch die eingespannte Seite tun würde. Insbesondere kann 
man damit die Musikalität des Signals beeinflussen. Je nach Abgriff kann 
man dabei auch phasenbewegte Oberwellen erzeugen. Diese sind zwar 
zunächst nicht unbedingt hörbar, wirken sich aber auf die lokale 
Amplitude aus und damit auf nachgeschaltete nichtlineare Stufen in 
Synthesizern. Begrenzer z.B. können damit flexibel angesteuert werden.

Im Beispiel wurde die zweite Oberschwingung (Abgriff bei n/2) positiv - 
und die dritte Oberwelle (Abgriff n/3) negiert rückgeführt, um dem durch 
die Rückkopplung bei n insgesamt aufgeprägten Rechteckverhalten die 
erste Fourierfrequenz zu nehmen. Damit kann man im Gegensatz zu einer 
Rückführung mit EQ die Schärfe des Klangs sehr fein einstellen. Die 
Rückführungen wurden mit z.B. Faktoren 64, 128 etc. dividiert, um sie 
abzuschwächen. Das geht heute sicher etwas feiner.


Zur Erklärung:

In der ersten Summation werden die Signale zusammengeführt. Es ist dabei 
darauf zu achten, dass nicht mehr, als ein Wert von 100% entsteht, weil 
der Filter sonst aufschwingt. 100% sind der maximale Binärwert, mit dem 
gespeist wurde, seinerzeit 16 Bit signed INT.

Die zweite Summation aus neuem und altem Wert realisierte einen 
einfachen IIR-Filter. Das kann man bei den heutigen Möglichkeiten eines 
AVR auch anders mit einem FIR lösen, wenn man Rechenzeit spendieren 
möchte. Wird z.B. mit 0,998 (statt 0,999) und 0,001 gearbeitet, wird das 
System mit jedem Durchlauf etwa 0,1% Energie verlieren.

Um bei einer Ganzzahlrechnung die möglichen "Ecken" durch die 
Rechenfehler etwas zu glätten, kann man beim Rückführen statt z.B. des 
Wertes n/2, zusätzlich auch einige Nachbarn verwendeen und den Teiler 
entsprechend anpassen. (angedeutet in der Grafik mit den Zusatzpfeilen).

Mit dem genauen Abgriff kann man etwas Spielen:

Nimmt man z.B. ein 64er RAM und greift jeweils 4 Werte, um sie zu 
glätten, dann wirkt die Rückwirkung über (63 ... 60) - (3...0) ca. 60 
Speicherplätze. Damit wären Teiler von 2,3,4,5 und 6 möglich, um 
musikalisch interessante Oberwellen zu erzeugen. Man kann nun die 
Abgriffe punktgenau setzen (Zwischenplätze per Interpolation) oder 
gezielt leicht an der richtigen Oberwelle vorbei designen. Damit 
entsteht eine zusätzliche Glättung / Schwebung. Ist ein wenig schwer zu 
beschreiben.

Für das genaue Tuning der Frequenzen und Oberwellen braucht man 
wenigstens die 6fache Zahl (Faktoren 1,2,3) der sonst üblichen 
Speicherplätze. Diese finden sich z.B. in dieser Tabelle:

Beitrag "Re: CPLD als Top Octave Generator nutzen?"

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Wie bei dem KP-Algo auch, wird das RAM mit einem Impulsfile geladen, 
dessen Oberwellen sich langsam abbauen. Die Energie wird - soweit sie 
nicht durch Verluste abgebaut - in die NF umgesetzt.

Als Ladekurve für 64 Speicherzellen wurde im Beispiel eine gespannte 
Saite verwendet, deren Punkte sich ausgehend von der Mitte mit Startwert 
99 näherungsweise so beschreiben lässt:

Y(32) = 99;   Y(x)  = 0,905 * Y(X-1) -0,5. Die erste Hälfte gespiegelt. 
Dann ergibt sich die erste Periode in der Kurve im Bild links oben.

Weiter hinten sind dann die sich ergebenden Schwingungen dargestellt, 
wie sie sich dem Sinus nähern.

Anders, als der KP emitiert der Algo immer wieder auch die zweite und 
vor allem die dritte Oberwelle. Damit wird der Klang hinten nicht 
stumpf.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich bin mit dem link in den falschen Beitrag gerutscht. Die 
Tonfrequenzen werden weiter unten gelinkt:

Die notwendigen Teiler für eine gute Tonleiter findet man bei den grünen 
hier:
http://www.96khz.org/htm/pldmodularorgan.htm

von Carl (Gast)


Lesenswert?

Hallo Jürgen,
Du könntest hier vielleicht noch einen Beispielton einstellen, damit man 
das ganze auch mal hören kann.

von J. S. (engineer) Benutzerseite


Lesenswert?

Die Frage habe ich kommen sehen. Die Tönchen, die ich damit gemacht 
habe, sind seinerzeit auf einem TMS320 gelaufen, teilweise in der 
Chammi:
http://www.96khz.org/htm/chameleonsynth.htm

Da habe ich aktuell nichts an isolierten Aufnahmen parat. Ich könnte 
aber mal was im FPGA-Synthie nachstricken. Standardmäßig habe ich das 
nicht drin, da schon vor langer Zeit rausgeworfen, weil die 
Klangqualität eben nicht so dolle ist und heute dank Rechenpower auf 
flexbilere Verfahren zurückgegriffen werden kann.

Es ist halt eine Rechenzeitspartechnik.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Sodele, auf die Schnelle eine Aufnahme mit 5 Sounds gestrickt mit dem 
hier:

http://96khz.org/images/beatmorph2.gif

Die Ladekurve ist eine logarithmisch abfallende Funktion von 1 bis 
praktisch 0 samt Spiegelung. 12ms lang. Rückkopplungen bei 4ms und 6ms.

1. Purer Klang der Exponentialfunktion und einfacher Rückführung 12ms 
mit Simple-EQ im "KP-Modus".

2. Gleiche Kurve mit 4ms (dritte Oberwelle) und angepasstem EQ.

3. Gleiche Kurve mit 6ms (zweite Oberwelle) und angepasstem EQ.

4. Sonderabgriff bei 12ms und 11.9ms -> Schwebung / Phasing

5. Nur die 2. und 3. Oberwelle ohne Grundwellenabgriff

von J. S. (engineer) Benutzerseite



Lesenswert?

Und weil es soviel Spass macht, noch eines mit einem Dreifach Feedback 
RAM: (Die Sample RAMs von oben einfach hintereinander geschaltet).

4 Töne:

1. Rauschen von 12ms, mit einfachem Feedback 0,99 auf linken und rechten 
Kanal mit Panning 25%, also leichtes Stereo - überwiegend noch Mono.

2. Jetzt das Feedback 1 auf 11,9ms einstellen, d.h. 2 Abgriffe für 
linken / rechten Kanal getrennt -> Phasing Stereo Sound

Diesen Doppelausgang des ersten RAMs in das zweite geben und ab jetzt in 
Stereo, also zweimal parallel prozessieren:

3. Feedback mit 4ms auf den einen Kanal, 6ms auf den anderen Kanal. 
Beide mit 50% hinzumischen

Es entstehen starke Betonungen der 3. und 2. Oberwelle

Diesen Doppelausgang des zweiten RAMs in das zdritte geben und wieder 
zweimal parallel prozessieren:

4. Ein Echo mit 499ms und 749ms bei maximalem Panning links und rechts. 
Entspricht bei den 4 Sekunden Länge einem rhytmischen Takt. Die 1ms 
Offset gegenüber dem theoretischen Wert erzeugen noch einen weiteren 
Stereoeffekt, da die Reflektion auf der Gegenseite etwas früher 
eintrifft, als der repetierte Klang aus dem Mono.

Mit mehr, als 12ms kann man auch Lücken erzeugen, d.h. man lässt der 
Adresspointer doppelt so weit laufen. Erzeugt Scattering und untertönige 
Frequenzen. Auch mit den Echos kann man noch spielen. Braucht halt etwas 
RAM.

Zumindest die beiden ersten Stufen müssten sich mit einem AVR leicht 
machen lassen.

Die EQs sind einfach IIR, jeweils händisch angepasst, damit der typische 
Gitarrenanschlag entsteht.

von Carl (Gast)


Lesenswert?

Danke für die Beispiele, sie klingen ganz interessant.

Julius O.Smith III hat die Waveguides hier ziemlich ausführlich 
behandelt:
https://ccrma.stanford.edu/~jos/pasp/

von Rolf S. (audiorolf)


Lesenswert?

Die Idee mit dem Karplus-Strong ist ja ziemlich alt und das wave guiding 
gründet sich irgendwo darauf (oder umgekehrt). Benutzt das eigentlich 
jemand aktiv? Ich kenne kein Keyboard, wo es eine solche Funktion hat.

von J. S. (engineer) Benutzerseite


Lesenswert?

Carl schrieb:
> Julius O.Smith III hat die Waveguides hier ziemlich ausführlich
> behandelt:

Die dort gezeigte Version des KS hat aber den Nachteil, dass die 
Dämpfung nur dadurch vollzogen wird, dass Rundungsfehler bei der 
Addition der beiden Samples wirken (sollen / können). Das macht etwas 
unangenehme spektrale Fehler und ist sehr hart. Ich hatte da von Anfang 
an immmer IIR-Filter drin. Diese sind an der Stelle sehr audiotauglich.

Rolf S. schrieb:
> Benutzt das eigentlich jemand aktiv?

https://www.ugoaudio.com/index.php/vst-plugins
http://www.vst4free.com/free_vst.php?plugin=Phyzmod&id=1638

Win32 ... naja.

Gibt aber auch einen für Ableton auf YT. Kenne ich aber nicht.
https://www.youtube.com/watch?v=YLwDKyOHhAY

So wie sich das Video anhört, klingt das weder nach eine Gitarre, noch 
nach einer brauchbaren SynGit für Electro. Hat eher klangliche Züge der 
8-Bit-Ära.

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Jürgen S. schrieb:
> wie es auch die eingespannte Seite tun würde.
Saite :-)

Jürgen S. schrieb:
> Die Methode funktioniert mit einem rückgekoppelten RAM, wie es auch der
> Karplus-Strong verwendet und gehört auch zu den dort angefragten "wave
> guide"-Verfahren.

Waveguides arbeiten aber so, dass es eine invertierende und eine nicht 
invertierende Reflektion gibt. Die ist bei dir nicht zu finden.

Karpuls-Strong ist auch insoweit anders, als dass das Signal positiv 
zurückgeführt wird und nicht wechselt.

Carl schrieb:
> Waveguides hier ziemlich ausführlich

Oder hier:
https://www.dsprelated.com/freebooks/pasp/Digital_Waveguides.html

von J. S. (engineer) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Waveguides arbeiten aber so,
> Karpuls-Strong ist auch insoweit anders,

Deshalb hatte ich meine Architektur auch nicht so genannt. Schaut man 
sich den KP genauer an, dann arbeitet er mit einer RAM-Vorbelegung, die 
angeblich aus perfektem Rauschen besteht. Wenn das aber keinen offset 
hat, dann bekommt man nur einen zufälligen Inpuls in das System. Die 
Anfangsamplitude ist nicht so klar definiert. Deshalb arbeiten WG gerne 
mit einem offsetbehafteten Signal in der oberen Hälfte und einem 
invertierenden Pfad. Die Welle läuft dann positiv hin und her.

Ich (brauche nicht, aber) verwende gegenüber dem KP einen Offset und 
habe die doppelte Aussteuerung mit gut definierter Anfangsamplitude. 
Durch die generell invertierenden Rückführung, brauche ich auch nicht 
den doppelten Pfad, wie bei klassisches wave guides und mein Ton ist 
damit im Vergleich bei gegebener RAM-Länge eine Oktave tiefer.

Positiv formuliert: Ich komme für die gleiche Frequenz mit dem halben 
RAM aus.

Nachteil: Ich kann die Tonhöhe ihn nur halb so genau ganzzahlig tunen.

Zudem habe ich das theoretische Problem, dass der Anfangsimpuls bei 
einem KP doppelt so lang ist. (Bei den WGs i.d.R. auch).

Nachteil 1 ist bei der einfachen Tonerzeugung keiner und kann bei 
höheren Ansprüchen durch die ohnehin notwendige Interpolation mit gelöst 
werden.

Nachteil 2 erledige ich in der Praxist damit, dass ich das RAM mit einem 
variabel langen Impuls vorbelege. Der kann kürzer sein, als die 
RAM-Länge oder auch länger und damit das RAM länger anregen, als es 
zeitlich wirkt. Es gibt zwar ein overlap in Form einer Stufe, die kann 
aber per Sprung-Modulation oder einem einfachen Fenster entschärft 
werden.

Damit ist meine Transiente wesentlich besser gestaltbar und auch nicht 
von der RAM-größe = Tonhöhe abhängig.

von He. (Gast)


Lesenswert?

Jürgen S. schrieb:
> und mein Ton ist
> damit im Vergleich bei gegebener RAM-Länge eine Oktave tiefer.

Ist das patentiert oder sonst in einer Weise geschützt?

von J. S. (engineer) Benutzerseite


Lesenswert?

Harald E. schrieb:
> Ist das patentiert oder sonst in einer Weise geschützt?

Da ist mir nichts bekannt. Es gibt dazu eine Reihe von Abwandlungen. 
Meine hatte ich seinerzeit auf der Webseite publiziert, ein Patent wäre 
abgelaufen. Das Originalpatent ist glaube ich aus den 80ern und schon 
zweimal abgelaufen. Die Methode ist auch nicht mehr Standard in der 
Wellensynthese, weil das einfacher und besser geht. Will man nämlich 
eine Frequenz sehr genau einstellen und auch noch mit Vibrato versehen, 
muss man den rückgeführten Wert stark filtern und 
zwischen-interpolieren, um Phasensprünge zu vermeiden. Im FPGA geht das 
halt sehr einfach, weil man extremen Bandbreiten-overhead hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.