WaveWizard

float buffers
Als je de oude versie van WaveWizard gebruikt krijg je een ietsje andere uitkomst dan die in de preset zelf wordt gegeven.
Dat komt omdat de sample-buffers in de oude versie nog 16 bits integers waren; in de nieuwe versie (download: http://muziekexact.nl/WaveWizard_2012_BETAVERSIE_augustus.exe) zijn ze 32-bits floating point.
Wow 16-bit ? Had je dan ooit een complete 16 bit WaveWizard versie soms ?
... op 32-bit computers is dit anders toch weinig zinvol, niet ? :?
 
Wow 16-bit ? Had je dan ooit een complete 16 bit WaveWizard versie soms ?
... op 32-bit computers is dit anders toch weinig zinvol, niet ? :?


Alle rekenprocessen in WaveWizard, zowel in de oude versie als de nieuwe, vinden, zonder uitzondering, plaats in 64-bits double precision floating point.

In de oude versie werden de 64-bits audio-output signalen, als eindresultaten, opgeslagen op 16-bits geluidssporen (automatische type conversion van C++). Die eindresultaten konden maar zeer beperkt opnieuw in code gebruikt worden. In de nieuwe versie zijn de geluidssporen 32-bits floating point, zodat outputsignalen in heel nauwkeurige vorm bewaard blijven en ook recursief aangeroepen kunnen worden in preset codes.

Je kunt dit uiteraard zelf controleren door een paar test-code presets. Bijvoorbeeld de snaarplukvergelijking of bovenstaande RMS-preset.
 
automatische, lineaire interpolatie van twee opeenvolgende buffergetallen

automatische, lineaire interpolatie van twee opeenvolgende buffergetallen

Een andere belangrijke aanpassing die je misschien niet direct in de gaten hebt, is automatische lineaire interpolatie van buffergetallen.
Code:
S1[0] = 0
S1[1] = 1000
S1[2] = 2000
Print S1[0]
Print S1[1]
Print S1[2]
Print S1[pi/2]
Als je bovenstaande code draait op de oude versie, dan krijg je als antwoord:
Code:
   S1[0]    = 0
   S1[1]    = 1000
   S1[2]    = 2000
   S1[pi/2] = 1000

Dus in de oude versie wordt eerst van pi/2 = 1,57 het deel achter de komma verwijderd, zodat je krijgt pi/2 = 1. Dan wordt gelezen: S1[1].

Als je de code draait op de nieuwe versie, dan is het resultaat:
Code:
   S1[0]    = 0
   S1[1]    = 1000
   S1[2]    = 2000
   S1[pi/2] = 1570,7963267949
In de nieuwe versie vindt dus lineaire interpolatie plaats.


Zo kun je gemakkelijk stuursignalen en envelop generatoren in een formule inbouwen, bijv. laagfrequent ruis-stuursignaal in een chorus-effect.
 
Voorbeeld: Laagfrequent random stuursignaal

Voorbeeld: Laagfrequent random stuursignaal

Hier een voorbeeld van toepassing lineaire interpolatie bij het aanmaken van een laagfrequent random stuursignaal:
Code:
Declareer a; q; duur; N
!
! Maak N randomgetallen tussen +a en -a
!
N = 350
a = 32000
Bewerk signaal
  n0          0
  n1          N-1
  Bewerking   S1[n] = random(a;-a)
!
! Gebruik deze randomgetallen voor het opwekken 
! (op spoor S2) van een laagfrequent stuursignaal van 'duur' seconden:
!
duur = 0,1*Fs
q    = N / duur
Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S2[n] = S1[n*q]

Het resultaat is afgebeeld in plaatje hieronder.

De term "laagfrequent" is eigenlijk verkeerd; de ruis bestrijkt het hele spectrum, al zit de meeste energie inderdaad bij de lage frequenties. Vandaar dat dit signaal minder geschikt is als audiosignaal, maar wel goed bruikbaar is als stuursignaal.

Een laagfrequent ruissignaal geschikt voor audio maak je bijv. met Butterworth Laagdoorlaat.
 

Attachments

  • Naamloos.jpg
    Naamloos.jpg
    82,1 KB · Bekeken: 108
  • Preset Laagfrequente ruis.txt
    819 bytes · Bekeken: 105
experimenteren met 16X16 FDN galm

experimenteren met 16X16 FDN galm

Dit is pressies het soort galm waar ik al jaren naar opzoek ben. Tot nu tot was alleen convolutie een oplossing die voor mij goed was (afhankelijk van de impuls natuurlijk), maar dit heeft ook dat natuurlijke wat ik mis bij zelfs belachelijk dure hardware reverbs.
Ik wil hier een kastje van hebben zodat ik het in een life situatie kan toepassen :okdan:


Dat kastje kan ik je helaas niet bieden :), maar nu je de nieuwe versie van WaveWizard kunt downloaden, kun je in elk geval wel zelf gaan experimenteren met galm d.m.v. de 16-kanaals FDN-galmfunctie.

