Polyphoner Physical Modeling Synth in Pure Data

Tonerzeuger

Noerd Elektro
Hi Folks,

ich experimentiere schon länger mit Physical Modeling in Pure Data. Ziel ist es,
einen polyphonen Karplus-Strong Synthesizer zu entwickeln, der idealerweise
nicht ALLZU viele Parameter hat und einigermaßen gut bedienbar ist.
Und es soll ein SYNTH werden, die exakte Simulation von Naturinstrumenten
steht also nicht im Vordergrund...

Inzwischen ist etwas entstanden, was einem spielbaren Instrument schon recht
nahe kommt. Sechs Stimmen mit jeweils einem Treiber und einem Resonator
sowie ein weiterer Korpus-Resonator für alle Stimmen zusammen.

Amplitudensteuerung mit Hüllkurve - ein harter Brocken bei einem rückgekoppelten System.
Velocity, Modulationsrad, Aftertouch und LFO werden auf einigermaßen sinnvolle Weise eingebunden,
Pitchbend funktioniert, Sustainpedalsteuerung ist noch nicht perfekt.

Das Ganze braucht auf meinem AMD-Quadcore ca. 25 % CPU-Power, wobei Pure Data
(leider!) nur einen Prozessorkern nutzt.

Hört mal rein. So was Ähnliches wie ne Gitarre ist übrigens recht einfach!

src: https://soundcloud.com/user-693154346/pseudo-guitar2
src: https://soundcloud.com/user-693154346/synmallet-1
src: https://soundcloud.com/user-693154346/spacepad
src: https://soundcloud.com/user-693154346/bowedstring3

Das ganze ist doch noch sehr im Versuchsstadium. Ich kann deshalb nix versprechen,
zumal das Tüfteln echt zeitintensiv ist.

Jedenfalls fängt es jetzt, nach fast zwei Jahren, endlich an Spaß zu machen. Ja ja, und die ersten "Demos"
sind vor sehr verschiedener Qualität, ich weiß!
 
Tonerzeuger schrieb:
Das ganze ist doch noch sehr im Versuchsstadium. Ich kann deshalb nix versprechen,
zumal das Tüfteln echt zeitintensiv ist.

Jedenfalls fängt es jetzt, nach fast zwei Jahren, endlich an Spaß zu machen. Ja ja, und die ersten "Demos"
sind vor sehr verschiedener Qualität, ich weiß!

Die Gitarre ist schon mal Klasse getroffen - eindeutig Synth, aber auch eindeutig Saite.

Lass Dich nicht entmutigen - sowas braucht Zeit. Besonders wenn man etwas versucht, dass man nicht in jedem zweiten Tutorial nachlesen kann und zudem gewisse Ansprüche an das Ergebnis hat. Ich tüftel mit Pausen auch schon seit anderthalb Jahren an meiner Synthengine (allerdings in C/C++) rum und es ist - dank vieler Detailprobleme - auch nicht immer die blanke Freude.
 
Die PseudoGuitar klingt echt gut!
Nur im Anschlag bzw. Transienten ist irgendwas tieffrequentes, was meine Ohren stört :? vor allem zwischen 0:14 und 0:20.
 
Ja, das tieffrequente stört mich auch. Da reagiert der "Box Resonator" offenbar auf Signale,die nicht für ihn bestimmt sind.

Von einer "echten" Programmiersprache hab ich leider keine Ahnung, aber ich hatte Mathe und Physik als Leistungskurse in der Schule. Das bringt schon was :)

Ich bin mir noch nicht sicher, ob ich ein zweites Treiber-Resonator-System pro Stimme hinzufügen soll. Von der Prozessorlast her würde das gehen, aber es macht halt die Bedienung komplexer.

Ich tüftel mit Pausen auch schon seit anderthalb Jahren an meiner Synthengine (allerdings in C/C++) rum und es ist - dank vieler Detailprobleme - auch nicht immer die blanke Freude.

Auf welchem Prinzip basiert denn Deine Entwicklung?

Ich kann Dich sooo gut verstehen. Du willst eine neue Funktion einbauen, und plötzlich läuft auch das nicht mehr, was vorher prima funktioniert hat... Manchmal ist es die Hölle!

Also: Erstmal vielen Dank für das ermutigende Feedback, Jungs!
 
Könnte es sein, dass der Resonator auf den "Klick" des Attacks reagiert? Ich weiß nicht, ob Du das schon versucht hast oder wie Deine Algorithmen grundsätzlich laufen, aber ein Fade-In (direkt im Treiber vor dem Resonator) statt eines abrupten Attacks wirkt vielleicht Wunder. Ich benutze für solche Glättungen ein simples Tiefpassfilter, der den Amplitudenverlauf glättet:

scaler = (scaler - 1) * coeff + 1

wobei

coeff = exp(-2000 * Pi / (Samplerate * Millisekunden)).

Dann skalierst Du damit vor dem Resonator die Amplitude des Treibers:

signal = signal * scaler.

Bei jedem Attack (und nur dann) wird der scaler zurück auf 0 gesetzt. Mit einer Glättungszeit von um die 2 - 3 Millisekunden bleibt der Sound perkussiv und verliert lediglich seine Nebengeräusche.

