Funktionsweise von Waveshapern?

  • Ersteller synthpark
  • Erstellt am
@CharlyBeck Du bringst hier ein paar Sachen durcheinander.

Eine eindeutige Zuordnung ist nicht das gleiche wie eine Lineare Funktion. Diese hat als Funktionsgraphen genau eine Gerade.

f(x) = m*x + n ist die Grundform der Linearen Funktion ( sagt mir Wikipedia:D )

Naja, ohne jetzt klugscheissen zu wollen, nur als rache weil ihr mich ins boxhorn gejagt habt: ;)

Der Vorgang, den ein Prozessor macht, wenn er so eine eindeutige zuordnung wie beschrieben auflöst lautet:

zieladresse = elementgrösse * index + startadresse
f(x) = m*x + n


in programmiersrpache sieht das dann z.b. so aus:

y = zuordnung[x];

insofern ist dieser teilaspekt des systems eine lineare funktion. und ich denke genau das hatte kuno ursprünglich gemeint.

da die zordnungstabelle nicht 2 ^ bittiefe gross ist, wird man (vermutlich) wiederrum linear zwischen den 2 am sample anliegenden punkten interpolieren. schon die 2te lineare funktion in dem konstrukt. nicht liniear ist lediglich die generierung der zuordnungstabelle, aber in dem moment wo es eingangsdaten sind, ist es nicht teil des systems.

andersrum könntest du ja auch mit einer exponental funktion, mit den richtigen daten in der richtigen reihenfolge befüttert, eine linie generieren. ist die exponentialfunktion deshalb linear?

und - um noch ein bisschen praxis einfliessen zu lassen - ich glaube ich würde versuchen - wenn ich einen (etwas komplexeren) waveshaper embeded implementieren würde - diese zuordnungstabelle nicht vom selben prozess berechnen lassen, der die samples berechnet werden. die sampleberechung würde dann auf rein linearen funktionen basieren - sehr schnell. lediglich die berechnung der zuorndungstabelle könnte - fast - beliebig komplex sein. die trägheit würde zb zu einigen millisekuden verzögerung nach dem drehen am synthie-knöpfchen bis zur hörbaren beeinflussung des sounds führen. aber in einigen millisekunden + verwaltungsaufwand zum transport der tabelle in den anderen prozess - könnte man dann sicherlich mit splines rumhantieren und trotzdem noch ne gute polyphonie zustande bekommen. und hören tut man das auch nicht. (~23 ms zwischen 2 perkusiven sounds nimmt der mensch als isolierten klang wahr)... reservieren muss man halt einige mips für die vorberechnung der zuordnungstabelle, damit die auch bei voller stimmenauslastung nicht bis zum st nimmerleinstag dauert.

@synthpark : hier haste deinen performanten waveshaper ggf mit polynomzug... in dem paper stehen solche praktikten sicherlich nicht drin, das ist die mathematische grundlage (für die generierung der zuordnungstabelle). aber meistens wird in der implementierung sehr getrickst, um die echtzeitanforderungen erfüllen zu können.
 
Zuletzt bearbeitet:
Die alten Casio CZ und VZ Digital-Synthesizer (Hochzeit ca. Ende der 1980er Jahre), man nannte es hier Phase Distortion Synthese, nutzen im Kern genau diese Technik um ihre Klänge zu generieren.







Phase_distortion_synthesis
 
Zuletzt bearbeitet von einem Moderator:
Waveshaper sind mitunter genau das Gegenteil eines LTI Systems, additiv überlagerte Sounds führen zu einem anderen Ergebnis als wenn man die Sounds einzeln anlegen würde und die Einzel-Ergebnisse additiv zusammensetzen könnte (wie bei linearen Filtern).

