Turing's Slow Progress: Auf dem Weg zum eigenen Softsynth

Hier ein Update, aus Zeitmangel bzgl. Programmierung habe ich in der letzten Zeit vor allem mit der Konzeption weitergemacht.
Insbesondere habe ich überlegt, wie das Thema Spektrum-Warp umgesetzt werden soll.
Das betrifft zum einen die Frage, welche Parameter benötigt werden und welche Bedienelemente für den Spektrum-Warp eingeführt werden sollen, um die Funktionalität gut steuerbar und gut automatisierbar zu machen.
Zum anderen war zu klären, wie und in welcher Reihenfolge diese Parameter das für die Synthese verwendete Spektrum "verformen" sollen.
Mit diesen Punkten bin ich gut vorwärts gekommen und habe somit einen Stand, mit dem die Implementierung jetzt grundsätzlich möglich wäre.
Bei der Beschäftigung mit dem Thema Spectral Warp ist mir allerdings klar geworden, dass die spektralen Transformationen oft auch sehr obertonreiche Klänge erzeugen werden (beispielsweise wird man mit ihnen Hard Sync-ähnliche Effekte erzielen können).
Um diesen Obertonreichtum zu bändigen, ist es jetzt doch sinnvoll geworden, die Stimmen mit einem subtraktiven Filter auszustatten (es wäre rechnerisch aufwendiger, diese Nachfilterung auch noch in die spektralen Transformationen oder den additiven Syntheseschritt einzubauen).
Deshalb habe ich mich zuletzt nicht mit der Umsetzung des Spektrum-Warp beschäftigt, sondern erst einmal das Thema "Filter" bearbeitet.
Dieses interessiert für mein Projekt aber eigentlich nur am Rande, so dass ich mir einfach mal angesehen habe, was JUCE an Filtern bereits so mitbringt.
Zum einen ist das ein durch das Moog Ladder Filter inspiriertes Multi-Mode-Filter. Das JUCE Ladder-Filter unterstützt Tiefpass-, Bandpass- und Hochpass-Charakteristik mit Flankensteilheiten von 12 dB oder 24 dB pro Oktave. Es hat neben der Cutoff-Frequenz eine im Bereich 0..1 einstellbare Resonanz und zusätzlich einen Drive-Parameter (mit zulässigen Werten >= 1).
Das Ladder-Filter glättet die Cutoff- und Resonance-Werte automatisch mit einer Ramp-Zeit von 50 ms. Daher ist es problemlos modulierbar, allerdings recht behäbig und schon gar nicht für eine Audio-Rate Filter-FM geeignet.
Auch ist das Filter offenbar zu Selbstresonanz nicht in der Lage, wie man mit dem Maximalwert Resonance=1 leicht testen kann.
Als Alternative bietet JUCE auch ein State-Variable Filter an. Dieses unterstützt ebenfalls Tiefpass-, Bandpass- und Hochpass-Charakteristik, allerdings SVF-üblich nur mit 12 dB/Oktave.
Die Resonance muss hier ein beliebiger Wert > 0 sein, einen Drive-Parameter gibt es nicht. Und anders als beim Ladder-Filter werden die Werte nicht intern geglättet.
Mein Ziel ist es nun eigentlich, beide Filter-Arten auswählbar zu machen und sie User-seitig gleich aussehen zu lassen. D.h. das SVF soll auch noch mit einer Drive-Option ausgestattet werden und bzgl. Parameterglättung ähnlich reagieren wie das Ladder-Filter. Außerdem muss die Resonanz-Einstellung denselben Wertebereich erhalten, so dass beide Filter-Arten einheitlich benutzbar werden.
Begonnen habe ich aber erst einmal nur mit dem Einbau des Ladder-Filters, das bei jeder Stimme nun in der Default-Einstellung (Low Pass 12) vor dem Envelope Gate sitzt.
Ergänzt habe ich noch einen Key Follow-Parameter, so dass die Cutoff-Frequenz zu einem einstellbaren Grad der Tonhöhe der gespielten Note folgen kann.
Spektrum Warp fehlt ja noch, aber auch für sich genommen ist die Hinzunahme des Filters schon eine klangliche Erweiterung und ermöglicht jetzt neue Klangfarben.
Andererseits hat sich gezeigt, dass das JUCE Ladder Filter den Klang immer sehr deutlich verfärbt, weil auch schon bei der geringstmöglichen Drive-Einstellung von 1 eine signifikante Verzerrung erfolgt.
Ein Blick in den Code offenbart die Verwendung zweier Nichtlinearitäten im Signalweg (für die die typische Wahl "tanh" genommen wurde), deren Effekt sich leider nicht eliminieren lässt.
Somit muss das Filter entweder abschaltbar sein (wenn die Verzerrungen stören), oder aber der Code muss geändert werden.
Ich denke darüber nach, die Drive-Umsetzung im Ladder-Filter für meine Zwecke so zu verändern, dass bei geringstem Drive dann tatsächlich alles 100% clean ist.
Außerdem würde ich bei der Gelegenheit wohl auch die Zeit-Konstanten für die Glättung noch einmal ansehen, weil mir 50 ms für eine Wertänderung etwas überdimensioniert erscheinen.
Es hat sich außerdem gezeigt, dass die Positionierung vor dem Envelope-Gate nicht immer ideal ist und dass das Filter manchmal besser noch weiter nach vorne in die eigentliche Synthese verschoben würde.
Von daher werde ich jetzt vermutlich noch eine Zeit lang mit den JUCE-Filtern und ihrer Positionierung im Signalweg experimentieren und ggf. auch Clones erstellen und diese nach den eigenen Bedürfnissen anpassen.
 