Vielleicht hast Du das ja schon versucht, aber falls noch icht, wäre das mein Tipp. Leider kenne ich PD nicht und kann daher auch nicht beurteilen, ob meine vorschlag überhaupt so umsetzbar ist.

Tonerzeuger schrieb:
Auf welchem Prinzip basiert denn Deine Entwicklung?

Ich kann Dich sooo gut verstehen. Du willst eine neue Funktion einbauen, und plötzlich läuft auch das nicht mehr, was vorher prima funktioniert hat... Manchmal ist es die Hölle!

Ich versuche mich an einem "Bruder" des Synclavier II: FM ohne DX - typisches Aliasing über den gesamten hörbaren Frequenzbereich, wobei der Carrier aber bis zu 64 Partials hat und auch Wavesequencing mit Resynthese kann.

src: http://soundcloud.com/cyclotron2010/audio-term-ii-simple-test-track

Das ganze läuft parallel in vier unabhängigen Strängen. Jeder Strang kann durch eine Chorusvoice (+/- 3 Oktaven) gedoppelt werden und die gesamte Engine hat ebenfalls nochmal einen solchen Chorus, der den Gesamtoutput doppelt. Macht mit dem Wavesequencing bis zu 32 Osc pro Note. Nun sind diese "Chorusse" auch noch modulierbar in der Tonhöhe, trotzdem sollen keine Auslöschungen oder Sprünge im Level auftreten, wenn sich Original und Chorusvoices überlagern. Gerade das war ein großes Problem, dessen "CPU - freundliche" Lösung einen ganzen Monat bei Wasser und Brot erfordert hat. Vor einer Woche wollte ich das schon in die Ecke pfeffern ... ja, eben weil wenn das eine geht, geht das andere nicht mehr... :lol: ... aber jetzt läuft es aalglatt.

Bei mir läuft auch alles auf einem Kern der CPU. Ich habe zwischenzeitlich auch mal mit Multithreading der Klangerzeugung herumgespielt, aber das ganze erfordert ja auch Overhead für Verwaltung und Synchronisation der Threads. Schlimmstenfalls macht man nur aus einem Problem mehrere.

Da ich nur einen Dualcore - Prozessor habe, war es in meinem Fall deutlich günstiger, das ganze zunächst mit SSE umzusetzen. Zusätzlich arbeiten intern Counter und Ereignisflags, die nur alle x Samples "teure" Berechnungen zulassen, ansonsten werden einfach Zwischenergebnisse interpoliert. So habe ich die CPU Last ganz ohne Multithreading um den Faktor 5 - 6 reduzieren können, wenn ich das mal mit den ersten Varianten vergleiche. Leider erfordert genau sowas immer eine Menge Probiererei, um nicht am falschen Ende zu sparen. Vielleicht ist so ein Ansatz ja auch in PD möglich (falls Du nicht schon ähnliches nutzt)?
 
@Tonerzeuger: Also, die Gitarre finde ich erstklassig! Warum? Weil sie sogar echter und interessanter klingt als aus 'nem DX7. Enorm!
 
Da sind in der Tat einige vielversprechende Sachen dabei. Allen voran die Gitarre und der Audio Term II Test. Aber auch das Bowed String 3 Beispiel hat was. Der Anstrich am Anfang des Demos kommt gut, und die folgenden Resonanzen sind zumindest interessant.
 
Könnte es sein, dass der Resonator auf den "Klick" des Attacks reagiert?

Ja, genau das ist es. Die simulierte Saite (oder Zunge) besteht aus einer Verzögerungsleitung
mit Rückkopplung. Sie wird einem Impuls zum Schwingen angeregt. So einfach ist
das Grundprinzip von Karplus-Strong.

In meinem Fall geht nicht nur der Output der "Saite" zum Ausgang (und damit zum Korpus-
resonator), sondern auch ein Teil des anregenden Impulses ("Excitation"). Das ist in sofern
sinnvoll, als es z.B. beim Klavier hörbare Aufschlag-Geräusche der Hämmer gibt, oder bei
mit Plektrum gespielter Gitarre ein helles Zupfgeräusch.

Ich werde mal versuchen den Impuls-Anteil regelbar zu machen und ihn außerdem durch
einen Hochpass zu schicken.

@Tonerzeuger: Also, die Gitarre finde ich erstklassig! Warum? Weil sie sogar echter und interessanter klingt als aus 'nem DX7. Enorm!

Wow, danke für die Blumen :) Vor allem macht es auch echt Spaß beim Spielen - ich bin ja kein Sequenzierer...

Ich versuche mich an einem "Bruder" des Synclavier II: FM ohne DX - typisches Aliasing über den gesamten hörbaren Frequenzbereich, wobei der Carrier aber bis zu 64 Partials hat und auch Wavesequencing mit Resynthese kann.

Uff, das klingt für meine Begriffe ganz schön komplex. Es klingt aber saugut!

PD ist ja sehr anschaulich und man kann schnell etwas ausprobieren. Sehr gut für Leute, die sich ein wenig mit Physik, Elektronik und Akustik auskennen, aber eben nicht "klassisch" programmieren können.
 


Zurück
Oben