Eine einfach aufgebaute Waveshape-Synthese ist lange nicht so komplex und facettenreich wie eine mehroperatorige FM-Synthese, kann aber mit sehr wenigen Parametern oftmals sogar FM-Ähnliches bis Analoges erzeugen. Das hat mich bei den alten CZ-Synths begeistern können. Dennoch wird man dieser Synthese schnell überdrüssig, da sehr schnell ausgelotet (vom "Sinus bis Zerre" quasi, im Kern ja wirklich nicht mehr und nicht weniger). Ich zog und ziehe FM aus Sounddesigneraspekten daher stets vor, die frei stimmbaren Operatoren, deren frei justierbare Hüllkurven sowie die Algorithmen sind ungleich abwechslungsreicher zu verschalten.
Leider hat sich die Waveshaping-Synthese nie richtig durchgesetzt, eigentlich schade.
Ein paar Module oder VSTis machen das jetzt ja. Das ist nur gut!
 
Zuletzt bearbeitet von einem Moderator:
in programmiersrpache sieht das dann z.b. so aus:

y = zuordnung[x];
:D Ich verstehe gar nicht, warum Programme immer fetter werden.
Ausserdem macht deine "Programmzeile" nichts anderes, als ein schon zuvor berechnetes und an zuordnung[x] abgelegtes Ergebnis abzuholen. Und wir wollen hoffen, das deine Programmiersprache eine ArrayIndexOutOfBoundsException kennt ;-)
Eine lineare Funktion abzubilden ist zwar kein Hexenwerk, jedoch "ein wenig umfangreicher".
 
in programmiersrpache sieht das dann z.b. so aus:

y = zuordnung[x];
:D Ich verstehe gar nicht, warum Programme immer fetter werden.
Ausserdem macht deine "Programmzeile" nichts anderes, als ein schon zuvor berechnetes und an zuordnung[x] abgelegtes Ergebnis abzuholen. Und wir wollen hoffen, das deine Programmiersprache eine ArrayIndexOutOfBoundsException kennt ;-)
Eine lineare Funktion abzubilden ist zwar kein Hexenwerk, jedoch "ein wenig umfangreicher".

Richtig, du verstehst es nur nicht.

1. Geht es bei dem besprochenen FL-Studio Waveshaper, der den Funktionsgraphen in form einer lookup tabelle ablegt nur darum, einen wert abzuholen.

2. In der Zeile drüber steht, was der Prozessor bzw. der compiler an der stelle rechnet. Das ist eine lineare funktion in reinform, wie schnuffke sie aus wiki abgeschrieben hat...
 
Ich hab grad mal was in max4live gebastelt.

Leider ist mir am ende aufgefallen, dass es nicht (so einfach) möglich ist, die über die GUI-Control-Flow-Objekte ein Audiosignal zu bearbeiten. :p

Naja, mann kann einen Funktionsgraphen generieren über sinus schnwingungen, man kann ihn per maus verändern und man kann das eingabesample mittels slider verändern und über den 2ten slider das ausgabesample beobachten....

War ne riesen fummelei in max stell ich mich an wie ein anfänger... Aber es tut. Kann man super waveshapern damit jetzt ;-)

Der rechte teil in hauptpatcher ist die kurvengenerierung - der nicht lineare teil. Die 2 Sub Patcher links realisieren den Teil, der pro sample in echtzeit berechnet wird.

Man merkt die prozesstrennung schon im m4l device - der rechte part wird nur berechnet wenn man an den drehknöpfchen fummelt, der linke part nur, wenn man den eingangs-sample-slider bewegt.

Hier ist das Max4Live Device auf meiner google drive:
 
Zuletzt bearbeitet:
Und wir wollen hoffen, das deine Programmiersprache eine ArrayIndexOutOfBoundsException kennt

Nö- Access Faults zu debuggen, macht viel zu viel spass. Warum indexe prüfen, ist viel zu langsam ;-)
 
Die alten Casio CZ und VZ Digital-Synthesizer (Hochzeit ca. Ende der 1980er Jahre), man nannte es hier Phase Distortion Synthese, nutzen im Kern genau diese Technik um ihre Klänge zu generieren.
Phase_distortion_synthesis

War das auf mein Lookup array wavetable ding bezogen? Ja damals wars vl. bissl langsamer. die cpus...;-)