Zuletzt bearbeitet:
Seit dem letzten Post habe ich mir einige alternative Sättigungsfunktionen überlegt und ihre Graphen mit dem von tanh verglichen, um so Varianten mit einer interessanten Abweichung zur Standard-Wahl tanh zu finden.
Dann habe ich wie schon angekündigt einen Clone der LadderFilter-Klasse angelegt, so dass ich nun Experimente mit alternativen Sättigungsfunktionen durchführen kann.
Im folgenden Beispiel habe ich den Patch und den MIDI-Input aus der letzten Demo genommen und nur tanh durch eine andere Sättigungsfunktion getauscht. Nach etwas Anpassung von Drive und Output Level kann es nun auch so klingen:
Anhang anzeigen Demo-mit-Filter-Alt-Nonlin.mp3

Ich habe mir außerdem die Gainstruktur angesehen, die Gain-Anpassung je nach Drive muss wohl für jede Sättigungsfunktion gesondert optimiert werden, das fehlt hier aber noch.
Meine Alternativvariante klingt zwar bei Einzelnoten sehr schön "cremig", aber komprimiert sehr stark, was auf Kosten der Transparenz gehen kann.
Das nächste Experiment wird nun darin bestehen, für die minimale Drive-Einstellung mit einem 100% cleanen Output zu starten und mit zunehmendem Drive dann in die Sättigung zu überblenden. Durch den Dry Blend sollte ich die Transparenz wieder steigern können. Hier ist die Frage, wie schnell und mit welcher Charakteristik die Überblendung am besten durchgeführt wird.
Außerdem habe ich noch ein paar weitere Kandidaten für die Sättigungsfunktion in der Pipeline.
 
Vor den Experimenten zum Dry-Überblenden usw. hier noch eine der weiteren Alternativen für die Sättigungsfunktion.
Diese Variante hat einen linearen Kernbereich und klingt dadurch wesentlich klarer als das letzte Beispiel.
Anhang anzeigen Demo-mit-Filter-Alt2-Semi-Nonlin.mp3

Die Sättigungsfunktion wird in dem Ladder-Filter zweimal angewendet, einmal auf den Input, das zweite Mal im Rückkopplungszweig.
Die Drive-Stärke im Rückkopplungszweig ist ein Punkt, an dem evtl. noch nachjustiert werden muss (Stichpunkt "Gainstruktur" oben), hier habe ich bisher nichts verändert, das könnte aber das klangliche Ergebnis noch einmal deutlich beeinflussen.
 
Zuletzt bearbeitet:
vielleicht einfach noch feiner einstellen (lassen können dürfen)

vergiss nicht, wie schnell sich die verzerrung aufschaukelt in so einem ladderfilter (feedbackloop von 2-4 samples länge...?)

tanh/arctan (oder mit einschränkungen auch sigmoid) für die "sättigung" lässt sich "feiner" bekommen, indem du die funktion einfach "hochschiebst", so dass sie statt von 0.-1. auf 0.5 - 2. (-6db bis +6b) wirkt.

