Granular Synthese Tutorium

Workshops für Reaktor-Anfänger

Moderator: herw

Antworten
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Granular Synthese Tutorium

Beitrag von toxonic »

nachdem es nun auch in diesem forum ab und an mal nachfragen zum thema granularsynhese gab, habe ich mich dazu entschlossen mal ein kleines tutorium zu verfassen.
ich muss von anfang an sagen, das ich mir die ganze materie, die ich im folgenden wiederkäue, selber angeeignet habe und daher evtl. manchen sachverhalt nicht völlig korrekt oder vollständig darstelle. für den ein oder anderen wird dieses tutorium aber bestimmt eine kleine hilfestellung darstellen um den einstig in eine der powervollsten features, die reaktor zu bieten hat, zu finden.
dieses tutorium ist kein reines anfängertutorium, der grunsätzliche umgang mit reaktor sollte sitzen und es ist von vorteil eine grobe ahnung zu haben, was granularsynthese ist - allein schon wegen der tatsache, das meine erklärungen teilweise recht holprig sind....... ;) bin eben nicht gerade ein vorzeige didakt, also übt nachsicht - das tutorium kostet ja nix! *lach*

zu anfang sollten wir erstmal erörtern was granularsynthese denn überhaupt ist:
üblicherweise sind beim sampling die parameter tonhöhe und abspielgeschwindigkeit aneinander gekoppelt - das kennt jeder z.b. vom plattenspieler: ihr spielt eine schallplatte ab und bremst vorsichtig den plattenteller mit den fingerspitzen. ihr werdet feststellen, das mit abnehmender abspielgeschwindigkeit auch die tonhöhe niederiger wird. grob kann man sagen reduziert man die abspielgeschwindigkeit auf die hälfte, halbiert sich auch die frequenz, also eine tonhöhenverminderung um 1 oktave.
nun wäre es hier und da schon wünschenswert, man könnte diese beiden parameter voneinander entkoppeln - stellt euch vor,ihr habt ein lied mit einer geschwindigkeit von 120 bpm und habt einen rhythmisch super passenden percussion loop, allerdings auf einer geschwindigkeit von 90 bpm. ein anpassen an die geschwindigkeit würde bedeuten, das die tonhöhe um ein drittel angehoben würde - da klingt der loop gleich künstlich und unschön und passt gar nicht mehr so fein, oder?
an dieser stelle kommt die granularsynthese ins spiel. mit ihr ist es möglich, tonhöhe und geschwindigkeit unabhängig voneinander zu bearbeiten. jetzt werdet ihr euch fragen "wie funktioniert sowas?"
ein kleines experiment: angenommen ihr spreht das wort "test" ganz langsam aus und versucht es so zu schreiben - würde das in etwa so aussehen: ttteeesssttt
durch das loopen von kleinen abschnitten (grains) in normalgeschwindigkeit, die sich mit verminderter geschwindigkeit auf der zeitlinie bewegen, verändert sich zwar die abspielgeschwindigkeit, nicht aber die tonhöhe. wenn man das grain nun mit doppelter geschwindigkeit abspielt und es mit normaler geschwindigkeit auf der zeitline verschiebt, scheint das sample doppelt so hoch zu erklingen, allerdings in normaler abspielgeschwindigkeit.
diesen sachverhalt zu erklären war mir immer ein graus, aber ihr werdet beim bau des ensembles sehen:
es ist völlig einleuchtend - ich bin nur zu blöde, das anständig zu erklären! ><:

