Etwas schwierig zu erklären...

Diskussionsforum für Fragen zur Struktur und Implementation in REAKTOR, auch DSP, Literatur und begleitende Software

Moderator: herw

Antworten
fweth
meister
Beiträge: 118
Registriert: 21. November 2007, 16:01
Wohnort: Österreich

Etwas schwierig zu erklären...

Beitrag von fweth »

Hm mein Problem ist jetzt vielleicht etwas schwierig zu erklären, und ich möchte auch nicht unnötig ins Detail gehen, um keine Verwirrung zu stiften.

Mal ganz grob: Ich hab mal Interessehalber versucht das Verhalten einer schwingenden Saite zu simulieren (also nicht den Klang, nur das Verhalten). Das ist natürlich eine abfallende Sinusschwingung, aber ich wollte es einfach mal so machen, wie es physikalisch passiert. Das heißt: Es wirken zwei Kräfte, die bestimmen wie sich der Wert verändert. Die eine ist die Trägheit, und die andere die Spannung der Saite, das heißt je weiter der Wert von 0 entfernt ist, desto mehr "wird er wieder zu 0 "hingezogen". Und diese Kraft kann jetzt eben linear wirken, also einfach einen Bruchteil von |x| ausmachen (wie es in Wirklichkeit ist), oder auch potenziell, also |x|^y. Wenn sie potenziell wirkt, dann verändert sich die Tonhöhe beim ausklingen.

Aber komischerweise passiert, wenn diese Spannung Potenziell wirkt, immer folgendes: Der Ton klingt aus, dann tänzelt der Ausgangswert immer näher um 0 herum (schon längst nicht mehr hörbar), und dann, wenn die Bewegung eigentlich zum Stillstand kommen sollte, wird er entweder plötzlich ganz unglaublich groß, oder es gibt gleich nur noch einen nan Wert, und der Sound stürzt ab. Wenn ich das die Potenz auf 1 lasse, oder das x[>0]^y Modul gleich weglasse, passiert so etwas nicht. Aber es sollte eigentlich auch nicht an dem Wert 0 liegen, denn ich habe es mittels Relay so geregelt, dass wenn der x Wert gleich 0 ist, dann läuft er garnicht durch das x[>0]^y Modul, sondern bleibt einfach 0. Am Anfang, wenn ich das Ensemble öffne, und bevor ich einen Anschlag tätige, ist der Ausgangswert ja auch einfach 0, und das scheint kein Problem zu sein.

Also ich denke das ist jetzt sicher schwer nachzuvollziehen, aber vielleicht hat ja irgendjemand trotzdem einen Lösungsansatz parat.

Vielen Dank!
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Etwas schwierig zu erklären...

Beitrag von herw »

fweth hat geschrieben:Hm mein Problem ist jetzt vielleicht etwas schwierig zu erklären, und ich möchte auch nicht unnötig ins Detail gehen, um keine Verwirrung zu stiften.

Mal ganz grob: Ich hab mal Interessehalber versucht das Verhalten einer schwingenden Saite zu simulieren (also nicht den Klang, nur das Verhalten). Das ist natürlich eine abfallende Sinusschwingung, aber ich wollte es einfach mal so machen, wie es physikalisch passiert. Das heißt: Es wirken zwei Kräfte, die bestimmen wie sich der Wert verändert. Die eine ist die Trägheit, und die andere die Spannung der Saite, das heißt je weiter der Wert von 0 entfernt ist, desto mehr "wird er wieder zu 0 "hingezogen". Und diese Kraft kann jetzt eben linear wirken, also einfach einen Bruchteil von |x| ausmachen (wie es in Wirklichkeit ist), oder auch potenziell, also |x|^y. Wenn sie potenziell wirkt, dann verändert sich die Tonhöhe beim ausklingen.

Aber komischerweise passiert, wenn diese Spannung Potenziell wirkt, immer folgendes: Der Ton klingt aus, dann tänzelt der Ausgangswert immer näher um 0 herum (schon längst nicht mehr hörbar), und dann, wenn die Bewegung eigentlich zum Stillstand kommen sollte, wird er entweder plötzlich ganz unglaublich groß, oder es gibt gleich nur noch einen nan Wert, und der Sound stürzt ab. Wenn ich das die Potenz auf 1 lasse, oder das x[>0]^y Modul gleich weglasse, passiert so etwas nicht. Aber es sollte eigentlich auch nicht an dem Wert 0 liegen, denn ich habe es mittels Relay so geregelt, dass wenn der x Wert gleich 0 ist, dann läuft er garnicht durch das x[>0]^y Modul, sondern bleibt einfach 0. Am Anfang, wenn ich das Ensemble öffne, und bevor ich einen Anschlag tätige, ist der Ausgangswert ja auch einfach 0, und das scheint kein Problem zu sein.

