.NET VST plugins maken

Origineel geplaatst door bikkel
Ik geloof dat de jongens van Arturia ook Java gebruiken. En Azureus is ook een goed voorbeeld hoe een Java programma met een C interface gewoon een goede performance haalt.

Zou hier graag bevestiging van hebben. geloof dit namelijk niet. Zeker een audioengine zal nooit in Java geschreven zijn. Als de Arturia boys dit wel voor elkaar hebben gekregen dan hebben ze erg goede programmeurs.

Applicaties zoals bijvoorbeeld reaktor gebruiken zelfs een Engine waardbij C code en Assembler worden gecombineerd om maximale performance te halen.
 
hey Almeros,

nee, ik heb niets kunnen vinden. De meeste antwoorden hier hadden (zoals je zelf ook al opmerkte) helaas niets met de vraag te maken. *D
Ik heb nog gedacht om die Delphi SDK te wrappen maar ik vind het zonde om zoveel tijd te besteden aan de "plumming".
Ik heb dat een keer gedaan voor Direct X (COM->C# wrapper) en dan ben je echt weken aan het zoeken naar wat die 30000 parameters betekenen.
Ik heb net iets te vaak frameworks ontworpen en gebouwd om dat nog leuk te vinden :-)

was je er zelf ook naar op zoek?
 
Nou niet actief, maar als er zoiets bestaat dan vind ik het wel leuk (in m'n toch al schaarse tijd) er eens mee te spelen... Ik denk dat ik wel eens ga kijken naar de eerder genoemde java wrapper...

Mocht het er ooit van komen dat ik wat testbaars heb gemaakt, dan post ik dat natuurlijk hier ff...
 
Interessant stukje (evt. gekleurd natuurlijk... ookal lijken de tests mij eerlijk en veelzeggend genoeg) over performance tussen jvm en native code... lees alles verder op http://jvstwrapper.sourceforge.net/

PERFORMANCE
Performance is a critical thing, especially in realtime applications. And I can say I was pretty astonished on how the Wrapper performes in comparison to native c++ plugins. Generally we can split this issue into 2 categories: The jni and the jvm performance.

The jni performance isnt very important for the overall performance because this is a constant value. And on todays fast cpus this value gets smaller and smaller. Of course, the jni calls bring an extra overhead, but the wrapper tries to minimize it.

We can see that the beast here is the jvm performance. But this isnt a problem at all too, as the articles linked below proove impressively.
Java performance
Java numbercrunch performance

So, in theory, we should only see a small (and constant) difference between native and java plugins. And this is exactly what I saw on my tests. I compared the DelayEditGUI example (C++) from Steinbergs VST-SDK and my java port of it (jDelay). They use exactly the same processing algorithm. On my PII-450 (WinXP, J2SDK1.4.1) the Wavelab performance monitor shows 3% cpu usage with the native, and 4% with the java version. The difference is about 1% (on a PII-450).Try it yourself. Download the VST SDK linked below and jDelay from the jVSTwRapper download page.
 
HAHA... ff jVSTwRapper uitgeprobeerd... Wat een geweldig speelgoedje :)

Ik heb de voorbeelden even getest... klinkt ten eerste leuk, simpel (maar wat je daarvan maakt heb je zelf in de hand) en ze nemen minder VST performance in dan een enkele VST plugin die ik ooit gebruikt heb... maargoed...ze zijn dan ook simpel natuurlijk.


Ik ga er zeker zelf eentje maken zodra ik daar tijd voor heb.... Nog iemand met een suggestie voor een effectje? :D
 
Nou.. ;) Ik ben al een tijdje op zoek naar een plugin die een deel van het frequentiebereik kan inverten om een beetje een scrambled politie signaal te emuleren. Ik zeg niet dat je die moet gaan maken maar aan de hand daarvan heb ik mezelf ongeveer dezelfde vragen gesteld die jij ook hebt, dus ik brand wel ff los in deze thread.