versuchen wir mal so etwas in reaktor zu erzeugen:
zuerst erzeugen wir ein neues leeres ensemble und erstellen in dem leeren instrument einen audiotable, dessen audio ausgang wir mit den den beiden voice combiner modulen verbinden.
wir laden einen soundfile in den table, indem wir einen rechts-mouse-click auf den table in der panelansicht ausführen und im erscheinenden kontextmenü unter dem punkt "file" - "load data into table" auswählen und dann im open-dialog eine wav-datei auswählen, praktischerweise einen loop. ich habe einen drumloop ausgewählt. das ganze sollte in etwa so aussehen:
abb1.jpg
um den inhalt des tables auszulesen, erstellen wir einen ramp-osc (built-in module -> oscillator -> ramp). dieser oscillator wiederholt im prinzip in einer vorgegeben frequenz ("F" eingang) einen zählvorgang von 0 - A, wobei A dem am "A" eingang anliegenden wert entspricht. wenn wir also die länge des sampleloops wissen und ihn in den "A" eingang einspeisen und den ramp osc ausgang mit dem "RX" (leseposition) eingang des tables verbinden, dann "liest" der oscillator sample für sample den loop bis zum ende aus und fängt danach wieder von vorne an (schleife). die länge des loops wird am "DX" ausgang des tables ausgegeben, also verbinden wir diesen einfach mit dem "A" eingang des ramp osc's und schon haben wir was wir wollen. nun brauchen wir nur noch die entsprechende abspiel geschwindigkeit, also die wiederholungsfrequenz der ramp, damit der loop (vorerst) in normaler geschwindigkeit abgespielt wird. da am "DX" ausgang des tables die looplänge in ms anliegt, müssen wir nur noch 1000 durch diesen wert teilen und haben die nötige abspielfreqenz für den loop. dazu ein besipiel:

1000 / 2000 (looplänge in ms) = 0,5 hz

d.h. bei einer looplänge von 2 sekunden soll der ramp osc das sample 0,5 mal pro sekunde, also 1 mal pro 2 sekunden durchlaufen - das klingt einleuchtend, oder?

das gebilde sollte nun in etwa so ausshen:
abb2.jpg
so, nun kommt das "grain" ins spiel.... wir wollen nun einen variablen loop-bereich im sample in der abspielgeschwindigkeit durch den sample-loop bewegen. dazu brauchen wir im prinzip nochmal einen ramp osc, der den loop berechnet und addieren den dann zur leseposition. also erstellen wir einen 2ten ramp osc, und addieren den ausgang zum ausgangssignal des anderen ramp osc's und leiten die summe zum "RX" eingang des tables.
nun kommt ein etwas kompliziereter teil: wir wollen die grösse des grains bestimmen können, als auch die tonhöhe, welche der abspielgeschwindigkeit des grains entspricht. sagen wir, wir möchten die tonhöhe um +/- 12 halbtöne verändern können, am besten in einer feineren abstufung von sagen wir 10tel halbtönen. da eine tonhöhen-verminderung um eine oktave einer halbierung der normalen abspielgeschwindigkeit entspricht und eine erhöhung um eine oktave einer verdopplung der geschwindigkeit, erhalten wir folgende formel zu errechnung der grain-abspielfrequenz:

2^(T/120) - (Sp/100) / (G/1000)

wobei T der transposition in 10tel halbtönen entspricht, Sp der sampleabspielgeschwindigkeit in % und G der grainlänge in ms.
wie komme ich denn dazu? schauen wir uns die formel mal genauer an und füllen sie mit leben:
angenommen wir hätten eine grain-länge von 100 samples länge, eine normale abspielgeschwindigkeit und würden keine tonhöhenanpassung vornehmen, dann würde nun gelten:

2^(0/120)-1/(100/1000) ist gleich 2^0-1/0.1 ist gleich 1-1/0.1 ist gleich 0/0.1 ist gleich.... 0

also wird in diesem fall das grain überhaupt nicht abgespielt und nur die eigentlich leseposition des ersten ramp osc's wird abgegriffen.

ein 2. beispiel:
wir nehmen eine tonhöhenänderung von +1 halbton (also 10/10tel halbtönen) und eine geschwindigkeitsverminderung um die hälfte vor. nun gilt:

2^(10/120)-0.5/(100/1000) ist gleich 2^0.0833-0.5/0.1 ist gleich 0.5595/0.1
ergibt etwa 5.058 hz abspielgeschwindigkeit.

diese formel verinnerlicht man am besten, wenn man sie in verschiedenen szenarien durchrechnet, dann werden einem die zusammenhänge klar.