De code voor de galmfunctie is op 't eerste gezicht simpel:

Code:
Galm
  bronspoor en index        S1[0]
  doelspoor en index        S1[0]
  buffer parameters F?[?]   F1[0]
  aantal samples (duur)     duur
"bronspoor" is de galm-input.
"doelspoor" is de galm-output.
"buffer parameters" is de buffer waarin alle instellingen van het FDN-galmcircuit worden geplaatst. Dat zijn er, welgeteld...115 !! Dus er zitten 115 'draaiknopjes' aan dit galm-apparaat. Dit zijn geen "wollige" instellingen, zoals "warmth" of "density", maar de directe, concrete FDN-parameters die het feedback circuit controleren. Daarom kun je de FDN-functie het best beschouwen als een "apparaat" met volledige toegang tot de eigenlijke 'hardware', d.w.z. je stelt van alle 16 kanalen de gain's in, de lengten van de delaylijnen en de coëfficiënten van de 16 loopfilters etc.

Deze instellingen behoren al in "buffer parameters" te staan, voordat je de bovenstaande galm-code kunt uitvoeren.
Uiteraard ga je die 115 getallen niet "met de hand" invoeren; je doet dat d.m.v. een preset.
Hieronder, in de bijlage de preset waarmee die pulsgalm van https://www.synthforum.nl/forums/attachment.php?attachmentid=79390&d=1335874974 werd gemaakt.

Later meer over dat eigenlijke FDN-circuit.
 

Attachments

  • Preset Pulsrespons FDN 16X16.txt
    1,8 KB · Bekeken: 153
FDN (2)

FDN (2)

Het Feedback Delay Network (FDN) kun je beschouwen als HET state-of-the-art galm-algoritme van de laatste 20 jaar.
Om je eigen galm-effecten ermee te kunnen maken, moet je een paar dingen weten:
(1) wat is een (digitaal) delay-circuit?
(2) wat is een (digitaal) delay-feedback-circuit?
(3) hoe speelt FDN het klaar om m.b.v. delay-feedbacklijnen in zeer korte tijd zo'n lawine aan reflecties op te wekken?

In volgende posts meer daarover en illustraties met presets en plaatjes (ik weet nog niet precies wanneer, sept = druk ;)).
 
FDN(3): galm met feedforward delaylijnen: convolutie

FDN(3): galm met feedforward delaylijnen: convolutie

Galm is een mix van direct geluid en vele reflecties, waarvan de eersten als afzonderlijke echo's hoorbaar zijn, en de rest als een brei van geluid. Op een sonogram kun je galm gemakkelijk onderscheiden: een handklap in een galmende concertzaal vertoont op het sonogram een duidelijk "remspoor", alsof iemand er met een doek overheen heeft gestreken terwijl de inkt nog nat was. Galm smeert het geluid uit over de tijd. Dat is trouwens iets dat elk filter doet. Technisch gesproken is galm dan ook niets anders dan een filter. Een heel bijzonder filter weliswaar.

Omdat galm is opgebouwd uit afzonderlijke reflecties, en omdat je reflecties maakt met een delay-effect, is de delaylijn de basis-bouwsteen van alle galm-algo's. Er bestaan, zoals je weet, twee soorten delaylijnen: feedforward en feedback. Met beiden kun je galm maken. Op onderstaand plaatje zie je beide typen afgebeeld.

Met een feedforward delaylijn voeg je precies één enkele reflectie toe aan een geluid, zoals een bosrand die één enkele echo geeft. Je hebt dus vele tienduizenden, ja honderdduizenden delaylijnen nodig om met feedforward een galmeffect te maken. Feedforward galm is daarom niet in realtime realiseerbaar op een PC, maar je kunt er wel de galm van een bestaande ruimte heel natuurgetrouw mee simuleren. Deze methode wordt vaak de convolutiemethode genoemd. Meer over deze term en feedforward galm vind je in Aflevering 13, "Convolutie", van de DSP-serie die ik in 2000 - '01 schreef voor Music Maker (http://muziekexact.nl/DSP_13_Convolutie.pdf). Ook met WaveWizard kun je op deze manier galm maken. Daarover heb ik het in een eerdere post in deze draad al gehad: https://www.synthforum.nl/forums/showpost.php?p=1515014&postcount=243.