De tijd ontbreekt me momenteel helaas om zelf een heel VST framework in elkaar te draaien, maar ik kende de .NET en Java wrappers niet dus misschien wordt het hiermee wel een stuk gemakkelijker. Ook is er trouwens een VST->Pd wrapper zodat je het als een Pd patch zou kunnen schrijven, maar ik weet niet hoe stabiel dat is (versienummer ligt nog schrikbarend dicht bij de 0.0).

Een andere optie is Synthmaker wat ik nu aan het uitchecken ben. Ik weet niet of Synthedit dit ook kan, maar Synthmaker heeft twee taaltjes waarin je zelf modules kan schrijven; je kan dan gewoon de bytes van het signaal manipuleren. Er is een C/java-achtig taaltje en een assembler-achtig taaltje. Voorzover ik Synthmaker heb uitgeprobeerd met hun bijgeleverd example synth, die redelijk complex is, lijkt het CPU-gebruik van een Synthmaker-gegenereerde VST plugin heel aardig te zijn!

Maar goed, ik zit eigenlijk dus ook te broeden om zelf iets te maken, want zo'n frequentie inverter zou een heel geinig effect kunnen zijn. Synthmaker heeft helaas zelf geen kant-en-klare FFT module dus dat wordt helemaal zelf programmeren, wat misschien niet lukt met de ingebouwde taaltjes.

Het effect dat ik wil komt waarschijnlijk op de volgende stappen neer:

1. Het inkomend signaal in tijddomein (samples) met een Fast Fourier Transform (FFT) omzetten naar frequentiedomein (levert een array van de sterkte van de verschillende frequentiecomponenten)
2. Op basis van een frequentiepaar (bijvoorbeeld freq1 en freq2) het bijbehorende deel van dit array swappen (bijv. array[16] t/m array[31])
3. Met IFFT (wat eigenlijk hetzelfde als FFT is) dit array weer omzetten naar een signaal, en dat uitvoeren.

Los van of je dit ook wil, zal het waarschijnlijk in dezelfde hoek zitten wat je gaat maken.

Overwegingen:

- Performance van het rekenwerk: Het echte rekenwerk bestaat voornamelijk uit een paar vermenigvuldigingen en sin/cos voor de FFT. De trigonometrische functies kunnen natuurlijk bij het opstarten in een lookup table worden gezet, dus dit kan heel snel. Vermenigvuldigen en array indexen is in alle mogelijke talen (C#, Java, etc.) gewoon heel snel.
- C#/.NET/Java: Wat wel jammer is voor de performance, is dat alle ingevoerde data eerst moet worden gekopieerd naar de managed heap. Na het berekenen moet je het ook weer exporteren ("marshalen"). Dat komt er, vermoed/vrees ik, op neer dat het signaal twee keer tussen het geheugen heen en weer wordt gekopieerd. (In C# misschien slechts een keer als je met een unsafe blok geheugen kan werken, nog niet uitgezocht). Wat dat betreft zal een managed oplossing dus altijd meer CPU kosten dan wanneer je puur native code gebruikt. C++, of een VST generator die native code genereert, heeft hier geen last van en is dus potentieel beter qua CPU-gebruik.
- Omdat een VST toch meestal puur wiskundig bezig is, wat in vrijwel alle talen dezelfde syntax heeft, is het mogelijk beter om gelijk native te beginnen in C++. Hoewel dit verschil bij normale sampling rates/1 audio-stream waarschijnlijk wel uit te houden is gok ik. Maar tenslotte moet je toch EEN framework gaan leren, en de investering in C++ is dan wel future-proof, bijvoorbeeld als je iets wil gaan maken wat 8 96kHz audiostreams in en uit aankan. Dan gaat het kopieren van native->managed->native vrees ik toch wel aantikken.
- In C# kun je met het 'unchecked' keyword de array bounds checking tijdelijk uitschakelen. Java heeft dit volgens mij niet? Als je veel met arrays werkt (wat zo zal zijn) kan dit een performance hit opleveren, wat Java volgens mij minder geschikt maakt want Java heeft geen mogelijkheid om deze checks uit te zetten (let me know als ik dit verkeerd heb!).
- Streaming: Ik weet niet hoe VST's hun bytes in- en uitvoeren. De FFT bijvoorbeeld werkt alleen op een array van bijvoorbeeld 256 samples tegelijk. Een bewerking met FFT is dus niet helemaal 'realtime' streaming te doen maar alleen in blokken. Dit zal ook voor andere bewerkingen gelden.
- Al met al is natuurlijk het lowlevel input/output werk heel vervelend, wat weer een goed argument is om met een omgeving als SynthMaker te werken. Misschien moet je hier extra maatregelen voor treffen, wat stom en vervelend werk is. Hopelijk handelen de bestaande frameworks dat allemaal goed af maar ik weet niet in welke mate.
- Sterk voordeel van een C#/Java/C++ oplossing is dat je de broncode helemaal in eigen hand hebt, en dat de SynthEdit/SynthMaker mensen je investering niet kunnen vernietigen door bijvoorbeeld geen nieuwe versies meer te maken, of grote bedragen te vragen voor upgrades.

Nou, alle inzichten hierover zijn welkom. Als je aan de slag gaat met coden ben ik wel ge-interesseerd in de voortgang :) Ik heb weinig DSP-ervaring maar wel veel programmeerervaring dus misschien kan ik een handje helpen.