wenn man das ganze in einem macro unterbringt mit eingängen für T (10tel halbtöne), G (grainlänge in ms) und Sp (basisgeschwindigkeit des lesepositions ramp-osc's in 100stel %) dann sieht das in etwa so aus:
abb3.jpg
F gibt die frequenz des grain ramp-osc's, A die grainlänge als amplitude des grain ramp osc.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von toxonic am 29. Juni 2009, 23:37, insgesamt 1-mal geändert.
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

nun können wir den Sp eingang ja noch garnicht belegen, da wir ja in der hauptstruktur ja noch gar keine geschwindigkeitsänderung vorgesehen haben. wir esrtellen nun also noch einen "speed" knob mit einem wertebereich von 0.5 - 2 (von halber geschwindigkeit bis doppelter geschwindigkeit) und verdrahten das ganze wie in der nächsten abbildung.
abb4.jpg
der knob für die tonhöhenanpassung sollte von -120 bis 120 arbeiten um +/- 1 oktave darstellen zu können und die grainlänge sollte man bis 100 ms einstellen können.

normalerweise sollte der grain-effekt nun schon hörbar sein. allerdings bemerken wir - besonders bei niedrigen geschwindigkeiten und kleineren grain-größen um die 20 ms - das hässliche clicks und kratzer entstehen. der grund dafür liegt darin, daß immer dann, wenn das grain wieder von vorne beginnt, ein sprunghafter amplitudenwechsel stattfindet, weil das grain ja nicht nur bei nulldurchgängen zurückspringt. der zaubertrick mit dem man das in den griff bekommt, nennt sich "windowing" und ist im prinzip nichts anderes als eine hüllkurve für jedes grain.... aber dazu mehr im nächste abschnitt, fortsetzung folgt! ;)

im anhang findet ihr das gezippte ensemble als zwischenergebnis zum download!
zwischenergebnis 1.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

so, als nächstes basteln wir uns eine hüllkurve für unser grain. wie sich von selbst versteht, ist einer herkömmliche hüllkurve in kontrollraten taktung nicht tauglich dafür, daher müssen wir uns etwas anderes überlegen. wenn man sich dazu den positiven anteilen einer cosinus welle bedient, indem man die rampwelle auf einen schwingungsbereich von -0.25 - 0.25 konvertiert und dann dur ein Sine/Cosine modul (->math) am "Cosine" ausgang abgreift, hat man eine durchaus tauglich hüllkurve. schaut euch die abbbildung an: anfang und ende des grains werden somit sanft ein- und ausgeblendet.
abb5.jpg

wir erstellen also ein makro für das "cosinus" window ("hanning"). wir brauchen erstmal einen eingangsport für den ausgang des grain ramps osc's. da dieser aber eine amplitude in grösse des grains in ms hat, müssen wir diese erstmal wieder auf einen wertebereich zw. 0 und 1 bringen, also einfach du die graingrösse dividieren - also noch ein eingang her für die graingrösse. dann müssen wir das signal auf einen wertebereich zw. -0.25 und 0.25 konvertieren - dazu subtrahieren wir 0.5 und multiplizieren dann nochmal mit 0.5. anschliessen leiten wir das signal in das Sine/Cosine modul und greifen es am "Cosine" ausgang ab. das ganze sollte in etwa so ausshen:
abb6.jpg
zu guter letzt verdrahten wir die eingänge des macros in der hauptstruktur und multiplizieren den ausgang des tables mit dem ausgang des window makros, bevor wir das signal zu den ausgängen leiten. das sieht dann so aus:
abb7.jpg
wenn wir jetzt mal hören wie das ganze klingt, fällt uns besonders bei grossen grains auf, das das ganze zwar nun schön sanft klingt ohne clicks und geknackse, aber irgendwie doch auch sehr abgehakt, nicht wahr?
die lösung dazu kommt dann im nächsten abschnitt: stichwort "overlapping".... aber dazu später mehr! ;)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von toxonic am 30. Juni 2009, 11:55, insgesamt 1-mal geändert.
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