einen großen unterschied zwischen den letzten beiden höre ich nicht, ich mag sie aber.
 
@einseinsnull
Danke. Ich denke auch, in der Rückkopplungsschleife ist im Moment zu viel Zerre drin, was sich dann hochschaukelt, da muss man wohl sehr aufpassen.
(Die erste Verzerrungsstufe auf dem Input sollte eigentlich schwächer sein als bei tanh, daher verorte ich das Problem in der 2. Verzerrungsstufe im Rückkopplungsweg).
Mit etwas Experimentieren und Anpassen sollte sich das in den Griff bekommen lassen.
Das von Dir beschriebene "Hochschieben" ist im Prinzip das, was ich oben mit "linearer Kernbereich" gemeint habe.
In der letzten Variante mache ich so etwas schon, dadurch ist das Beispiel auch etwas transparenter als das davor.
 
Zuletzt bearbeitet:
Wie angekündigt habe ich auch noch mit einer anderen Positionierung des Filters (weiter vorne im Signalweg) experimentiert.
Hier das letzte Beispiel von oben ("linearer Kernbereich") noch einmal mit der früheren Filterung:
Anhang anzeigen Demo-mit-Filter-Alt2-Semi-Nonlin-Early.mp3

Das klangliche Ergebnis ist bei diesem Patch nur geringfügig anders (mir gefällt die ursprüngliche Variante etwas besser).
Bei anderen Einstellungen der Parameter ergeben sich aber deutliche Unterschiede und andere Einsatzmöglichkeiten.
Deshalb behalte ich einfach beide Varianten und mache sie umschaltbar.
 
Zuletzt bearbeitet:
wenn man das "limiting" nicht braucht, weil man garantieren kann, dass der input vom generator immer normalisiert ist (oder knapp leiser), dann könnte man u.u. auch den output aus der "saturation" funktion gegen das unverzerrte signal dry/wet mäßig mischen.

man kann mit so etwas zwar auch in fallen laufen, aber ich sehe hier gerade keine gegenanzeigen dafür.

solltest du damit erfolg haben, machst du natürlich direkt einen user parameter daraus. ;-)
 
@einseinsnull
Das meinte ich oben mit "Dry Überblenden". Sollte in dem Fall wohl besser "Clean Blend" heißen. Ich wollte das eigentlich vom Drive-Parameter mit steuern lassen.
Aber Du hast recht, man könnte auch einfach gesonderte Regler für Drive und Dry Blend machen.
Voraussetzung ist, dass das Filter ohne die Begrenzung des Signals durch die Sättigung nicht "explodiert". Dieser Test und auch das ganze Justieren der Gainstruktur (d.h. wie stark muss man das Signal nach Anwendung von Drive und Sättigungsfunktion wieder abschwächen) sind im Moment noch offen.
 
Eine weitere Demo mit früher Filterung, hier etwas mehr Drive und eine niedrige Cutoff-Frequenz, daher ist der Klang wesentlich sanfter.
Wieder eine auf dem Joué improvisierte Spur (Plugin mit Reverb 7th Heaven Pro):

Anhang anzeigen Demo-Soft-Early-Filtering.mp3
 
Zuletzt bearbeitet:
In den letzten Tagen habe ich mir über die Gain-Struktur für das Filter weiter Gedanken gemacht.

Es geht darum, beim Hochdrehen des Drive-Reglers einen sinnvollen Laustärkenverlauf zu erhalten (d.h. eine gleichbleibende oder kontinuierlich leicht ansteigende Lautstärke).
Unerwünscht ist ein Absacken der Lautstärke (das ist leider beim JUCE Ladder Filter zu beobachten!) oder ein zu starker Boost.
Die Gain-Korrektur sollte für jede beliebige Sättigungsfunktion sinnvoll erfolgen, d.h. sie sollte sich automatisch an die jeweilige Sättigungsfunktion anpassen.
Die im JUCE Ladder Filter implementierte Formel ist wie gesagt nicht brauchbar.
Deshalb ist meine Idee jetzt, für ausgewählte Referenz-Eingangspegel den Ausgangspegel hinter der Sättigungsstufe zu ermitteln. Nach der Korrektur sollten diese wieder den ursprünglichen Referenzpegel haben. Daraus entsteht für jeden Referenzpegel ein Korrektur-Faktor. Weil es aber am Ende nur einen einzigen Korrektur-Faktor geben kann, berechne ich aus den Referenzwerten einen gemittelten Kompromiss-Faktor, der dann zur Gain-Anpassung hinter der Sättigungsstufe genutzt wird.