Also ich denke das ist jetzt sicher schwer nachzuvollziehen, aber vielleicht hat ja irgendjemand trotzdem einen Lösungsansatz parat.

Vielen Dank!
Dein Modell ist in der Umsetzung nicht korrekt, aber ich akzeptiere mal zunächst deinen Ansatz. Du hast richtigerweise bei der Potenz die Basis x=0 als Sonderfall ausgespart, da 0^y=1, das zur Mathematik. Nun zur CPU: der Mathematiker kann exakt denken und berechnen, die Maschine ist in ihrer Genauigkeit begrenzt, d.h 0 ist nicht gleich 0. Der Wert kann exakt erreicht werden (Zufall !?) oder durch notwendige Rundungen erreicht werden. Grundsätzlich sollte man Gleichheit niemals abfragen, sondern immer im Sinn von "nah genug an ...". D.h. grenze den Sonderfall x=0 zunächst mal durch eine Intervallabfrage wie |x|<10^-6 oder ähnliches ab. Dadurch kann es nicht zu unkalkulierbaren Rundungen kommen.

Nun zum Ansatz: leider kann ich nur erahnen, welches mathematische Modell hinter deiner Gitarrensaite steckt: Es wirkt nur eine Kraft (die Rückstellkraft), die bei leichtem Zupfen und nach einer kurzen Einschwingphase (die keine Sinusschwingung darstellt) in der Tat linear mit dem Abstand zur Ruhelage zunimmt und daher zwangsläufig auf eine Sinusschwingung führt. Die Spannung - wie du sie nennst - ist keine zweite Kraft, sondern einfach die Anfangsamplitude, zu der eine entsprechende Rückstellkraft gehört. Die Auslenkung nimmt mit der Zeit exponentiell ab (und nicht wie bei deinen Ansatz potenziell), physikalich also Reibungs- und Energieverluste. Leider viel Fachchinesisch, ich hoffe es ist einigermaßen verständlich. Die mathematische Simulation einer Gitarrensaite ist ein System (!) von schwingungsfähigen Körpern, die untereinander gekoppelt sind. Für die Klangerzeugung in REAKTOR ist das eher unwichtig, da Du ja nur ein Schwingungssystem emulieren möchtest.

Bei wikipedia findest Du unter dem Stichwort "Schwingung" und dann unter "gedämpfte Schwingung" den mathematischen Ansatz - keine phsikalische Emulation.

ciao herw
fweth
meister
Beiträge: 118
Registriert: 21. November 2007, 16:01
Wohnort: Österreich

Re: Etwas schwierig zu erklären...

Beitrag von fweth »

herw hat geschrieben:grenze den Sonderfall x=0 zunächst mal durch eine Intervallabfrage wie |x|<10^-6 oder ähnliches ab. Dadurch kann es nicht zu unkalkulierbaren Rundungen kommen.
Super, das war die Lösung. Vielen Dank!

Wann kommt es eingetlich zu nan Werten? In den meisten fällen einfach dann, wenn ein Wert zu hoch ist oder? Wie kann man einen Wert am besten einschränken, also zB. sagen, er soll nicht größer als 1000 und nicht kleiner als -1000 sein? Gibts da ein Modul dafür? Oder behilft man sich da auch mittels Relays?

Danke
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Etwas schwierig zu erklären...

Beitrag von herw »

fweth hat geschrieben:[...]
Wann kommt es eingetlich zu nan Werten? In den meisten fällen einfach dann, wenn ein Wert zu hoch ist oder? Wie kann man einen Wert am besten einschränken, also zB. sagen, er soll nicht größer als 1000 und nicht kleiner als -1000 sein? Gibts da ein Modul dafür? Oder behilft man sich da auch mittels Relays?

Danke
Da kannst Du doch einfach das clipping-Modul verwenden, wenn Du nur eine Begrenzung willst. Wenn Du außerhalb des Bereiches andere Rechnungen oder Werte festlegen willst, dann schau doch einfach mal in das clipping-Modul hinein. Relays finde ich in diesem Fall nicht geeignet, obwohl sie sehr ähnlich aufgebaut sind; sie werden aber von außen gesteuert, Du möchtest aber eine automatische Begrenzung. Das geht mit dem Clip-MinMax-Modul sehr schön.
Leider ist es etwas sehr unübersichtlich programmiert, daher zeige ich hier mal eine etwas aufgeräumte Version.
clip minmax.gif
ciao herw
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
fweth
meister
Beiträge: 118
Registriert: 21. November 2007, 16:01
Wohnort: Österreich

Re: Etwas schwierig zu erklären...

