VST Plug-In schreiben, hat jemand Erfahrung mit sowas??
-
Hallo,
das ist jetzt vielleicht etwas speizelleres, aber vielleicht hat jemand damit schon etwas gemacht. Es geht darum das ich ein VST-Plugin schreiben möchte für das Steinberg Cubasis. Dieses Plugin soll einem schon vorhandenen Programm Parameter aus Cubasis übergeben. Ich kauere schon seit anfang dieser Woche herum und ehrlich gesagt, hab ich noch nicht mal einen Ansatz
Zunächst mal ne allegemeine Frage zu DLL's vorweg. Ist es möglich das wenn ein Host (Cubasis) dieses Plugin Dll aufruft, dieses Plugin DLL wiederrum ein zweites Programm aufruft und praktisch als Vermittlungsschnittstelle für Parameter zwischen Cubasis und diesem Progi funktioniert? Ist das so möglich. oder muss ich mein schon vorhandenes Progi komplett als DLL schreiben? Ich frage nur, weil mein nun schon vorhandenes Progi schon recht umfangreich ist, ich müsste ja dann alles von neu machen.
Was ich mir Vorstelle ist: Cubasis übergibt dem Plugin Noteninformationen, wie Notenummer sowie die dazugehörige Velocity und Notenlänge sowie ein paar SysEx Messages während ein Midi Stück abgespielt wird. Nun ist es so das es ja mehrere Noten zeitlich gleichzeitig sein können, diese Infos müssten dann alle Parallel in's Plugin laufen, das Plugin leitet diese ganzen Infos an mein vorhandenes Progi weiter wo sie dann weiterbehandelt werden.
Bitte wer schon erfahrungen mit VST Plugins hat, ich bin für jede Hilfe sehr dankbar!!! Die VST SDK von Steinberg hab ich schon gute 3mal durchgelesen,
die ist aber recht mager was erklärte Beispiele anbetrifft.Ich hoffe ich hab auch die richtige Kathegorie erwischt mit diesem Thema, da ich ja in VC++7 und mit MFC das Problem lösen muss.
Gruss
Artur
-
mit Steinberg Cubasis werden hier ned viele Erfahrung haben. eingeschlossen mir.
Was uns daher fuer ne Antwort fehlt, ist, was es genau fuer ne Schnittstelle ist !
Musst du ne Dll einhaengen und Cubasis ruft dann definierte Funktionen Ueber die C-Schnittstelle der Dll auf.
Oder bedeutet Plugin ne Com-Dll, wo ComObjecte bestimmte Interfaces unterstuetzen muessen und die Dll, wenn ordnungsgemaess registriert, von Cubasis selbst angezogen wird ?
Ich vermute letzteres ...Ciao ...
-
hmm, also grundsätzlich kannst du aus einem vst-plugin heraus alles machen - solange die schnittstelle vom host (cubase) zum plugin erhalten bleibt.
was du innerhalb dieses plug-in machst, sprich auch einen weiteren prozess erzeugst, spielt keine rolle.
bedenken solltest du aber, das die sache ja als realtime-app läuft und du dir da mit mehreren prozessen schnell eine gepflegte bremse bastelst.
und was das SDK von steinberg betrifft ... die beispiele sind nun wirklich nicht schwierig zu verstehen. versuche doch zunächst einmal, ein reines pass-through zum laufen zu bekommen. danach erweiterst du dieses nach und nach.
Musst du ne Dll einhaengen und Cubasis ruft dann definierte Funktionen Ueber die C-Schnittstelle der Dll auf.
Oder bedeutet Plugin ne Com-Dll, wo ComObjecte bestimmte Interfaces unterstuetzen muessen und die Dll, wenn ...das SDK stellt für ein vst-plugin eine basisklasse bereit, von der man eine ableitung erzeugt. die processing-funktion ist virtuell - logisch - die man seinen bedürfnissen entsprechend anpasst. die plug-ins (DLL) werden in ein spezielles verzeichnis kopiert, cubase lädt diese komplett beim start und sucht nach speziellen entry-funktionen der basisklasse. sind diese vorhanden, erkennt cubase dieses als vst-plug und bietet es entsprechend in den menues an. aufgerufen wird nur eine processing-funktion mit input/output buffer und ein paar parametern. that`s all ... nix COM oder so - simple DLL mit bestimmten signaturen als entry-funktion.
rocknix ///
-
hi, danke erstmal für die antworten!

das mit dem realtime ist erwünscht und sollte kein problem sein da mein process der die noteninformationen auswertet keine soundbearbeitung an sich machen wird.
ich bin grad am rumprobieren mit nem kleinen plugin so wie du gemeint hast um mal einen parameter zu übergeben. ich nehm mir da das AGAIN example und bastle mal damit rum.
So wie's aussieht hast du mit cubase schon etwas gemacht, kann ich mich bei probs an dich wenden?

gruss
artur
-
ich bin grad am rumprobieren mit nem kleinen plugin so wie du gemeint hast um mal einen parameter zu übergeben. ich nehm mir da das AGAIN example und bastle mal damit rum.
genau, dieses AGain-PlugIn ist ein gutes beispiel für den einstieg. das meinte ich mit pass-through - mehr macht das dingen ja eigentlich nicht.
So wie's aussieht hast du mit cubase schon etwas gemacht, kann ich mich bei probs an dich wenden?
klar kannst du, aber bitte hier im forum und NICHT per mail ... ob ich auf deine fragen dann eine antwort weiss ist ein anderes thema ... lets see

-
ja klar hier im forum, es sollen ja auch andere was davon haben falls sie mal was ähnliches machen wollen

nebenläufig noch was generelles. wie stell ich es am besten an die dll zu debuggen? weil sie ja nicht von der sdk aufgerufen werden kann sondern vom host. wenn ich nun auf play drücke in der sdk kann ich eine app wählen, daraufhin wähle ich cubasis.exe, dann wird der process mittels "break" gestoppt. klar cubasis
lädt das plugin ja nicht beim starten sondern erst im nachhinein wenn man dieses plugin auswählt. habe ich etwas nicht beachtet oder gibt es da einen trick??
-
feisX schrieb:
nebenläufig noch was generelles. wie stell ich es am besten an die dll zu debuggen? weil sie ja nicht von der sdk aufgerufen werden kann sondern vom host. wenn ich nun auf play drücke in der sdk kann ich eine app wählen, daraufhin wähle ich cubasis.exe, dann wird der process mittels "break" gestoppt. klar cubasis
lädt das plugin ja nicht beim starten sondern erst im nachhinein wenn man dieses plugin auswählt. habe ich etwas nicht beachtet oder gibt es da einen trick??hmm, wenn du ein DLL-project hast, brauchst du bei den debug-settings doch nur "cubase.exe" als executable anzugeben und dann kannst du die dll wie gehabt debuggen.
-
ja normal schon. die sdk hält mit dieser meldung an:
Unhandled exception at 0x77f9180c in Cubasis.exe: User breakpoint.
??keine ahnung warum, hab das AGain Example zunächst so genommen wie es ist. Wenn ich die dll in's VST verzeichnis schmeiße und Cubasis starte, lässt es sich natürlich ganz normal auswählen und benutzen, aber aus der VC.Net kommt der obige break
kann es sein das cubasis eine debugg schnittstelle zur verfügung stellen muss damit VC da einspringen kann?
-
feisX schrieb:
kann es sein das cubasis eine debugg schnittstelle zur verfügung stellen muss damit VC da einspringen kann?
nö, wenn die DLL debug-infos hat, ist das ausreichend. dann solltest du deine breakpoints setzen und in der DLL anhalten können.
-
so, nachdem ich mich nun ewig lang mit dll's und kram beschäftigt habe, habe ich es zustande gebracht dieses Gain beispielchen mit einem Dialog zu erweitern und der compiler mekert auch nicht. aber bei starten von cubasis kommt folgendes: Program Assertion failed! blablabla ...afxwin1 Line26
nun steh ich total auf'm schlauch

hab hier im forum gelesen, das dieser fehler womöglich durch globale instanzen kommt. bei mir wird aber ein zeiger auf den dialog erzeugt???
vielleicht hab ich etwas grundlegendes nicht beachtet und einer von euch profis kann mir helfen??hier meine implementierung:
der dialog wird im konstruktor erzeugt, es spielt aber keine rolle
an welche stelle er erzeugt wird, das hab ich schon ausprobiert.#ifndef __AGAIN_H #include "AGain.hpp" #include "stdafx.h" #include "mcdlg.h" //#include "ExportData.h" #endif //------------------------------------------------------------------------------------------------------- AGain::AGain (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 1, 1) // 1 program, 1 parameter only { fGain = 1.; // default to 0 dB setNumInputs (2); // stereo in setNumOutputs (2); // stereo out setUniqueID ('Gain'); // identify canMono (); // makes sense to feed both inputs with the same signal canProcessReplacing (); // supports both accumulating and replacing output strcpy (programName, "Default"); // default program name //testFunc(); CmcDlg *pdlg = new CmcDlg(); pdlg->Create(IDD_DIALOG1); pdlg->ShowWindow(SW_SHOW); } //------------------------------------------------------------------------------------------------------- AGain::~AGain () { // nothing to do here } . . . usw.das hier ist die Zeile26 in afxwin1.inl
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle() { ASSERT(afxCurrentResourceHandle != NULL); return afxCurrentResourceHandle; }hier die header der Gain:
#ifndef __AGAIN_H #define __AGAIN_H #include "audioeffectx.h" //------------------------------------------------------------------------------------------------------- class AGain : public AudioEffectX { public: AGain (audioMasterCallback audioMaster); ~AGain (); // Processes virtual void process (float **inputs, float **outputs, long sampleFrames); virtual void processReplacing (float **inputs, float **outputs, long sampleFrames); virtual void testFunc(); // Program virtual void setProgramName (char *name); virtual void getProgramName (char *name); // Parameters virtual void setParameter (long index, float value); virtual float getParameter (long index); virtual void getParameterLabel (long index, char *label); virtual void getParameterDisplay (long index, char *text); virtual void getParameterName (long index, char *text); virtual bool getEffectName (char* name); virtual bool getVendorString (char* text); virtual bool getProductString (char* text); virtual long getVendorVersion () { return 1000; } virtual VstPlugCategory getPlugCategory () { return kPlugCategEffect; } protected: float fGain; char programName[32]; }; #endif
-
so, ich hab mich entschieden es nun dabei zu belassen und alles in der VSTGUI zu machen, jetzt kann ich mich auf das Wesentliche konzentrieren.
Was meinst du würde sich besser für mich eignen. Mein Plug als SendEffect oder als Instrument zu implementieren? Ich benötige nichtmal Ausgänge, Eingänge glaub auch nicht, zumindest keine die als Frames reinkommen. Denn hier sind Inputs und Outputs ja Blöcke von Bytes so wie ich das verstanden hab durch unzählliges Lesen der SDK Doku
Bitte berichtigen wenn ich falsch liege.
Was ich bisher geschafft habe, ist folgendes: Mit der VSTGUI meine Oberfläche und per CMovieBitmap werde ich einen sich ändernden Zustand anzeigen... das wars *schäm*
Ich benötige ja keinerlei Delay, Gain usw. was dort alles angeboten wird, ich muss an die Noten Infos von MIDI stücken rankommen und diese verarbeiten (SysEx auch), wenn viele Noten gleichzeitig gespiel werden, müssen die gebuffert werden (ca. 10msec) und dann sequenziel verarbeitet werden wobei die reihenfolge noch nicht mal ne Rolle spielen, mit Audio Verarbeitung an sich hat das nix zu tun, ich möchte lediglich eine Visualisierung der Noten machen
d.h. Es werden auch keine Audiospuren beachtet.Wie gehe ich hier am geschicktesten ran? Hab in der Doku (und die ist arm!) nichts passendes gefunden

Greets
Artur