Darüber hinaus habe ich mir über das Parameter Set für die Filter-Sektion Gedanken gemacht und die möglichen Bedienelemente auch mit denen abgeglichen, die ich für die Spektrum-Warp-Sektion vorgesehen hatte. Das ist deshalb sinnvoll, weil die spektralen Transformationen einen ähnlichen Effekt wie die Anwendung eines klassischen Filters haben können. Dabei konnte ich von jeder der beiden Sektionen Ideen und Parameter für die jeweils andere übernehmen. Insgesamt bin ich jetzt bei ca. 15 geplanten Parametern und GUI-Elementen für die Filter-Sektion und bei ca. 20 Parametern/GUI-Elementen für die Warp-Sektion angekommen.

Das Plugin hatte bisher nur ein Hauptfenster, auf dem sich alle GUI-Elemente befanden. Dafür wird mit ca. 35 zusätzlichen Reglern, Combo-Boxen und Schaltern für Filterung und Spektrum-Warp aber kein Platz mehr sein.

Deshalb habe ich GUI-seitig heute eine Umstellung auf einen Reiter-Struktur vorgenommen. So kann es neben dem Haupt-Reiter in Zukunft gesonderte Reiter für Unisono-Steuerung, Spektrum-Warp, Filter und andere Spezialthemen geben.
 
Zuletzt bearbeitet:
Der neue Filter-Reiter ist jetzt mit GUI-Elementen bevölkert und enthält neben Reglern für Cutoff, Resonance, Drive und Key Follow nun auch Elemente zur Auswahl von Filter Type, Filter Mode und Filter Placement.
Als Type stehen vorerst das Ladder-Filter mit 12 dB/oct. oder 24 dB/oct. und die Option "Kein Filter" bereit. Später soll hier noch ein Typ für das State-Variable-Filter dazukommen.
Unter Mode verbergen sich die Charakteristiken Lowpass, Highpass und Bandpass. Für später plane ich noch einen Notch Filter- bzw. Bandsperren-Modus.
Das Placement steuert die Anwendung des Filters entweder innerhalb der Synthese-Einheit ("Early") oder nach der Synthese direkt vor dem Envelope Gate ("Late").
Ein Teil der geplanten Bedienelemente für die Filter-Einheit ist damit schon umgesetzt.

Darüber hinaus habe ich mir Gedanken über eine Verbesserung der Klangqualität gemacht.

Intern nutzt der Softsynth zwar Oversampling und arbeitet mit einer Sample Rate von mindestens 88,2 kHz. Daher hat er etwas Headroom bezüglich Aliasing-Artefakten bei der Verzerrung im Ladder-Filter. Dennoch könnte man an dieser Stelle noch optimieren. Ergänzend möchte ich einmal mit dem Spectrum Analyzer ermitteln, wie stark das Phänomen überhaupt auftritt und wie viel Mühe somit in die Lösung gesteckt werden muss.

Symmetrische Sättigungsfunktionen (im Sinne von Punktsymmetrie bzgl. (0, 0)) wie tanh sind klanglich etwas einseitig, weil sie nur ungeradzahlige Harmonische erzeugen. Analoge Verzerrungen verhalten sich nicht so künstlich.
Als Alternative zur tanh-Sättigungsfunktion möchte ich daher auch eine nicht punktsymmetrische Sättigungsfunktion ähnlich einer FET-Kennlinie anbieten - diese sollte eine deutlich anders klingende Verzerrung erzeugen und besonders die 2. Harmonische betonen. Durch deren quadratische Anteile wird dann aber ein DC-Offset auftreten. Es stellt sich die Frage, wie man auch den DC-Offset möglichst unauffällig eliminieren könnte.

Für die genannten Probleme habe ich eine Lösungskonzeption erstellt, die jetzt aber noch umgesetzt und erprobt werden muss.
 
Zuletzt bearbeitet:
Der Filter-Reiter sieht inzwischen so aus:

2024-03-03-Filter-Tab.png