groets
MOSFET
 
Laatst gewijzigd:
Interessant idee voor een plugin!

Goed doordacht ook over de performance... maar aan de andere kant snap ik niet dat iedereen hier direct zo op focussed. Lijkt me veel belangrijker eerste eens een interessante plugin te maken! Daarnaast viel het mij dus echt ontzettend mee nu... dus alles heen en terug naar de managed heap kopieren neemt iig een verwaarloosbare hoeveelheid cpu in beslag.

Dnek dat als je dan serieus bent met je plugin je hem alsnog moet porten naar C++. Gewoon omdat je dan een mooie cleane dll krijgt en voor wat betreft de GUI van je VST wordt deze namelijk wat irritant door java op de voorgrond geplaatst ipv in de Cubase main window...


Denk dat ik voor te blijfen steken in performance issues eerst maar eens een FFT implementatie ga maken... das wel een beetje een basis voor een leuk effect.. VST's werken met een functie (zit er nu niet achter dus kan de naam ff niet geven) die een array van channels ontvangt (Links, rechts bv.) waar dan per channel steeds 1 byte beschikbaar is om te processen... Voor FFT moet dus inderdaad die buffer worden aangemaakt maar denk dat een buffer van 256 bytes (Is dat genoeg voor FFT?) nauwelijks een hoorbare vertraging opleveren...


Toevallig goede links over FFT?
 
Correctie over dat FFT bufferverhaal... de methodes process en processReplacing krijgen wel een bepaalde hoeveelheid sampleFrames a.k.a samples mee waarlangs geïtereerd kan worden (of in simpelere programmeurstaal; waarover je een while/for-loopje kan laten lopen)

maargoed, hoeveel sampleframes je krijgt is niet voorspelbaar, dus daar mag je niet vanuit gaan... toch een bepaalde bufferlaag maken dus...
 
Ik heb voor een practicum ooit een simpele FFT in C gemaakt... Vanavond t/m dit weekend heb ik ff stress, maar begin komende week zal ik eens kijken of dit nog werkt en het posten :)

De documentatie erover op internet was redelijk waardeloos vond ik, ik kan niet echt wat aanraden..
 
Hey Almeros!

wat gaaf dat het gelukt is.
Had je voorbeelden gevonden die wel compileerden bij jou?
Heb je daar een link van?
De meeste dingen die ik gevonden had, werkten gewoon niet.

ben wel beniewd naar wat je zelf al gemaakt hebt!
 
@Alonsomos:
Zeker gaaf hoor :). Ik heb deze gedownload: http://jvstwrapper.sourceforge.net/ (Java dus en geen .NET). Zitten een aantal simpele maar goede voorbeelden bij... ff de installatieinstrucites goed lezen et voila. Heb zelf nog niets gemaakt hoor... Dat kost even iets meer tijd :)


@MOSFET:
Dit lijkt me wel een goede source: http://www.musicdsp.org/archive.php
 