ach ja, hier das zweite zwischenergebnis zum download.
zwischenergebnis 2.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

jetzt zum letzten akt, damit das tutorium nicht zu unübersichtlich wird:
das overlapping.
wie der name schon sagt, handelt es sich beim overlapping nun um ein zweites grain, welches das erste grain an den stellen, wo es duch das windowing zu abgehakt kling (also an anfang und endes des ersten grains), überlappt.
also so etwa:
________ ________ ________ ________ grain 1
___ ________ ________ ________ ___ grain 2

somit klingt das ganze dann homogener. ich werde in diesem tutorium nur noch ein zusatzliches grain zum overlapping benutzen, aber man kan mit der anzahl von grains auch durchaus rumexperimentieren. genauso ist es auch mit dem cosinus window (korrekt heisst das "hanning window"), welches ich im letzten kapitel vorgestellt habe: es gibt unzählige arten des windowing, bekannt und beliebt sind z.b. auch das "hamming window", das "crown window" oder auch die "gauss glocke". auch damit kann man herumexperimentieren, googelt unter diesen begriffen einfach mal nach...
nun zum overlapping:
im prinzip werden wir jetzt nur noch einen teil der struktur und den table selber kopieren. den table müssen wir kopieren, weil wir einen zweites unabhängiges grain erstellen. es ist zwar so, das der "RX" eingang des tables polyphon ist, aber es ist mir schlicht und ergreifend zu aufwendig, das ensemble an diesem punkt in einzelen voices für die lesepunkte aufzusplitten.
und zwar brauchen wir einen zweiten grain ramp osc der zum ersten grain synchronisiert wird aber um 90 grad phasenverschoben wird. desweiteren brauchen wir ein zweites hanning window und ein table-duplicat, welches wir mit dem zweiten grain ansteuern. letztendlich addieren wir beide signale vor dem ausgang. das ganze sollte nun so ausshen:
abb8.jpg

zum schluss nochmal das endergebnis zum download:
endergebnis.zip
ich möchte nochmal darauf hinweisen, das ich dieses tutorium und das dazu gehörige ensemble innerhalb weniger stunden konstruiert, geschrieben und hochgeladen habe - sollten sich also irgendwo kleine oder große fehler eingeschlichen haben, sorry - aber ich bin eben nur ein mensch! ;)

so, das war dann schon, ich hoffe dem ein oder anderen hat es spass gemacht und etwas gebracht. über kommentare würde ich mich freuen. viel spass beim weiter experimentieren!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Granular Synthese Tutorium

Beitrag von herw »

Granularsynthese - in meinem Kopf geistert zwar eine ungefähre Vorstellung, was mich erwartet, doch habe ich mich noch nie damit beschäftigt.
Danke für das Tutorium, da werde ich in den nächsten Tagen einiges zu lesen und auszuprobieren haben.
Ich werde mich damit im Urlaub beschäftigen und sicherlich danach einige Fragen haben. Es kann also schon vier Wochen dauern (leider ist der Urlaub kürzer).

ciao herw
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

ich hoffe, du kannst was damit anfangen. ich finde, das zu diesem bereich auch nicht viele tutorien angeboten werden, jedenfalls nicht für reaktor und in deutscher sprache erst recht nicht. deswegen habe ich mich auch mal dazu entschlossen, das thema ein wenig anzustossen.
hier nochmal eine schematische darstellung um grob ein bild davon zu erlangen, wie granularsynthese funktioniert - ich denke die darstellung ist allein deswegen hilfreich, weil ich mir mit der beschreibung des vorgangs in der einleitung des tutorials ganz schön einen abgebrochen hab.... also hier zur verdeutlichung:
grain.jpg
in magenta ist dabei die startposition des ersten grains dargestellt, in gelb die startposition des 2. grains (durch phasenverschobenem ramp osc für grain 2). etwas unglücklich ist die darstellung der envelope windows (in dem fall eher "crown windows"), da sie eine etwas zu starke flankensteilheit haben.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von toxonic am 30. Juni 2009, 16:50, insgesamt 2-mal geändert.
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