Een feedback delaylijn voegt vele (in theorie oneindig veel) reflecties toe die steeds zachter worden, zoals de snel repeterende echo's van een geluidsbron tussen twee betonnen muren. In een effect-apparaat of in software gaat het bijna altijd alleen om deze feedback vorm. Meer daarover binnenkort in deze draad.
 

Attachments

  • Delay_feedback.jpg
    Delay_feedback.jpg
    25,8 KB · Bekeken: 106
FDN(4) delay-feedback galm

FDN(4) delay-feedback galm

Het is eigenlijk heel raar, zelfs een beetje tegenstrijdig, dat je met delay-feedback galm kunt maken.
Delay-feedback levert immers een reeks echo's op die op onderling gelijke tijdsafstanden liggen, bijv. zoals het tikken van een metronoom.
Galm daarentegen bestaat juist uit echo's die op onderling ONgelijke, volkomen willekeurige tijdstippen liggen. Dat is ook de reden waarom je galm kunt maken door de echo's ervan te modelleren als ruis (https://www.synthforum.nl/forums/showpost.php?p=1515014&postcount=243).
Een galm-algo MOET daarom ruis als output geven als je een puls op de input zet! Een galm-effect is een bijzondere ruisgenerator.
Dat FDN daartoe in staat is hebben we ook al gezien (https://www.synthforum.nl/forums/showpost.php?p=1502299&postcount=176).

De vraag is nu: hoe is dat mogelijk?
Het antwoord is verbluffend simpel: schakel een aantal delay-feedbacklijnen parallel en verbind ALLE outputs met ALLE inputs. Als je nu voorkomt dat de lengten van de delaylijnen veelvouden zijn van elkaar dan zal een enkele puls op de input een sneeuwbal-effect veroorzaken van meer en meer random reflecties die elkaar steeds sneller opvolgen. De dichtheid (density) van de galm wordt bepaald door het aantal delaylijnen. In de praktijk blijkt (althans mijn ervaring) dat 4 lijnen te weinig is en 16 lijnen prima voldoet, zoals voorbeeld van #176 aantoont.

Op het plaatje hieronder, om het simpel te houden, een FDN met 2 delaylijnen. Dan heb je 4 koppelingen tussen de outputs en inputs. Die zie je afgebeeld in de "koppelmatrix". Het woord "unitair" betekent dat de versterkingen q zo gekozen zijn dat de koppelmatrix niks anders doet dan koppelen, zonder dat er versterking of verzwakking plaats vindt. Dat is minder vanzelfsprekend dan het lijkt. Slechts voor zeer uitgekiende waarden van de q's is dat het geval. Daarom kan de gebruiker de waarden van de q's niet zelf instellen.

Bij een FDN 16 X 16 bestaat de matrix uit 256 q's.

Het is verbijsterend hoe snel dit algo is. Zelfs FDN 16 X 16 op een gewone laptop al sneller dan realtime.

Hebben we hiermee nu het principe van FDN-galm helemaal gezien?
Bijna. De galm die je krijgt met het FDN-circuit volgens de afbeelding klinkt agressief, ijzig, beton-achtig.
Er moeten regelbare kleurfilters ingebouwd worden. Binnenkort een aangepast plaatje.

:walker:
 

Attachments

  • FDN 2X2.jpg
    FDN 2X2.jpg
    36,9 KB · Bekeken: 110
Ik moet dit even nakijken, heb het gelezen en schema gezien. En dit gezien te hebben in een cel geparkeerd. Het had te maken met de fase van de reflecties. Afgelopen weekend sprak Howard Moscovitz over een pluggin die hij had geschreven die ook bij dit onderwerp in de buurt kwam.
 
Bedankt voor de link, Slolov:okdan:

Mijn browser (Windows Exp) pakt 't niet, maar ik snap wel wat er gebeurt: je kunt een formule intypen (een functie van de tijd) die dan vervolgens geëvalueerd wordt tot audiosignaal.

Uiteraard kun je dat ook met WaveWizard. Hieronder een codevoorbeeld waarin een FM-toon wordt gemaakt met 1 carrier en 1 modulator (dat aantal kun je natuurlijk net zo groot maken als je wilt).

Code:
Declareer c; f; duur;
 
f = 100                ! frequentie van toon
c = 2 * pi * f * Ts    ! constante
duur = 10* Fs          ! 10 seconden
 
Bewerk signaal
  n0          0
  n1          duur
  Bewerking   S1[n] = 8000 * sin(c*n + 8*sin(c*n))
 
Back
Top