Beitrag von fweth »

Gut, danke!

Es gibt einfach so viele grundlegende Sachen, mit denen ich mich noch nie auseinander gesetzt habe, zB. das Clipping Modul. Aber der Aufbau erscheint mir ganz logisch. Nur, was macht nochmal dieses Merge genau? In dem Fall, wenn an den unteren beiden Eingängen keine Events kommen, lässt es einfach alles vom oberen Eingang durch, aber wenn ein Event von einem der unteren Eingänge kommt, hat das Vorrang, oder? Für mich soweit klar. Trotzdem versuchte ich mal etwas mit dem Merge zu lösen, und habe es nicht geschafft. Ich wollte so einen Restart Button (sogar für dieses Modul, von dem ich am Anfang des Threads gesprochen habe, aber nicht so wichtig), und wollte dass der an einer bestimmten Stelle den Wert 0 "injiziert". Ich schloss den Restart Eingang an ein Latch Modul, (unterer Eingang, den oberen ließ ich unbeschalten, da er 0 sein soll), und dieses Latch Modul an einen den unteren Eingang eines Merge Moduls. Die Verbindung, in die ich 0 "injizieren" wollte, schloss ich an den oberen Eingang des Merge Moduls (und den Ausgang natürlich dort, wo er hin sollte). Funktionierte leider nicht. Obwohl der Restart Eingang (nachgewiesen) NUR bei betätigen des Buttons / eines MIDI Gates ein Event ausgab. Habe ich da die Funktion des Merge Moduls falsch verstanden? Oder liegt der Fehler woanders?

Danke!
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Etwas schwierig zu erklären...

Beitrag von herw »

fweth hat geschrieben:Gut, danke!

Es gibt einfach so viele grundlegende Sachen, mit denen ich mich noch nie auseinander gesetzt habe, zB. das Clipping Modul. Aber der Aufbau erscheint mir ganz logisch. Nur, was macht nochmal dieses Merge genau? In dem Fall, wenn an den unteren beiden Eingängen keine Events kommen, lässt es einfach alles vom oberen Eingang durch, aber wenn ein Event von einem der unteren Eingänge kommt, hat das Vorrang, oder? Für mich soweit klar. Trotzdem versuchte ich mal etwas mit dem Merge zu lösen, und habe es nicht geschafft. Ich wollte so einen Restart Button (sogar für dieses Modul, von dem ich am Anfang des Threads gesprochen habe, aber nicht so wichtig), und wollte dass der an einer bestimmten Stelle den Wert 0 "injiziert". Ich schloss den Restart Eingang an ein Latch Modul, (unterer Eingang, den oberen ließ ich unbeschalten, da er 0 sein soll), und dieses Latch Modul an einen den unteren Eingang eines Merge Moduls. Die Verbindung, in die ich 0 "injizieren" wollte, schloss ich an den oberen Eingang des Merge Moduls (und den Ausgang natürlich dort, wo er hin sollte). Funktionierte leider nicht. Obwohl der Restart Eingang (nachgewiesen) NUR bei betätigen des Buttons / eines MIDI Gates ein Event ausgab. Habe ich da die Funktion des Merge Moduls falsch verstanden? Oder liegt der Fehler woanders?

Danke!
ein Bildchen oder ein upload deiner Modulbeschreibung wäre hier sinnvoll. Ich kann mir schon einiges vorstellen, aber nach einer Kant'schen Beschreibung ;-) ein Modul, das eventuell nicht funktoniert, nachzubauen, ist ziemlich zeitaufwändig. Also bitte ein Bild oder lade das Makro hier hoch.

ciao herw

BTW das merge-Modul leitet alle ankommenden Events weiter. Bei gleichzeitigem Eintreffen habe die unteren Eingänge den Vorrang. Da bei diesem Modul durch die Router niemals zwei Events gleichzeitig an das merge Modul gelangen können, ist die Reihenfolge hier unwesentlich. (Core Anleitung S.172)
fweth
meister
Beiträge: 118
Registriert: 21. November 2007, 16:01
Wohnort: Österreich

Re: Etwas schwierig zu erklären...

Beitrag von fweth »

Hups, wie ich das ganze jetzt vereinfachen wollte, um es hier zu posten, bin ich schon auf den Fehler draufgekommen. Es hatte etwas mit Event und Audio zu tun. Ich verstehe zwar das ganze noch immer nicht genau, aber da es jetzt funktioniert, und ich kein konkretes Problem mehr habe, will ich nicht Deine Zeit noch unnötig beanspruchen und gebe mich einfach zufrieden. Aber was mich freut, ist, dass ich das Merge Modul von Anfang an richtig verstanden und verwendet habe.

Gruß
Antworten