Origineel geplaatst door Acidfever
Sorry maar C# is in geen geval zo langzaam als Java. Java geeft misschien acceptabele performance voor bepaalde applicaties maar voor dit soort applicaties zeker niet. (Al ben ik zelf van mening dan Java nooit echt acceptabele performance geeft, maar dat komt meer omdat ik van beroep software/ systeemtester op gebied van functionalitiet en performance ben denk ik :D )

hmmm... begint al erg op een IT Microsoft versus Sun debat te lijken... ;)
Welke van de 2 nu het performanste zijn (JAVA of .net) , maakt niet veel uit. Naar mijn mening zijn ze allebei absoluut inefficiënt om Digital Signal Processing mee te gaan doen.
Bij Java kun je mss wel met JNI werken, maar dat mist dan weeral compleet de point van JAVA zelf : een platformonafhankelijke taal die je platformafhakelijk gaat maken om je code te kunnen optimaliseren... Dan programmeer je het toch beter in C++ denk ik zo?
Ik had de indruk dat Java code (.net heb ik geen ervaring mee) erg veel gelijkt op object geöriënteerde C++ code. Dus als je eigenlijk stevig Java kan coderen, kun je volgens mij zeer vlug C++ aanleren.

Als antwoord op het topic zelf, zou ik zeggen dat VST-plugins schrijven in Java of .Net in theorie wel mogelijk is (alles is mogelijk in informaticaland), maar dat het niet erg efficiënt is aangezien je ettelijke 10-duizenden samples per seconde moet kunnen berekenen rekening houdende dat je Virtual Machine ertussen zit. Misschien met een recent gigahertz-monster zou dat wel kunnen lukken, maar het gaat massa's CPU-power zuipen.
 
Origineel geplaatst door virkaz
Tis al jaren bekend dat Arturia gasten alles met Java doen

Daar geloof ik nu eens niets van...
Dat ze misschien een JAVA-applicatietje gebruiken op 1 of andere back-office applicatie, dat is best mogelijk, maar een real-time geïnterpreteerde programmeertaal gebruiken om een complexe softsynth te creëren zou gewoon ridicuul zijn.


*update :
In dit artikel lees ik het volgende over Arturia Storm...
http://emusician.com/sequencers/emusic_arturia_storm_macwin/

Arturia Storm installs from a cross-platform CD-ROM and requires run-time Java, which is supplied for the Mac and PC. (All audio processing is programmed in assembly language for optimal performance.) MIDI is handled on the PC by DirectX and on the Mac by Open Music System, the latest versions of which are also provided.

Dus maw. Arturia gebruikt gewoon JAVA voor de installer zodat die cross-platform kan zijn, de plugins zelf zijn in native assembler geschreven, wat nog een heel stukkie ingewikkelder is dan C++ ...
 
Als VST plugins ook als COM+ objecten te gebruiken zijn, dan zal het uiteindelijk wel lukken. Je kunt namelijk wel COM+ componenten maken in .NET. Je zou dan de COM interface moeten implementeren die vereist is door de VST host. Maar het blijft een combinatie van 'managed code' met 'unmanaged code', dit lijkt mij niet snel genoeg voor real-time toepassingen.

Er zijn wel tests die uitwijzen dat 'managed code' (.NET dus) niet veel trager is dan 'unmanaged code' (Win32, COM, ActiveX, etc.). En er bestaat ook een Managed DirectX API; die is natuurlijk ook bedoeld voor real-time toepassingen. Of anders een DX plugin bouwen i.p.v. VST ?
 
Origineel geplaatst door MOSFET
1. Het inkomend signaal in tijddomein (samples) met een Fast Fourier Transform (FFT) omzetten naar frequentiedomein (levert een array van de sterkte van de verschillende frequentiecomponenten)
2. Op basis van een frequentiepaar (bijvoorbeeld freq1 en freq2) het bijbehorende deel van dit array swappen (bijv. array[16] t/m array[31])
[/B]