In meinem aktuellen Projekt hat der Kollege aber auch auf nem arm prozessor timing probleme bei verwendung der exp-funktion bekommen. Ich hatte schon probleme mit 6 us jitters die durch framebuffer zugriffe durch den lcd controller verursacht wurden. und wenn synthpark sagt, es soll performen ist diese veraltete technik vl. doch noch aktuell... zumal es bei hardware auch meistens um stückpreise geht. weiss ja nicht was er vorhat...
 
Waveshaper sind mitunter genau das Gegenteil eines LTI Systems, additiv überlagerte Sounds führen zu einem anderen Ergebnis als wenn man die Sounds einzeln anlegen würde und die Einzel-Ergebnisse additiv zusammensetzen könnte (wie bei linearen Filtern).

Eine einfach aufgebaute Waveshape-Synthese ist lange nicht so komplex und facettenreich wie eine mehroperatorige FM-Synthese, kann aber mit sehr wenigen Parametern oftmals sogar FM-Ähnliches bis Analoges erzeugen. Das hat mich bei den alten CZ-Synths begeistern können. Dennoch wird man dieser Synthese schnell überdrüssig, da sehr schnell ausgelotet (vom "Sinus bis Zerre" quasi, im Kern ja wirklich nicht mehr und nicht weniger). Ich zog und ziehe FM aus Sounddesigneraspekten daher stets vor, die frei stimmbaren Operatoren, deren frei justierbare Hüllkurven sowie die Algorithmenverschaltungen sind ungleich abwechslungsreicher zu verschalten.
Leider hat sich die Waveshaping-Synthese nie richtig durchgesetzt, eigentlich schade.
Ein paar Module oder VSTis machen das jetzt ja. Das ist nur gut!

Ich fang bei sowas immer gerne an zu spinnnen. Hab mir z.b. gedacht man könnte doch als wave-shaping graph eine anderes audiosignal verwenden? Und dieses ganz langsam abfahren.... Keine ahnung wie sich das anhören würde, wäre ähnliches gefritzel vl wie eine table für einen wavetable synth zu erstellen - wobeis beim waveshapen ja gerne zerstören darf, im gegensatz zum wavetable ;-)
 
Die alten Casio CZ und VZ Digital-Synthesizer (Hochzeit ca. Ende der 1980er Jahre), man nannte es hier Phase Distortion Synthese, nutzen im Kern genau diese Technik um ihre Klänge zu generieren.







Phase_distortion_synthesis


die PD Synthese shaped nicht die Wellenform selbst, sondern die Phase, bevor diese auf die Sinuswellenform angewendet wird. Ich mag ja die PD Synthese, da gibts ein cooles Plugin :D.

 
In meinem aktuellen Projekt hat der Kollege aber auch auf nem arm prozessor timing probleme bei verwendung der exp-funktion bekommen. Ich hatte schon probleme mit 6 us jitters die durch framebuffer zugriffe durch den lcd controller verursacht wurden. und wenn synthpark sagt, es soll performen ist diese veraltete technik vl. doch noch aktuell... zumal es bei hardware auch meistens um stückpreise geht. weiss ja nicht was er vorhat...

Ich habe dieses Board vor ca. 5 Jahren gekauft und programmiere einen Synth drauf,
zusammen mit einem DA-Wandler Evalboard. Hat mit Software Entwicklung nicht viel gemein.

Design basiert auf einem Artix7 200er, da ist jeder DSP und ARM Prozessor ne Schnecke dagegen. Bei den neusten Intel bin ich mir nicht so sicher, die sind ganz schön flott.




Timing Probleme bei Exp-Function (2^x) sollten gar nicht auftreten.

Du machst erstmal einen Integer-Shift, kann jeder Prozessor. Danach interpolierst du linear die Funktion 2^x von 0 to 1. Da die Funktion sehr smooth ist, braucht man nicht soviele Stützstellen für eine Tabelle, zum Beispiel 1024. Dann sind zwei benachbarte Ramzugriffe auf die Lookuptabelle notwendig, oder halt beide in einem Wisch. Ein FPGA zum Beispiel hat 365 Ramblöcke, Dual-Port. Da reicht einer aus.
 