(Die Optik entspricht dem Standard-Look&Feel von JUCE).
Im letzten Beitrag wurden einige der Kontroll-Elemente bereits erläutert: Filter type, Filter mode, Filter placement, Cutoff, Resonance, Drive und Key Follow.
Neu ist die "Saturation"-Combobox, hier stehen aktuell 6 verschiedene Sättigungsfunktionen zur Auswahl.
Neben vier zum Ursprung (0,0) punktsymmetrischen Funktionen, die ausschließlich ungeradzahlige Harmonische erzeugen, gibt es auch zwei Funktionen, die die Kennlinie einen einstufigen oder zweistufigen FET-Preamps nachempfinden. Hier werden vor allem die 2. Harmonische bzw. die 2. und 4. Harmonische erzeugt und der Ton wird dadurch sanft angedickt.
Ein weiteres neues Element ist der "Grit"-Slider. Dieser regelt die Clean/Saturated Balance. Für Werte < 1 wird anteilsmäßig das unverzerrte Signal der Eingangsstufe bzw. der Feedback-Loop um die Saturation-Einheit herumgeführt und mit dem angezerrten Signal gemischt. So hat man über den Drive-Regler hinaus eine weitere Möglichkeit, den Verzerrungsanteil im Filter zu dosieren.
Was man nicht sieht: Intern habe ich die Gain-Struktur des Ladder-Filters umgebaut. Während der JUCE Ladder-Filter beim Aufdrehen von Drive in der Lautstärke deutlich "absackt", was ich für nicht akzeptabel halte, gibt es nun für jede Wahl der Sättigungsfunktion einen vernünftigen Lautstärkenverlauf beim Betätigen des Drive-Reglers (d.h. die Lautstärke bleibt beim Aufdrehen von Drive konstant oder steigt leicht an).

Das Thema "Filter" ist für mich nun erst einmal ausreichend behandelt. Ich habe zwar noch nicht alle geplanten Parameter und nicht alle geplanten Features umgesetzt, aber es ist ein Stand erreicht, der hinreichend flexibel ist und mit dem man gut arbeiten kann.

Somit kommt nun endlich das Thema "Spectrum Warp" an die Reihe.

Aber hier zunächst noch eine kleine Demo mit wattig-weichem Filter und FET-Saturation:
Anhang anzeigen 2024-03-04-Demo-Sat-FET.mp3

Man hört nur den Softsynth und Hall. Der schwebende Klang entsteht nicht durch einen nachgeschalteten Phaser oder Rotary Effect, sondern kann von der Synthese-Einheit mitgeneriert werden. Dadurch hat jede der gleichzeitig erklingenden Noten einen eigenen Phasing-Verlauf und es ergibt sich insgesamt eine komplexe, fließende Überlagerung.

Ein etwas helleres FET-Rendering derselben MIDI-Daten:
Anhang anzeigen 2024-03-04-Demo-Sat-FET-Grit.14.mp3

Dies ähnelt klanglich mehr den bisherigen Beispielen, die ihr schon gehört habt.
 