Ik ben wel erg benieuwd naar hoe dit gaat werken. Je moet een boel keuzes maken.
Bijvoorbeeld de fft lengte. Je kunt FFTs heel efficient implementeren als ze een lengte
hebben van een macht van 2. Er zijn dan diverse symmetrieen. Als je die niet uitbuit
moet je NxN vermenigvuldigingen uitvoeren (N = FFT lengte) per frame en dat wordt al gauw
heel erg complex (langzaam!).

Dan heb je nog een analyse window nodig om aliasing te voorkomen. Een veelgebruikt
window is een hanning window. Maar ik denk in jouw geval dat een sqrt(hanning) beter
is. Waarom: als je dergelijke niet-lineaire operaties gaat doen in het FFT domein,
dan sluiten de golfvormen van opeenvolgende frames na de inverse FFTs niet meer op elkaar aan. Dan is het handig
om na de inverse FFT nogmaals een windowing toe te passen, waardoor niet-passende
stukjes netjes geinterpoleerd worden. Doe je dit niet, dan ga je gegarandeerd tikken en ratels
krijgen met een frequentie die gelijk is aan je framelengte.

Dan heb je nog het probleem van complexe getallen. FFTs leveren nu eenmaal
complexe representaties op (magnitude die aangeeft hoe sterk die component is,
en daarnaast een fase). Bij de meeste FFT algoritmes krijg je het reeele deel en het imaginaire
deel apart. Je zou gewoon het hele complexe getal kunnen swappen,
ben wel benieuwd naar wat daar uit komt...

Veel succes in ieder geval. Ik vind 't wel een interessant project :-)
 
Origineel geplaatst door DJB
Ik ben wel erg benieuwd naar hoe dit gaat werken. Je moet een boel keuzes maken.
Bijvoorbeeld de fft lengte. Je kunt FFTs heel efficient implementeren als ze een lengte
hebben van een macht van 2. Er zijn dan diverse symmetrieen. Als je die niet uitbuit
moet je NxN vermenigvuldigingen uitvoeren (N = FFT lengte) per frame en dat wordt al gauw
heel erg complex (langzaam!).

Dan heb je nog een analyse window nodig om aliasing te voorkomen. Een veelgebruikt
window is een hanning window. Maar ik denk in jouw geval dat een sqrt(hanning) beter
is. Waarom: als je dergelijke niet-lineaire operaties gaat doen in het FFT domein,
dan sluiten de golfvormen van opeenvolgende frames na de inverse FFTs niet meer op elkaar aan. Dan is het handig
om na de inverse FFT nogmaals een windowing toe te passen, waardoor niet-passende
stukjes netjes geinterpoleerd worden. Doe je dit niet, dan ga je gegarandeerd tikken en ratels
krijgen met een frequentie die gelijk is aan je framelengte.

Dan heb je nog het probleem van complexe getallen. FFTs leveren nu eenmaal
complexe representaties op (magnitude die aangeeft hoe sterk die component is,
en daarnaast een fase). Bij de meeste FFT algoritmes krijg je het reeele deel en het imaginaire
deel apart. Je zou gewoon het hele complexe getal kunnen swappen,
ben wel benieuwd naar wat daar uit komt...

Wow...hier snap ik echt geen donder van....knap hoor, dat anderen dat wel doen

*meneer die een 6- had voor wiskunde A (na 2 jaar bijles) gaat weer naar Lingo kijken*
 
MOSFET, ik zou deze vraag gewoon in het Native instruments Reaktor 5 forum stellen. Ik heb zelf R. 5 besteld en met de nieuwe Core Cell techniek moet er toch iets van dien aard te maken zijn. (Ik heb de manual helaas nog niet ontvangen maar NI kennende moeten de gebruikers toch alles zelf leren).
 
Volgens mij valt het allemaal wel mee. Je moet gewoon in de DllMain functie de CLR hosten. Hiervoor gebruik je de CorBindToRuntimeEx functie. Daarna een referentie opvragen van de default application domain, je managed .NET VST plugin inladen en je bent vertrokken. Het moeilijkste (of het vervelendste) is een .NET wrapper schrijven rond de native DLL entry points. Om niet telkens een array van floats te moeten marshallen, zou ik alleen een pointer die naar het begin van een array wijst te marshallen. Scheelt een hoop in performantie.
 
Back
Top