und hier nochmal das ensemble aus dem tutorium, aber statt zwei tables für die beiden grains, die etwas elegantere variante über 2 voices. ::kaffee::
graintable_end.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Granular Synthese Tutorium

Beitrag von herw »

toxonic hat geschrieben:und hier nochmal das ensemble aus dem tutorium, aber statt zwei tables für die beiden grains, die etwas elegantere variante über 2 voices. ::kaffee::
graintable_end.zip
ich habe gerade mal die Beispiel-Ensembles durchlaufen lassen: sehr eindrucksvoll und zum sofortigen Experimentieren anregend. Ich habe gleich mal im letzten Ensemble das Timing des ramp-Oszillators durch midipitch gesteuert.
Das öffnet für mich eine neue Welt.

ciao herw
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

das freut mich! ist ja verhältnismässig ruhig hier geworden, da find ich's gut, wenn wenigstens der ein oder andere etwas an dem tut findet! und es lohnt sich, in den bereich vorzudringen, das was in diesem tutorium abgehandelt ist nur das prinzip - in der praktischen anwendung sind unendlich viele erweiterungen denkbar (allein das grincloud-delay in reaktor hat einige sehr durchdachte features in sich, da wird auch nicht nur mit 2 grains, sonder teilweise mit vielen hundert grains gearbeitet)!

sehr aufschlussreich fand ich auch dieses pure data tutorium in deutscher sprache:
http://www.pd-tutorial.com/german/ch03s07.html
wenn man sich da mal eingelesen hat, ist das portieren in reaktor nicht so schwer, lohnt sich zu lesen!
Benutzeravatar
sternenkrieger
synth professor
Beiträge: 324
Registriert: 26. April 2006, 15:11
Wohnort: Nürnberg
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von sternenkrieger »

danke werde mich da am WE mal ausgiebig damit beschäftigen :)
Benutzeravatar
toxonic
synth professor
Beiträge: 322
Registriert: 2. Januar 2007, 20:46
Wohnort: Stuttgart
Kontaktdaten:

Re: Granular Synthese Tutorium

Beitrag von toxonic »

ich habe noch eine paar verbesserungen vorgenommen:
1. mit dem syncen zwischen den beiden ramp-oszillatoren für die beiden grains war ich unzufrieden: ich habe den zweiten oszillator mit einem macro ersetzt. darin wird dem signal des ersten grain ramp oscs einfach 0.5 hinzuaddiert und das modulo der divison duch 1 abgegriffen - somit hab ich eine hundert prozent synchrone, phasenverschobene kopie der ersten ramps.
2. ebenfalls ein bisschen nervig war das geknackse bei ändern der graingröße - das bekommt man mit nem smoother nicht hin, da das knacksen daher rührt, das dabei mehere parameter geändert werden (nähmlich noch die frequenz der ramp und die leseposition im grain) und das es dabei zu signal unterbrechungen kommt. gelöst habe ich das, indem ich mir in core ein sample&hold modul gebaut habe, das sich vom promary pendant insofern unterscheidet, das mein core macro immer dann ein signal durchlässt, wenn das signal am triggereingang abnimmt, was bei einer ramp immer einmal im zyklus passiert, nämlich von A zu 0. dieses sample hold modul sorgt nun dafür, daß änderungen der grain grösse immer nur dann weitergeleitet werden, wenn das grain von vorne beginnt. damit habe ich das knacksen beseitigt, unerwünschter nebeneffekt ist ein leichter doppler effekt, aber das kann man glaube ich in den meisten fällen eher verschmerzen als unschönes geknackse....

und hier die neue version....
graintable_enhanced_1.zip
und am rande noch eine andere variante, wie man ander arten von windows entwerfen kann:
ich habe in diesem beispiel eine synchrone triangelwelle auf einen wertebereich über 0 gebracht und sie bei eins geclippt. so hat man eine ein window mit variablem ein- und auskling-verhalten, von sanft bis hart. da kann man viel ausprobieren.... ;)
smooth window.jpg
smooth window.ens
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Antworten