Zuletzt bearbeitet:
Inzwischen kennt ihr die bisherigen Features des Plugins zur Genüge und habt einen Eindruck, welche Klänge sich dem Plugin (mit einem MPE-Controller wie dem Joué) entlocken lassen.
Zeit für etwas Neues.
Das nächste Thema ist jetzt Spectrum Warp, also spektrale Transformationen.
Es geht darum, Parameter einzuführen und umzusetzen, mit denen sich das Spektrum der klingenden Noten in Echtzeit verformen lässt.
Bei dieser Verformung kann es sich um eine spektrale Verschiebung, Streckung, Zusammenballung, Ausdünnung oder ähnliches handeln, aber auch um Änderungen der Lautstärke der Partialtöne.
Beispiele findet man, wie im Eingangspost erwähnt, etwa bei Vital. Neben dem Einsatz in Softsynths gibt es auch Effekt-Plugins wie Unfiltered Audio SpecOps, die sich ausschließlich dem Thema spektrale Operationen widmen und die Bandbreite des Möglichen aufzeigen. (Im Extremfall kann das auch so etwas wie ein Multiband-Kompressor mit 1024 Bändern sein.)
Während in SpecOps die spektralen Operationen aber nur auf ein bzw. zwei Kanäle angewendet werden (bei einem Stereo-Input), soll in dem Synth-Plugin die spektrale Operation jeweils einzeln für jede Stimme angewendet werden, hier also auf bis zu 12 Stimmen.
Dabei entsteht ein immenser Rechenaufwand und folglich eine Einschränkung auf Operationen, die überhaupt in Echtzeit durchführbar sind.
Das Plugin betreibt ja eine spektrale Synthese. Dabei wird der volle Hörbereich abgedeckt, d.h. für tiefe zu synthetisierende Töne werden in Echtzeit 1024 Teiltöne pro Stimme erzeugt. (Bei höheren Noten entspannt sich die Lage etwas, weil dann ja nur die Teiltöne bis zur Nyquist-Frequenz oder zumindest bis zur Hörgrenze erzeugt werden müssen, je höher eine Note, desto weniger relevante Partials bleiben übrig.)
Die Synthese stützt sich auf die Frames der gewählten Wavetable. Jedes Frame der Wavetable wird per FFT vorab analysiert und in den Vektor der Fourierkoeffizienten zerlegt, die den zu synthetisierenden 1024 Partialtönen entsprechen.
Bei jedem zu erzeugenden Sample für eine Stimme wird anhand der aktuellen Position in der Wavetable ein linearer A/B-Blend der Fourier-Koeffizienten/Spektren der beiden zur Position benachbarten Frames berechnet. Diese Kombination der Koeffizienten muss (bei tiefen Noten) für jedes der 1024 Partials berechnet werden, was mindestens 3 arithmetische Operationen pro Partial benötigt (dazu noch den Lookup der Koeffizienten aus dem FFT-Ergebnis der beiden Nachbar-Frames).
Kommt nun eine spektrale Transformation dazu, so entsteht für jeden zu synthetisierenden Partialton noch zusätzlich der Rechenaufwand für die Ausführung der spektralen Operation, im schlimmsten Fall muss diese dann für jedes Sample pro Stimme 1024 mal ausgewertet werden.
Hierdurch kann auch die Rechenkapazität einer modernen leistungsfähigen CPU schnell an ihre Grenzen kommen.
Deshalb muss ich mich auf Operationen beschränken, bei denen der Einzelschritt zur Anpassung jedes der Spektralkoeffizienten einen relativ geringen Aufwand hat.
Ich habe aber die Hoffnung, trotzdem ein paar interessante Effekte herausholen zu können.
Das Ziel ist zunächst, hochwertige Hard Sync-ähnliche Klänge über spektrale Transformationen zu erzeugen. Sobald das funktioniert, möchte ich auch Filter-ähnliche Zusammenballungen/Ausdünnungen im Spektrum realisieren, die vermutlich etwas mehr Rechenoperationen brauchen. Weitere Themen sind auch schon angedacht.
Der oben erwähnte spektrale 1024-Band-Kompressor wird aber aus Rechenzeit-Gründen bei einem polyphonen Plugin nicht realisierbar sein (und wäre auf einer Einzelstimme vielleicht eh nicht sinnvoll bzw. eher als Vorverarbeitung auf der Wavetable anzusehen). Auch lassen sich herkömmliche subtraktive Filter mit weit geringerem Rechenaufwand in der üblichen Technologie als IIR-Filter realisieren, d.h. ich werde das bereits eingebundenen Ladder-Filter jetzt nicht durch spektrale Transformationen ersetzen, dafür klingt es zum einen zu charaktervoll, und zum anderen ist es bezüglich Rechenaufwand eben sehr leichtgewichtig.
Generell geht es erst einmal nur um harmonische spektrale Transformationen, deren Ergebnis wieder durch einen Vektor von Fourier-Koeffizienten darstellbar ist, aus dem das klingende Ergebnis dann synthetisiert wird. Inharmonische Transformationen (wie Frequency Shift) sind erst einmal ausgeklammert, weil sie technisch völlig anders umgesetzt werden müssen.
So, an die Arbeit.
 