Zuletzt bearbeitet:
Ich hab grad mal was in max4live gebastelt.

Leider ist mir am ende aufgefallen, dass es nicht (so einfach) möglich ist, die über die GUI-Control-Flow-Objekte ein Audiosignal zu bearbeiten. :p

Naja, mann kann einen Funktionsgraphen generieren über sinus schnwingungen, man kann ihn per maus verändern und man kann das eingabesample mittels slider verändern und über den 2ten slider das ausgabesample beobachten....

War ne riesen fummelei in max stell ich mich an wie ein anfänger... Aber es tut. Kann man super waveshapern damit jetzt ;-)

Der rechte teil in hauptpatcher ist die kurvengenerierung - der nicht lineare teil. Die 2 Sub Patcher links realisieren den Teil, der pro sample in echtzeit berechnet wird.

Man merkt die prozesstrennung schon im m4l device - der rechte part wird nur berechnet wenn man an den drehknöpfchen fummelt, der linke part nur, wenn man den eingangs-sample-slider bewegt.

Hier ist das Max4Live Device auf meiner google drive:


kann ich leider nicht ausprobieren, Ableton ist nicht meine Welt. :)
 
In meinem aktuellen Projekt hat der Kollege aber auch auf nem arm prozessor timing probleme bei verwendung der exp-funktion bekommen. Ich hatte schon probleme mit 6 us jitters die durch framebuffer zugriffe durch den lcd controller verursacht wurden. und wenn synthpark sagt, es soll performen ist diese veraltete technik vl. doch noch aktuell... zumal es bei hardware auch meistens um stückpreise geht. weiss ja nicht was er vorhat...

Ich habe dieses Board vor ca. 5 Jahren gekauft und programmiere einen Synth drauf,
zusammen mit einem DA-Wandler Evalboard. Hat mit Software Entwicklung nicht viel gemein.

Design basiert auf einem Artix7 200er, da ist jeder DSP und ARM Prozessor ne Schnecke dagegen. Bei den neusten Intel bin ich mir nicht so sicher, die sind ganz schön flott.




Timing Probleme bei Exp-Function (2^x) sollten gar nicht auftreten.

Du machst erstmal einen Integer-Shift, kann jeder Prozessor. Danach interpolierst du linear die Funktion 2^x von 0 to 1. Da die Funktion sehr smooth ist, braucht man nicht soviele Stützstellen für eine Tabelle, zum Beispiel 1024. Dann sind zwei benachbarte Ramzugriffe auf die Lookuptabelle notwendig, oder halt beide in einem Wisch. Ein FPGA zum Beispiel hat 365 Ramblöcke, Dual-Port. Da reicht einer aus.


Oia. Eine komplette Applikation auf FPGA? Na denn, viel Spass - respekt...

Exp+Timing Probleme: Was heisst timing probleme, es war einfach zu langsam damit. exp(x) ist nicht dasselbe 2^x...im endeffekt hat man x^y gerechnet, indem man die variable bei der berechnung des aktuellen samplepunkts mit sich selbst multipliziert hat und bis zum nächsten samplepunkt aufgehoben hat. Das ist wesentlich schneller, als pow oder exp zu verwenden... bit shiften wäre natürlich schnell ja. wenn du damit ein x^y gebacken bekommst.... ;-)

meintest du, die ergebnise für die exp funktiion als rom-lookuptabelle vorzuberechnen?
 
Zuletzt bearbeitet:
Exp+Timing Probleme: Was heisst timing probleme, es war einfach zu langsam damit. exp(x) ist nicht dasselbe 2^x...im endeffekt hat man x^y gerechnet, indem man die variable bei der berechnung des aktuellen samplepunkts mit sich selbst multipliziert hat und bis zum nächsten samplepunkt aufgehoben hat. Das ist wesentlich schneller, als pow oder exp zu verwenden... bit shiften wäre natürlich schnell ja. wenn du damit ein x^y gebacken bekommst.... ;-)