Zuletzt bearbeitet:
Eigene low-budget Softsynths haben es meiner Beobachtung nach, immer etwas schwer. Hast du mal überlegt, dass als VCV Rack Modul anzubieten?
Ich finde diese Idee inzwischen sehr gut. Aus meinem Projekt könnte ich einen der Oszillatoren und den Texturgenerator jeweils als eigene Module auslagern.
Dadurch würde der Druck entfallen, auch das ganze Drumherum mit zu entwickeln.
Zum Einstieg mache ich mich mit Modularsystemen und mit VCV Rack etwas vertraut.
Entwickeln von Modulen für VCV Rack scheint straightforward zu sein.
Benötigte GUI-Elemente (Slider, Buttons usw.) und Hilfsfunktionalität wie z.B. für FFT, Parameter-Abfrage, Speicherung des Modul-Zustands usw., die ich bisher von JUCE nutze, sind grundsätzlich auch in der VCV Rack API vorhanden.
Ich müsste nur den grundlegenden Build-Prozess in CLion zum Laufen bringen (und für VCV Rack zurück auf C++11 gehen) und könnte dann entsprechend umstellen.
 
Zuletzt bearbeitet:
@Turing Solltest du irgendwann mal ein GUI Designer benötigen, da gibt es jemanden der als Pyer bekannt ist. Zu seinen Preisen kann ich nichts sagen, die Ergebnisse sind aber auf jeden Fall super.

 
Wow, die Beispiele sehen toll aus! Danke für den Tipp.
 
Zeit für etwas Neues.
Das nächste Thema ist jetzt Spectrum Warp, also spektrale Transformationen.
Es geht darum, Parameter einzuführen und umzusetzen, mit denen sich das Spektrum der klingenden Noten in Echtzeit verformen lässt.
Wie angekündigt habe ich am Thema Spectrum Warp gearbeitet. So gibt es jetzt als experimentelles Feature die Unterstützung spektraler Transformationen, wobei zunächst nur harmonische affine Transformationen berücksichtigt werden.
Hierbei wird der Fourier-Koeffizient für den Partialton mit Index p aus der FFT des aktuellen Wavetable-Frames anhand von zwei Parametern a (Spektrum-Stretch-Faktor) und b (Spektrum-Shift) auf den tatsächlichen Partialton mit Index a * p + b abgebildet. Dazu braucht man dann noch einen Mechanismus, um das Mapping zu einer harmonischen Transformation zu machen, denn a * p + b muss nicht ganzzahlig sein. Es muss daher ein Schema geben, um den gemappten Wert in die Koeffizienten für die unteren und oberen ganzzahligen Nachbarn von a * p + b eingehen zu lassen.
Hat man nur den Stretch-Faktor a, so erzeugt dieses Verfahren ein Art Soft-Sync, hat man nur die Verschiebung b, so erhält man einen harmonischen Spektrum-Shift. Generell ist aber die Kombination von beidem gleichzeitig möglich und liefert auch interessante Ergebnisse.
Ich habe das Verfahren inzwischen für eine denkbare Konfiguration implementiert und das Ergebnis ermutigt definitiv zum Weitermachen.
So einfach die Zuordnungsvorschrift aussieht, gibt es doch diverse Wahlmöglichkeiten, die ich ausprobieren und (sofern lohnend) auch alle über die GUI zugänglich machen möchte.
Kombinatorisch ergeben sich aktuell 26 Möglichkeiten, wie der Soft-Sync-Aspekt umgesetzt werden könnte. Diese unterscheiden sich im zu erwartenden klanglichen Effekt und im Rechenaufwand.
Dazu kommen einige Varianten für den Spectrum Shift (diverse Wahlmöglichkeiten für die Umsetzung von harmonischem Spektrum-Shift, plus der bekannte inharmonische Frequency-Shift).
Meine ursprüngliche Konzeption für die Warp-Bedienelemente kann diese Kombinationen nicht alle sinnvoll darstellen (bzw. würde auch unerwünschte Kombinationen einstellbar machen).
Daher muss ich die Konzeption für die GUI-Elemente und Parameter bzgl. Spektrum-Warp noch einmal überarbeiten. Parallel dazu werde ich nach und nach alle genannten 26 Varianten für Spectrum Stretch/Soft Sync implementieren (bzw. die Grundelemente, aus deren Kombination die 26 Varianten entstehen) und die klanglichen Ergebnisse und den benötigten Rechenaufwand vergleichen.
Neue Sound-Demos werden ich natürlich auch hier einstellen, aber erst wenn ein paar Varianten mehr verfügbar sind.
 
Zuletzt bearbeitet:


Zurück
Oben