An welcher Stelle brauchst du denn exp(x) überhaupt?

Für die Tonhöhe reicht C0*2^(n/12), also irgendeine Root Note, von der man auf alle Noten kommt.

Für exponentielle Hüllkurven reichen iterative Berechnungsvorschriften, also Differenzengleichungen, um den nächsten Samplewert zu berechnen, anstatt explizit auf die Exponentialfunktion zuzugreifen.

Ich sehe also nicht, an welcher Stelle man die exp(x) bräuchte. Falls doch, kann man exp(x) auch ausdrücken als

exp(x) = 2^(x*log2(e)) = 2^(x*1.44269504088896)

= 2^(floor(x*1.44269504088896)) * 2^(frac(x*1.44269504088896))

= 2^K * 2^y mit K integer und y gebrochen zwischen 0 und 1

Wie man sieht, muss man die Zahl mit einer Konstanten multiplizieren und danach das Ergebnis als Input für 2^x nehmen. Und dann hat man den Vorteil des Shiftens der Binärdarstellung wegen dem Integer Anteil (siehe floor (...))! Ist ein Maschinenbefehl. Der Rest wie beschrieben per Lookup Tabelle (für 2^K shiftet man, für 2^y Lookup).

Dank des Shiftens bekommt man den Riesendynamikumfang der Exp-Funktion vernünftig gebacken.

Das mir FPGA ist so: mit PC basierter Software kenn ich mich nicht so gut aus, also systemnahe Programmierung mitsamt den ganzen Libraries von Microsoft etc. oder auch JUICE, mit FPGA schon. Fällt schon aus diesem Grund leichter. Abgesehen von der Monsterperformance, die man dann potentiell hat.
 
Zuletzt bearbeitet:
Das mit dem exp war gar nicht auf das problem hier bezogen, war nur aus dem nähkästchen geplaudert... Weiss jetzt gar nicht mehr, wie ich da drauf kam / in welchem Kontext ich das geschrieben hab. Aber ja, so wird das ding natürlich sehr viel schneller...

Ja, mit FPGAs kenne ich mich nun 0 aus. Weiss nur dass sie sehr knifflig zu programmieren sind und so wie ich das immer mitbekommen habe, werden darauf nur einzelne routinen drauf ausgelagert. Da auf dem Eval Bord keine andere mcu ist nehme ich an, du willst das alles - samte Knöpfchen auswertung und bedienlogik auf dem fpga machen? ich würde wahrscheinlich schon an der encoder auwertung scheitern ;-)
 
Ja, mit FPGAs kenne ich mich nun 0 aus. Weiss nur dass sie sehr knifflig zu programmieren sind und so wie ich das immer mitbekommen habe, werden darauf nur einzelne routinen drauf ausgelagert. Da auf dem Eval Bord keine andere mcu ist nehme ich an, du willst das alles - samte Knöpfchen auswertung und bedienlogik auf dem fpga machen? ich würde wahrscheinlich schon an der encoder auwertung scheitern ;-)

FPGAs sind einfach programmierbare Logik mit zusätztlichen Speichern und DSP Blöcken (sprich Multiplizierern). Wer in Gattern und Registern denkt, und endlichen Automaten etc., also ein Digitaldesigner, der kommt damit zurecht. Alles geschieht gleichzeitig, nicht sequentiell, und die ganzen Register-Bitbreiten (Register ist sowas ähnliches wie Variable in der SW Welt) sind grundsätzlich variabel und zu optimieren. Dank VHDL oder Verilog ist das alles beherrschbar. Es gibt normalerweise einen Takt, manchmal mehrere. Logische Verknüpfungen (asynchrone Logik) müssen bis zum nächsten Takt stabil sein (ein Ergebnis liefern). Eine Aufgabe besteht darin, nach Gefühl Logik zwischen Registerstufen auszubalanzieren, das Design dann testweise zu synthetisieren und schauen, obs passt. Wenn man Synth Stimmen programmiert, werden diese entweder sequentiell berechnet (geringere Samplerate) oder sind als Einzelstimmen physikalisch als Module instantiiert (zB wegen extrem hoher Samplerate), genau wie in einem Analogsynth.
Das lernt man nicht über Nacht, aber so schwierig ist es auch nicht, wenn man die Prinzipien verstanden hat ;). Sequentiell programmieren geht in gewissem Umfang auch.

Ist halt alles extrem "lowlevellig", auf Bitebene.

 
Zuletzt bearbeitet:
Danke für die kurze einführung... aber nee, ich verplemper meinen urlaub lieber mit anderem unfug ;-)

bin eh gerner in hi-level geschichten ala .net unterwegs.. mit registern kannst mich jagen :D
 
Ja, mit FPGAs kenne ich mich nun 0 aus. Weiss nur dass sie sehr knifflig zu programmieren sind und so wie ich das immer mitbekommen habe, werden darauf nur einzelne routinen drauf ausgelagert. Da auf dem Eval Bord keine andere mcu ist nehme ich an, du willst das alles - samte Knöpfchen auswertung und bedienlogik auf dem fpga machen? ich würde wahrscheinlich schon an der encoder auwertung scheitern ;-)

FPGAs sind einfach programmierbare Logik mit zusätztlichen Speichern und DSP Blöcken (sprich Multiplizierern). Wer in Gattern und Registern denkt, und endlichen Automaten etc., also ein Digitaldesigner, der kommt damit zurecht. Alles geschieht gleichzeitig, nicht sequentiell, und die ganzen Register-Bitbreiten (Register ist sowas ähnliches wie Variable in der SW Welt) sind grundsätzlich variabel und zu optimieren. Dank VHDL oder Verilog ist das alles beherrschbar. Es gibt normalerweise einen Takt, manchmal mehrere. Logische Verknüpfungen (asynchrone Logik) müssen bis zum nächsten Takt stabil sein (ein Ergebnis liefern). Eine Aufgabe besteht darin, nach Gefühl Logik zwischen Registerstufen auszubalanzieren, das Design dann testweise zu synthetisieren und schauen, obs passt. Wenn man Synth Stimmen programmiert, werden diese entweder sequentiell berechnet (geringere Samplerate) oder sind als Einzelstimmen physikalisch als Module instantiiert (zB wegen extrem hoher Samplerate), genau wie in einem Analogsynth.
Das lernt man nicht über Nacht, aber so schwierig ist es auch nicht, wenn man die Prinzipien verstanden hat ;). Sequentiell programmieren geht in gewissem Umfang auch.

Ist halt alles extrem "lowlevellig", auf Bitebene.

Interessant, wie du die Dinge angehst! Mir wäre das, obwohl selbst Programmierer auf Low- und Highlevel unterwegs zuviel ... Arbeit nach der Arbeit ;-)

bin eh gerner in hi-level geschichten ala .net unterwegs
Nö.
 
Interessant, wie du die Dinge angehst! Mir wäre das, obwohl selbst Programmierer auf Low- und Highlevel unterwegs zuviel ... Arbeit nach der Arbeit ;-)

Naja das ist ne schöne Entspannungsübung, hat sogar Suchtpotential, was ich nie gedacht hätte. Bin grad eh 2 Monate in Elternzeit. Heute ist der Ringmodulator dran :) ...
 
Zuletzt bearbeitet:

Ähnliche Themen

moonbooter
    • Danke
  • Artikel
Antworten
4
Aufrufe
4K
ollo123
ollo123
moonbooter
    • Danke
  • Artikel
Antworten
4
Aufrufe
5K
music-anderson
M
moonbooter
    • Danke
  • Artikel
Antworten
1
Aufrufe
13K
ollo123
ollo123
moonbooter
    • Danke
  • Artikel
Antworten
0
Aufrufe
9K
moonbooter
moonbooter
moonbooter
    • Danke
  • Artikel
Testberichte Test: Dreadbox Typhon
Antworten
2
Aufrufe
16K
KoolKolle
KoolKolle

Oft gelesene Themen

Zurück
Oben