aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/vst/src
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/vst/src')
-rw-r--r--externals/grill/vst/src/editor.cpp27
-rw-r--r--externals/grill/vst/src/editor.h26
-rw-r--r--externals/grill/vst/src/editormac.hpp58
-rw-r--r--externals/grill/vst/src/editorwin.hpp361
-rw-r--r--externals/grill/vst/src/main.cpp980
-rw-r--r--externals/grill/vst/src/main.h28
-rw-r--r--externals/grill/vst/src/vst.rc135
-rw-r--r--externals/grill/vst/src/vstedit.cpp82
-rw-r--r--externals/grill/vst/src/vsthost.cpp461
-rw-r--r--externals/grill/vst/src/vsthost.h357
-rw-r--r--externals/grill/vst/src/vstmaster.cpp282
-rw-r--r--externals/grill/vst/src/vstmidi.cpp52
-rw-r--r--externals/grill/vst/src/vstparam.cpp106
13 files changed, 0 insertions, 2955 deletions
diff --git a/externals/grill/vst/src/editor.cpp b/externals/grill/vst/src/editor.cpp
deleted file mode 100644
index be412b00..00000000
--- a/externals/grill/vst/src/editor.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2004 Thomas Grill (xovo@gmx.net)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "editor.h"
-#include "vsthost.h"
-#include <flext.h>
-
-#if FLEXT_OS == FLEXT_OS_WIN
-// only Windows code is situated in this file
-
-#include "editorwin.hpp"
-
-#elif FLEXT_OS == FLEXT_OS_MAC
-
-#include "editormac.hpp"
-
-#else
-
-#error Platform not supported
-
-#endif
diff --git a/externals/grill/vst/src/editor.h b/externals/grill/vst/src/editor.h
deleted file mode 100644
index 7c5831e7..00000000
--- a/externals/grill/vst/src/editor.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#ifndef __EDITOR_H
-#define __EDITOR_H
-
-class VSTPlugin;
-
-void SetupEditor();
-void StartEditor(VSTPlugin *p);
-void StopEditor(VSTPlugin *p);
-void ShowEditor(VSTPlugin *p,bool show);
-void MoveEditor(VSTPlugin *p,int x,int y);
-void SizeEditor(VSTPlugin *p,int x,int y);
-void TitleEditor(VSTPlugin *p,const char *t);
-void CaptionEditor(VSTPlugin *p,bool c);
-void HandleEditor(VSTPlugin *p,bool h);
-void FrontEditor(VSTPlugin *p);
-
-#endif // __EDITOR_H
diff --git a/externals/grill/vst/src/editormac.hpp b/externals/grill/vst/src/editormac.hpp
deleted file mode 100644
index b519aa06..00000000
--- a/externals/grill/vst/src/editormac.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2004 Thomas Grill (xovo@gmx.net)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "Editor.h"
-#include "VstHost.h"
-#include <flext.h>
-
-
-#if FLEXT_OS == FLEXT_OS_MAC
-// only Mac OSX code is situated in this file
-
-void SetupEditor()
-{
-}
-
-void StartEditor(VSTPlugin *p)
-{
-}
-
-void StopEditor(VSTPlugin *p)
-{
-}
-
-void ShowEditor(VSTPlugin *p,bool show)
-{
-}
-
-void MoveEditor(VSTPlugin *p,int x,int y)
-{
-}
-
-void SizeEditor(VSTPlugin *p,int x,int y)
-{
-}
-
-void CaptionEditor(VSTPlugin *plug,bool c)
-{
-}
-
-void TitleEditor(VSTPlugin *p,const char *t)
-{
-}
-
-void HandleEditor(VSTPlugin *p,bool h)
-{
-}
-
-void FrontEditor(VSTPlugin *p)
-{
-}
-
-#endif // FLEXT_OS_MAC
diff --git a/externals/grill/vst/src/editorwin.hpp b/externals/grill/vst/src/editorwin.hpp
deleted file mode 100644
index 558301bc..00000000
--- a/externals/grill/vst/src/editorwin.hpp
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#if FLEXT_OS != FLEXT_OS_WIN
-// only Windows code is situated in this file
-#error Wrong implementation
-#endif
-
-#include <map>
-#include <windows.h>
-
-class ThrCmp
-{
-public:
- inline bool operator()(const flext::thrid_t &a,const flext::thrid_t &b) const
- {
- if(sizeof(a) == sizeof(size_t))
- return *(size_t *)&a < *(size_t *)&b;
- else
- return memcmp(&a,&b,sizeof(a)) < 0;
- }
-};
-
-typedef std::map<flext::thrid_t,VSTPlugin *,ThrCmp> WndMap;
-static WndMap wndmap;
-static flext::ThrMutex mapmutex;
-
-#define TIMER_INTERVAL 25
-#define WCLNAME "vst~-class"
-
-
-static LRESULT CALLBACK wndproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
-{
- mapmutex.Lock();
- VSTPlugin *plug = wndmap[flext::GetThreadId()];
- mapmutex.Unlock();
- FLEXT_ASSERT(plug != NULL);
-
- LRESULT res = 0;
-
- switch(msg) {
- case WM_CREATE:
- // Initialize the window.
- plug->StartEditing(hwnd);
- break;
-
- case WM_CLOSE:
-#ifdef FLEXT_LOGGING
- flext::post("WM_CLOSE");
-#endif
- plug->StopEditing();
-
- DestroyWindow(hwnd);
- break;
- case WM_DESTROY:
-#ifdef FLEXT_LOGGING
- flext::post("WM_DESTROY");
-#endif
- // stop editor thread
- PostQuitMessage(0);
- break;
-
- case WM_TIMER: // fall through
- case WM_ENTERIDLE:
- plug->EditorIdle();
- break;
-#if 0
- case WM_WINDOWPOSCHANGED: {
- // ignore after WM_CLOSE so that x,y positions are preserved
- if(!plug->IsEdited()) break;
-
- WINDOWPOS *w = (WINDOWPOS *)lp;
-
- WINDOWINFO winfo;
- winfo.cbSize = sizeof(winfo);
- GetWindowInfo(hwnd,&winfo);
- int cpx = winfo.rcWindow.left-winfo.rcClient.left;
- int cpy = winfo.rcWindow.top-winfo.rcClient.top;
- int csx = winfo.rcWindow.right-winfo.rcClient.right-cpx;
- int csy = winfo.rcWindow.bottom-winfo.rcClient.bottom-cpy;
- // send normalized coordinates to plugin
- plug->SetPos(w->x+cpx,w->y+cpy,false);
- plug->SetSize(w->cx+csx,w->cy+csy,false);
- return 0;
- }
-#else
- case WM_MOVE: {
- // ignore after WM_CLOSE so that x,y positions are preserved
- if(!plug->IsEdited()) break;
-
- WORD wx = LOWORD(lp),wy = HIWORD(lp);
- short x = reinterpret_cast<short &>(wx),y = reinterpret_cast<short &>(wy);
- // x and y are the coordinates of the client rect (= actual VST interface)
-
- WINDOWINFO winfo;
- winfo.cbSize = sizeof(winfo);
- GetWindowInfo(hwnd,&winfo);
- int px = winfo.rcWindow.left-winfo.rcClient.left;
- int py = winfo.rcWindow.top-winfo.rcClient.top;
- // send normalized coordinates to plugin
- plug->SetPos(x+px,y+py,false);
- break;
- }
-
- case WM_SIZE: {
- if(!plug->IsEdited()) break;
-
- WORD wx = LOWORD(lp),wy = HIWORD(lp);
- short x = reinterpret_cast<short &>(wx),y = reinterpret_cast<short &>(wy);
- // x and y are the coordinates of the client rect (= actual VST interface)
-
- WINDOWINFO winfo;
- winfo.cbSize = sizeof(winfo);
- GetWindowInfo(hwnd,&winfo);
- int px = winfo.rcWindow.left-winfo.rcClient.left;
- int py = winfo.rcWindow.top-winfo.rcClient.top;
- int sx = winfo.rcWindow.right-winfo.rcClient.right-px;
- int sy = winfo.rcWindow.bottom-winfo.rcClient.bottom-py;
- // send normalized coordinates to plugin
- plug->SetSize(x+sx,y+sy,false);
- break;
- }
-#endif
-
-#if 0 // NOT needed for Windows
- case WM_PAINT: {
- // Paint the window's client area.
- RECT rect;
- GetUpdateRect(hwnd,&rect,FALSE);
- ERect erect;
- erect.left = rect.left;
- erect.top = rect.top;
- erect.right = rect.right;
- erect.bottom = rect.bottom;
- plug->Paint(erect);
- break;
- }
-#endif
- case WM_SHOWWINDOW:
- plug->Visible(wp != FALSE,false);
- break;
-
- default:
- #ifdef FLEXT_LOGGING
-// flext::post("WND MSG %i, WP=%i, lp=%i",msg,wp,lp);
- #endif
-
- res = DefWindowProc(hwnd,msg,wp,lp);
- }
- return res;
-}
-
-static void windowsize(HWND wnd,int x,int y,int w,int h)
-{
- // pre correction
- WINDOWINFO winfo;
- winfo.cbSize = sizeof(winfo);
- GetWindowInfo(wnd,&winfo);
- int sx1 = (winfo.rcWindow.right-winfo.rcClient.right)-(winfo.rcWindow.left-winfo.rcClient.left);
- int sy1 = (winfo.rcWindow.bottom-winfo.rcClient.bottom)-(winfo.rcWindow.top-winfo.rcClient.top);
-
- // First reflect new state in flags
- SetWindowPos(wnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED);
-
- // post correction
- GetWindowInfo(wnd,&winfo);
- int sx2 = (winfo.rcWindow.right-winfo.rcClient.right)-(winfo.rcWindow.left-winfo.rcClient.left);
- int sy2 = (winfo.rcWindow.bottom-winfo.rcClient.bottom)-(winfo.rcWindow.top-winfo.rcClient.top);
-
- // set pos, size and flags
- SetWindowPos(wnd,NULL,x,y,w+sx2-sx1,h+sy2-sy1,SWP_NOZORDER);
-}
-
-static void threadfun(flext::thr_params *p)
-{
- flext::RelPriority(-2);
-
- VSTPlugin *plug = (VSTPlugin *)p;
- HINSTANCE hinstance = (HINSTANCE)GetModuleHandle(NULL);
- flext::thrid_t thrid = flext::GetThreadId();
-
- mapmutex.Lock();
- wndmap[thrid] = plug;
- mapmutex.Unlock();
-
- char tmp[256];
- sprintf(tmp,"vst~ - %s",plug->GetName());
-
- // Get size from plugin
- ERect r;
- plug->GetEditorRect(r);
-
- HWND wnd = CreateWindowEx(
- plug->GetHandle()?WS_EX_APPWINDOW:WS_EX_TOOLWINDOW,
- WCLNAME,tmp,
- WS_POPUP|WS_SYSMENU|WS_MINIMIZEBOX, // no border for the beginning to set proper coordinates
- plug->GetX(),plug->GetY(),r.right-r.left,r.bottom-r.top,
- NULL,NULL,
- hinstance,NULL
- );
-
- if(!wnd)
- FLEXT_LOG1("wnd == NULL: %i",GetLastError());
- else {
- // idle timer
- SetTimer(wnd,0,TIMER_INTERVAL,NULL);
-
- // set caption style
- CaptionEditor(plug,plug->GetCaption());
-
- if(plug->IsVisible()) {
- SetForegroundWindow(wnd);
- ShowWindow(wnd,1);
-
- // notify plugin
- // plug->Dispatch(effEditTop,0,0,0,0);
- }
- else
- ShowWindow(wnd,0);
-
- try
- {
-
- // Message loop
- MSG msg;
- BOOL bRet;
- while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) {
- if(bRet == -1) {
- // handle the error and possibly exit
- FLEXT_LOG1("GetMessage error: %i",GetLastError());
- }
- else {
- TranslateMessage(&msg);
-// double tm1 = flext::GetOSTime();
- DispatchMessage(&msg);
-// double tm2 = flext::GetOSTime();
-// if(tm2-tm1 > 0.01) FLEXT_LOG1("halt %lf",(tm2-tm1)*1000);
- }
- }
-
- }
-
- catch(exception &e) {
- flext::post("vst~ - exception caught, exiting: %s",e.what());
- }
- catch(...) {
- flext::post("vst~ - exception caught, exiting");
- }
-
- if(plug) plug->EditingEnded();
- }
-
- mapmutex.Lock();
- wndmap.erase(thrid);
- mapmutex.Unlock();
-}
-
-void SetupEditor()
-{
- HINSTANCE hinstance = (HINSTANCE)GetModuleHandle(NULL);
-
- // Fill in the window class structure with parameters that describe the main window.
- WNDCLASS wcx;
- wcx.style = CS_DBLCLKS; // | CS_HREDRAW | CS_VREDRAW; // redraw if size changes
- wcx.lpfnWndProc = wndproc; // points to window procedure
- wcx.cbClsExtra = 0; // no extra class memory
- wcx.cbWndExtra = 0; // no extra window memory
- wcx.hInstance = hinstance; // handle to instance
- wcx.hIcon = NULL; //LoadIcon(NULL, IDI_APPLICATION); // predefined app. icon
- wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow
- wcx.hbrBackground = NULL; //GetStockObject(WHITE_BRUSH); // white background brush
- wcx.lpszMenuName = NULL; // name of menu resource
- wcx.lpszClassName = WCLNAME; // name of window class
-
- ATOM at = RegisterClass(&wcx);
- FLEXT_ASSERT(at);
-}
-
-void StartEditor(VSTPlugin *p)
-{
-#ifdef FLEXT_LOGGING
- flext::post("Start editor 1");
-#endif
- flext::LaunchThread(threadfun,reinterpret_cast<flext::thr_params *>(p));
-#ifdef FLEXT_LOGGING
- flext::post("Start editor 2");
-#endif
-}
-
-void StopEditor(VSTPlugin *p)
-{
-#ifdef FLEXT_LOGGING
- flext::post("Stop editor 1");
-#endif
- PostMessage(p->EditorHandle(),WM_CLOSE,0,0);
-// flext::StopThread(threadfun,reinterpret_cast<flext::thr_params *>(p));
-#ifdef FLEXT_LOGGING
- flext::post("Stop editor 2");
-#endif
-}
-
-void ShowEditor(VSTPlugin *p,bool show)
-{
- ShowWindow(p->EditorHandle(),show);
-}
-
-void MoveEditor(VSTPlugin *p,int x,int y)
-{
- HWND wnd = p->EditorHandle();
- SetWindowPos(wnd,NULL,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER);
-}
-
-void SizeEditor(VSTPlugin *p,int x,int y)
-{
- HWND wnd = p->EditorHandle();
- SetWindowPos(wnd,NULL,0,0,x,y,SWP_NOMOVE|SWP_NOZORDER);
-}
-
-void FrontEditor(VSTPlugin *p)
-{
- SetForegroundWindow(p->EditorHandle());
-}
-
-void CaptionEditor(VSTPlugin *plug,bool c)
-{
- HWND wnd = plug->EditorHandle();
- LONG ns,style = GetWindowLong(wnd,GWL_STYLE);
- if(c) ns = style|WS_BORDER|WS_CAPTION;
- else ns = style&~(WS_BORDER|WS_CAPTION);
- if(ns != style) {
- SetWindowLong(wnd,GWL_STYLE,ns);
- windowsize(wnd,plug->GetX(),plug->GetY(),plug->GetW(),plug->GetH());
- }
-}
-
-void HandleEditor(VSTPlugin *plug,bool h)
-{
- HWND wnd = plug->EditorHandle();
- bool v = plug->IsVisible();
- if(v) ShowWindow(wnd,FALSE);
- SetWindowLong(wnd,GWL_EXSTYLE,h?WS_EX_APPWINDOW:WS_EX_TOOLWINDOW);
- if(v) ShowWindow(wnd,TRUE);
-}
-
-void TitleEditor(VSTPlugin *p,const char *t)
-{
- SetWindowText(p->EditorHandle(),t);
-}
-
-/*
-bool IsEditorShown(const VSTPlugin *p)
-{
- return IsWindowVisible(p->EditorHandle()) != FALSE;
-}
-*/ \ No newline at end of file
diff --git a/externals/grill/vst/src/main.cpp b/externals/grill/vst/src/main.cpp
deleted file mode 100644
index d0e5a6c0..00000000
--- a/externals/grill/vst/src/main.cpp
+++ /dev/null
@@ -1,980 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-// needed for CoInitializeEx
-#define _WIN32_DCOM
-
-#include "main.h"
-
-#include "editor.h"
-#include "vsthost.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <string>
-
-#if FLEXT_OS == FLEXT_OS_WIN
-#include <direct.h>
-#include <io.h>
-#include <objbase.h>
-#endif
-
-
-#define VST_VERSION "0.1.0pre26"
-
-
-class vst
- : public flext_dsp
- , public Responder
-{
- FLEXT_HEADER_S(vst,flext_dsp,Setup)
-
-public:
- vst(int argc,const t_atom *argv);
- ~vst();
-
-protected:
- virtual bool CbDsp();
- virtual void CbSignal();
-
- virtual void CbClick() { ms_edit(true); }
-
- bool ms_plug(int argc,const t_atom *argv);
- bool ms_plug(const AtomList &args) { return ms_plug(args.Count(),args.Atoms()); }
- void mg_plug(AtomList &sym) const { sym(1); SetString(sym[0],plugname.c_str()); }
-
- void ms_subplug(int argc,const t_atom *argv);
- void ms_subplug(const AtomList &args) { ms_subplug(args.Count(),args.Atoms()); }
- void mg_subplug(AtomList &sym) const { sym(1); SetString(sym[0],subplug.c_str()); }
-
- void m_pluglist() { if(plug) plug->ListPlugs(sym_pluglist); }
-
- void mg_editor(bool &ed) { ed = plug && plug->HasEditor(); }
-
- void ms_edit(bool on) { if(plug) plug->Edit(on); }
- void mg_edit(bool &ed) { ed = plug && plug->IsEdited(); }
- void ms_vis(bool vis) { if(plug) plug->Visible(vis); }
- void mg_vis(bool &vis) { vis = plug && plug->IsVisible(); }
-
- void mg_winx(int &x) const { x = plug?plug->GetX():0; }
- void mg_winy(int &y) const { y = plug?plug->GetY():0; }
- void mg_winw(int &x) const { x = plug?plug->GetW():0; }
- void mg_winh(int &y) const { y = plug?plug->GetH():0; }
- void ms_winx(int x) { if(plug) plug->SetX(x); }
- void ms_winy(int y) { if(plug) plug->SetY(y); }
- void ms_winw(int x) { if(plug) plug->SetW(x); }
- void ms_winh(int y) { if(plug) plug->SetH(y); }
- void ms_wincaption(bool c) { if(plug) plug->SetCaption(c); }
- void mg_wincaption(bool &c) const { c = plug && plug->GetCaption(); }
- void ms_winhandle(bool c) { if(plug) plug->SetHandle(c); }
- void mg_winhandle(bool &c) const { c = plug && plug->GetHandle(); }
- void ms_wintitle(const AtomList &t);
- void mg_wintitle(AtomList &t) const { if(plug) { t(1); SetString(t[0],plug->GetTitle()); } }
- void m_winfront() const { if(plug) plug->ToFront(); }
-
- void mg_chnsin(int &c) const { c = plug?plug->GetNumInputs():0; }
- void mg_chnsout(int &c) const { c = plug?plug->GetNumOutputs():0; }
- void mg_params(int &p) const { p = plug?plug->GetNumParams():0; }
- void mg_programs(int &p) const { p = plug?plug->GetNumPrograms():0; }
- void mg_progcats(int &p) const { p = plug?plug->GetNumCategories():0; }
- void mg_plugname(const t_symbol *&s) const { s = plug?MakeSymbol(plug->GetName()):sym__; }
- void mg_plugvendor(const t_symbol *&s) const { s = plug?MakeSymbol(plug->GetVendorName()):sym__; }
- void mg_plugdll(const t_symbol *&s) const { s = plug?MakeSymbol(plug->GetDllName()):sym__; }
- void mg_plugversion(int &v) const { v = plug?plug->GetVersion():0; }
- void mg_issynth(bool &s) const { s = plug && plug->IsSynth(); }
-
- void m_print(int ac,const t_atom *av);
-
- void ms_program(int p) { if(plug && p >= 0) plug->SetCurrentProgram(p); }
- void mg_program(int &p) const { p = plug?plug->GetCurrentProgram():0; }
- void mg_progname(int argc,const t_atom *argv) const;
-
- void m_pname(int pnum);
- void ms_paramnames(int cnt) { paramnames = cnt; if(plug) plug->ScanParams(cnt); }
-
- void ms_param(int pnum,float val);
- void ms_params(int argc,const t_atom *argv);
- void mg_param(int pnum);
- void mg_params(int argc,const t_atom *argv);
- void m_ptext(int pnum);
- void m_ptexts(int argc,const t_atom *argv);
-
- void mg_channel(int &chn) const { chn = plug?plug->GetChannel():0; }
- void ms_channel(int chn) { if(plug) plug->SetChannel(chn); }
-
- void m_note(int note,int vel);
- void m_noteoff(int note) { m_note(note,0); }
- void m_programchange(int ctrl_value) { if(plug) plug->AddProgramChange(ctrl_value); }
- void m_ctrlchange(int control,int ctrl_value) { if(plug) plug->AddControlChange(control,ctrl_value); }
- void m_aftertouch(int ctrl_value) { if(plug) plug->AddAftertouch(ctrl_value); }
- void m_polyaftertouch(int note,int ctrl_value) { if(plug) plug->AddPolyAftertouch(note,ctrl_value); }
- void m_pitchbend(int ctrl_value) { if(plug) plug->AddPitchBend(ctrl_value); }
-
- void mg_dumpevents(bool &ev) const { ev = plug?plug->GetEvents():false; }
- void ms_dumpevents(bool ev) { if(plug) plug->SetEvents(ev); }
-
- void mg_playing(bool &p) { p = plug && plug->GetPlaying(); }
- void ms_playing(bool p) { if(plug) plug->SetPlaying(p); }
- void mg_looping(bool &p) { p = plug && plug->GetLooping(); }
- void ms_looping(bool p) { if(plug) plug->SetLooping(p); }
- void mg_feedback(bool &p) { p = plug && plug->GetFeedback(); }
- void ms_feedback(bool p) { if(plug) plug->SetFeedback(p); }
- void mg_samplepos(float &p) { p = plug?(float)plug->GetSamplePos():0; }
- void ms_samplepos(float p) { if(plug) plug->SetSamplePos(p); }
- void mg_ppqpos(float &p) { p = plug?(float)plug->GetPPQPos():0; }
- void ms_ppqpos(float p) { if(plug) plug->SetPPQPos(p); }
- void mg_tempo(float &p) { p = plug?(float)plug->GetTempo():0; }
- void ms_tempo(float p) { if(plug) plug->SetTempo(p); }
- void mg_barstart(float &p) { p = plug?(float)plug->GetBarStart():0; }
- void ms_barstart(float p) { if(plug) plug->SetBarStart(p); }
- void mg_cyclestart(float &p) { p = plug?(float)plug->GetCycleStart():0; }
- void ms_cyclestart(float p) { if(plug) plug->SetCycleStart(p); }
- void mg_cycleend(float &p) { p = plug?(float)plug->GetCycleEnd():0; }
- void ms_cycleend(float p) { if(plug) plug->SetCycleEnd(p); }
- void mg_cyclelength(float &p) { p = plug?(float)(plug->GetCycleEnd()-plug->GetCycleStart()):0; }
- void ms_cyclelength(float p) { if(p) plug->SetCycleEnd(plug->GetCycleStart()+p); }
- void mg_timesignom(int &p) { p = plug?plug->GetTimesigNom():0; }
- void ms_timesignom(int p) { if(plug) plug->SetTimesigNom(p); }
- void mg_timesigden(int &p) { p = plug?plug->GetTimesigDen():0; }
- void ms_timesigden(int p) { if(plug) plug->SetTimesigDen(p); }
- void mg_smpteoffset(int &p) { p = plug?plug->GetSmpteOffset():0; }
- void ms_smpteoffset(int p) { if(plug) plug->SetSmpteOffset(p); }
- void mg_smpterate(int &p) { p = plug?plug->GetSmpteRate():0; }
- void ms_smpterate(int p) { if(plug) plug->SetSmpteRate(p); }
-
-private:
- void display_parameter(int param,bool showparams);
-
- VSTPlugin *plug;
- std::string plugname,subplug;
- bool visible,bypass,mute;
- int paramnames;
-
- int blsz;
- bool (VSTPlugin::*vstfun)(t_sample **insigs,t_sample **outsigs,long n);
- bool sigmatch;
- t_sample **vstin,**vstout,**tmpin,**tmpout;
-
- void InitPlug();
- void ClearPlug();
- bool LoadPlug();
- void InitPlugDSP();
- void InitBuf();
- void ClearBuf();
-
- static void Setup(t_classid);
-
- virtual void Respond(const t_symbol *sym,int argc = 0,const t_atom *argv = NULL);
-
- FLEXT_CALLBACK_V(m_print)
-
- FLEXT_CALLVAR_V(mg_plug,ms_plug)
- FLEXT_CALLVAR_V(mg_subplug,ms_subplug)
- FLEXT_CALLBACK(m_pluglist)
-
- FLEXT_CALLVAR_B(mg_edit,ms_edit)
- FLEXT_CALLGET_B(mg_editor)
- FLEXT_CALLVAR_B(mg_vis,ms_vis)
- FLEXT_ATTRVAR_B(bypass)
- FLEXT_ATTRVAR_B(mute)
-
- FLEXT_CALLVAR_I(mg_channel,ms_channel)
- FLEXT_CALLBACK_II(m_note)
- FLEXT_CALLBACK_I(m_noteoff)
- FLEXT_CALLBACK_II(m_ctrlchange)
- FLEXT_CALLBACK_I(m_aftertouch)
- FLEXT_CALLBACK_II(m_polyaftertouch)
- FLEXT_CALLBACK_I(m_pitchbend)
-
- FLEXT_CALLVAR_B(mg_dumpevents,ms_dumpevents)
-
- FLEXT_CALLBACK_I(m_programchange)
- FLEXT_CALLVAR_I(mg_program,ms_program)
- FLEXT_CALLBACK_V(mg_progname)
-
- FLEXT_CALLBACK_I(m_pname)
- FLEXT_ATTRGET_I(paramnames)
- FLEXT_CALLSET_I(ms_paramnames)
- FLEXT_CALLBACK_2(ms_param,int,float)
- FLEXT_CALLBACK_V(ms_params)
- FLEXT_CALLBACK_I(mg_param)
- FLEXT_CALLBACK_V(mg_params)
- FLEXT_CALLBACK_I(m_ptext)
- FLEXT_CALLBACK_V(m_ptexts)
-
- FLEXT_CALLVAR_I(mg_winx,ms_winx)
- FLEXT_CALLVAR_I(mg_winy,ms_winy)
- FLEXT_CALLVAR_I(mg_winw,ms_winw)
- FLEXT_CALLVAR_I(mg_winh,ms_winh)
- FLEXT_CALLVAR_B(mg_wincaption,ms_wincaption)
- FLEXT_CALLVAR_B(mg_winhandle,ms_winhandle)
- FLEXT_CALLVAR_V(mg_wintitle,ms_wintitle)
- FLEXT_CALLBACK(m_winfront)
-
- FLEXT_CALLGET_I(mg_chnsin)
- FLEXT_CALLGET_I(mg_chnsout)
- FLEXT_CALLGET_I(mg_params)
- FLEXT_CALLGET_I(mg_programs)
- FLEXT_CALLGET_I(mg_progcats)
- FLEXT_CALLGET_S(mg_plugname)
- FLEXT_CALLGET_S(mg_plugvendor)
- FLEXT_CALLGET_S(mg_plugdll)
- FLEXT_CALLGET_I(mg_plugversion)
- FLEXT_CALLGET_B(mg_issynth)
-
- FLEXT_CALLVAR_B(mg_playing,ms_playing)
- FLEXT_CALLVAR_B(mg_looping,ms_looping)
- FLEXT_CALLVAR_B(mg_feedback,ms_feedback)
- FLEXT_CALLVAR_F(mg_samplepos,ms_samplepos)
- FLEXT_CALLVAR_F(mg_ppqpos,ms_ppqpos)
- FLEXT_CALLVAR_F(mg_tempo,ms_tempo)
- FLEXT_CALLVAR_F(mg_barstart,ms_barstart)
- FLEXT_CALLVAR_F(mg_cyclestart,ms_cyclestart)
- FLEXT_CALLVAR_F(mg_cycleend,ms_cycleend)
- FLEXT_CALLVAR_F(mg_cyclelength,ms_cyclelength)
- FLEXT_CALLVAR_I(mg_timesignom,ms_timesignom)
- FLEXT_CALLVAR_I(mg_timesigden,ms_timesigden)
- FLEXT_CALLVAR_I(mg_smpteoffset,ms_smpteoffset)
- FLEXT_CALLVAR_I(mg_smpterate,ms_smpterate)
-
- static const t_symbol *sym_progname,*sym_pname,*sym_param,*sym_ptext,*sym_pluglist;
-};
-
-FLEXT_NEW_DSP_V("vst~",vst);
-
-
-const t_symbol *vst::sym_progname,*vst::sym_pname,*vst::sym_param,*vst::sym_ptext,*vst::sym_pluglist;
-
-void vst::Setup(t_classid c)
-{
- post("");
- post("vst~ %s - VST plugin object, (C)2003-05 Thomas Grill",VST_VERSION);
- post("based on the work of Jarno Seppänen and Mark Williamson");
- post("");
-
- FLEXT_CADDATTR_VAR(c,"plug",mg_plug,ms_plug);
- FLEXT_CADDATTR_VAR(c,"subplug",mg_subplug,ms_subplug);
- FLEXT_CADDMETHOD_(c,0,"getpluglist",m_pluglist);
- FLEXT_CADDATTR_VAR(c,"edit",mg_edit,ms_edit);
- FLEXT_CADDATTR_GET(c,"editor",mg_editor);
- FLEXT_CADDATTR_VAR(c,"vis",mg_vis,ms_vis);
- FLEXT_CADDATTR_VAR1(c,"bypass",bypass);
- FLEXT_CADDATTR_VAR1(c,"mute",mute);
- FLEXT_CADDMETHOD_(c,0,"print",m_print);
-
- FLEXT_CADDATTR_VAR(c,"channel",mg_channel,ms_channel);
- FLEXT_CADDMETHOD_I(c,0,"noteoff",m_noteoff);
- FLEXT_CADDMETHOD_II(c,0,"note",m_note);
- FLEXT_CADDMETHOD_II(c,0,"patouch",m_polyaftertouch);
- FLEXT_CADDMETHOD_II(c,0,"ctlchg",m_ctrlchange);
- FLEXT_CADDMETHOD_(c,0,"atouch",m_aftertouch);
- FLEXT_CADDMETHOD_(c,0,"pbend",m_pitchbend);
-
- FLEXT_CADDATTR_VAR(c,"events",mg_dumpevents,ms_dumpevents);
-
- FLEXT_CADDMETHOD_(c,0,"progchg",m_programchange);
- FLEXT_CADDATTR_VAR(c,"program",mg_program,ms_program);
- FLEXT_CADDMETHOD_(c,0,"getprogname",mg_progname);
-
- FLEXT_CADDMETHOD_I(c,0,"getpname",m_pname);
- FLEXT_CADDATTR_VAR(c,"pnames",paramnames,ms_paramnames);
- FLEXT_CADDMETHOD_2(c,0,"param",ms_param,int,float);
- FLEXT_CADDMETHOD_(c,0,"param",ms_params);
- FLEXT_CADDMETHOD_(c,0,"getparam",mg_param);
- FLEXT_CADDMETHOD_(c,0,"getparam",mg_params);
- FLEXT_CADDMETHOD_(c,0,"getptext",m_ptext);
- FLEXT_CADDMETHOD_(c,0,"getptext",m_ptexts);
-
- FLEXT_CADDATTR_VAR(c,"x",mg_winx,ms_winx);
- FLEXT_CADDATTR_VAR(c,"y",mg_winy,ms_winy);
- FLEXT_CADDATTR_VAR(c,"w",mg_winw,ms_winw);
- FLEXT_CADDATTR_VAR(c,"h",mg_winh,ms_winh);
- FLEXT_CADDATTR_VAR(c,"title",mg_wintitle,ms_wintitle);
- FLEXT_CADDATTR_VAR(c,"caption",mg_wincaption,ms_wincaption);
- FLEXT_CADDATTR_VAR(c,"handle",mg_winhandle,ms_winhandle);
- FLEXT_CADDMETHOD_(c,0,"front",m_winfront);
-
- FLEXT_CADDATTR_GET(c,"ins",mg_chnsin);
- FLEXT_CADDATTR_GET(c,"outs",mg_chnsout);
- FLEXT_CADDATTR_GET(c,"params",mg_params);
- FLEXT_CADDATTR_GET(c,"programs",mg_programs);
- FLEXT_CADDATTR_GET(c,"progcats",mg_progcats);
- FLEXT_CADDATTR_GET(c,"name",mg_plugname);
- FLEXT_CADDATTR_GET(c,"vendor",mg_plugvendor);
- FLEXT_CADDATTR_GET(c,"dll",mg_plugdll);
- FLEXT_CADDATTR_GET(c,"version",mg_plugversion);
- FLEXT_CADDATTR_GET(c,"synth",mg_issynth);
-
- FLEXT_CADDATTR_VAR(c,"playing",mg_playing,ms_playing);
- FLEXT_CADDATTR_VAR(c,"looping",mg_looping,ms_looping);
- FLEXT_CADDATTR_VAR(c,"feedback",mg_feedback,ms_feedback);
- FLEXT_CADDATTR_VAR(c,"samplepos",mg_samplepos,ms_samplepos);
- FLEXT_CADDATTR_VAR(c,"ppqpos",mg_ppqpos,ms_ppqpos);
- FLEXT_CADDATTR_VAR(c,"tempo",mg_tempo,ms_tempo);
- FLEXT_CADDATTR_VAR(c,"barstart",mg_barstart,ms_barstart);
- FLEXT_CADDATTR_VAR(c,"loopstart",mg_cyclestart,ms_cyclestart);
- FLEXT_CADDATTR_VAR(c,"loopend",mg_cycleend,ms_cycleend);
- FLEXT_CADDATTR_VAR(c,"looplength",mg_cyclelength,ms_cyclelength);
- FLEXT_CADDATTR_VAR(c,"timenom",mg_timesignom,ms_timesignom);
- FLEXT_CADDATTR_VAR(c,"timeden",mg_timesigden,ms_timesigden);
- FLEXT_CADDATTR_VAR(c,"smpteoffset",mg_smpteoffset,ms_smpteoffset);
- FLEXT_CADDATTR_VAR(c,"smpterate",mg_smpterate,ms_smpterate);
-
- sym_progname = MakeSymbol("progname");
- sym_pname = MakeSymbol("pname");
- sym_param = MakeSymbol("param");
- sym_ptext = MakeSymbol("ptext");
- sym_pluglist = MakeSymbol("pluglist");
-
- VSTPlugin::Setup();
- SetupEditor();
-}
-
-static int corefs = 0;
-
-vst::vst(int argc,const t_atom *argv):
- plug(NULL),visible(false),
- blsz(0),
- vstfun(NULL),vstin(NULL),vstout(NULL),tmpin(NULL),tmpout(NULL),
- bypass(false),mute(false),paramnames(0)
-{
-#if FLEXT_OS == FLEXT_OS_WIN
- // this is necessary for Waveshell
- if(!corefs++) CoInitializeEx(NULL,COINIT_MULTITHREADED+COINIT_SPEED_OVER_MEMORY);
-#endif
-
- int ins = 1,outs = 1;
- if(argc >= 1 && CanbeInt(argv[0])) { ins = GetAInt(argv[0]); argc--,argv++; }
- if(argc >= 1 && CanbeInt(argv[0])) { outs = GetAInt(argv[0]); argc--,argv++; }
-
- AddInSignal(ins);
- AddOutSignal(outs);
-
- if(argc >= 1 && !ms_plug(argc,argv)) InitProblem();
-}
-
-vst::~vst()
-{
- ClearPlug();
-#if FLEXT_OS == FLEXT_OS_WIN
- if(!--corefs) CoUninitialize();
-#endif
-}
-
-void vst::ClearPlug()
-{
- if(plug) {
- ClearBuf(); // needs valid plug
- VSTPlugin::Delete(plug);
- plug = NULL;
- }
-}
-
-void vst::InitPlug()
-{
- FLEXT_ASSERT(plug);
-
- vstfun = plug->IsReplacing()?&VSTPlugin::processReplacing:&VSTPlugin::process;
- sigmatch = plug->GetNumInputs() == CntInSig() && plug->GetNumOutputs() == CntOutSig();
- InitPlugDSP();
-
- InitBuf();
-
- plug->ScanParams(paramnames);
-}
-
-void vst::InitPlugDSP()
-{
- FLEXT_ASSERT(plug);
- // this might be invalid if DSP is switched off,
- // but the plug will get updated settings with m_dsp later
- plug->DspInit(Samplerate(),Blocksize());
-}
-
-void vst::ClearBuf()
-{
- if(!plug) return;
-
- if(vstin) {
- for(int i = 0; i < plug->GetNumInputs(); ++i) FreeAligned(vstin[i]);
- delete[] vstin; vstin = NULL;
- delete[] tmpin; tmpin = NULL;
- }
- if(vstout) {
- for(int i = 0; i < plug->GetNumOutputs(); ++i) FreeAligned(vstout[i]);
- delete[] vstout; vstout = NULL;
- delete[] tmpout; tmpout = NULL;
- }
-}
-
-void vst::InitBuf()
-{
- FLEXT_ASSERT(!vstin && !tmpin && !vstout && !tmpout);
- const int inputs = plug->GetNumInputs(),outputs = plug->GetNumOutputs();
-
- int i;
-
- vstin = new t_sample *[inputs];
- tmpin = new t_sample *[inputs];
- for(i = 0; i < inputs; ++i) vstin[i] = (t_sample *)NewAligned(Blocksize()*sizeof(t_sample));
-
- vstout = new t_sample *[outputs];
- tmpout = new t_sample *[outputs];
- for(i = 0; i < outputs; ++i) vstout[i] = (t_sample *)NewAligned(Blocksize()*sizeof(t_sample));
-}
-
-static std::string findFilePath(const std::string &path,const std::string &dllname)
-{
-#if FLEXT_OS == FLEXT_OS_WIN
- _chdir( path.c_str() );
- WIN32_FIND_DATA data;
- HANDLE fh = FindFirstFile(dllname.c_str(),&data);
- if(fh != INVALID_HANDLE_VALUE) {
- FindClose(fh);
- return path;
- }
-#endif
-/*
- CFileFind finder;
- if(finder.FindFile( dllname ))
- return path;
- else {
- finder.FindFile();
- while(finder.FindNextFile()) {
- if(finder.IsDirectory()) {
- if(!finder.IsDots()) {
- CString *npath = new CString( finder.GetFilePath());
- const C *ret = findFilePath( *npath , dllname );
- if(ret) {
- CString *retstr = new CString(ret);
- return *retstr;
- }
- }
- }
- }
- }
-*/
-
- return std::string();
-}
-
-// \todo this should be in the background, because it can take some time
-// ideally vst would get a response from VSTPlugin when readily loaded and
-// vst would dump out a respective signal to the patcher
-bool vst::LoadPlug()
-{
- if(plug) ClearPlug();
-
- VSTPlugin *p = VSTPlugin::New(this);
-
- // try loading the dll from the raw filename
- bool ok = p->Instance(plugname.c_str(),subplug.c_str());
- if(ok)
- FLEXT_LOG("raw filename loaded fine");
- else {
-#if FLEXT_SYS == FLEXT_SYS_PD
- // try finding it on the PD path
- char *name,dir[1024];
- int fd = open_via_path("",plugname.c_str(),".dll",dir,&name,sizeof(dir)-1,0);
- if(fd > 0) close(fd);
- else name = NULL;
-
- if(name) {
- FLEXT_LOG("found VST dll on the PD path");
- // if dir is current working directory... name points to dir
- if(dir == name) strcpy(dir,".");
-
- std::string dllname(dir);
- dllname += "\\";
- dllname += name;
-
- ok = p->Instance(dllname.c_str());
- }
-#endif
- }
-
- if(!ok) {
- // try finding it on the VST path
- char *vst_path = getenv("VST_PATH");
-
- std::string dllname(plugname);
- if(dllname.find(".dll") == -1) dllname += ".dll";
-
- if(vst_path) {
- FLEXT_LOG("found VST_PATH env variable");
- char* tok_path = new char[strlen( vst_path)+1];
- strcpy( tok_path , vst_path);
- char *tok = strtok( tok_path , ";" );
- while( tok != NULL ) {
- std::string abpath( tok );
- if( abpath[abpath.length()-1] != '\\' ) abpath += "\\";
-
- FLEXT_LOG1("trying VST_PATH %s",(const char *)abpath.c_str());
-
- std::string realpath = findFilePath( abpath , dllname );
- //post( "findFilePath( %s , %s ) = %s\n" , abpath , dllname , realpath );
- if ( realpath.length() ) {
- realpath += plugname;
- FLEXT_LOG1("trying %s",(const char *)realpath.c_str());
-
- ok = p->Instance(realpath.c_str());
- if(ok) {
- FLEXT_LOG("plugin loaded via VST_PATH");
- break;
- }
- }
-
- tok = strtok( NULL , ";" );
-// if(!tok) post("%s - couldn't find plugin",thisName());
- }
-
- delete[] tok_path;
- }
- }
-
- if(!ok) {
- post("%s - unable to load plugin '%s'",thisName(),plugname.c_str());
- VSTPlugin::Delete(p);
- }
- else {
- plug = p;
- InitPlug();
- }
-
- return ok;
-}
-
-static char *stripesc(char *buf)
-{
-#if FLEXT_SYS == FLEXT_SYS_PD
- // strip char escapes (only in newer/devel PD version)
- char *cs = buf,*cd = cs;
- while(*cs) {
- if(*cs != '\\') *(cd++) = *cs;
- ++cs;
- }
- *cd = 0;
-#endif
- return buf;
-}
-
-bool vst::ms_plug(int argc,const t_atom *argv)
-{
- ClearPlug();
-
- plugname.clear();
- char buf[255];
- for(int i = 0; i < argc; i++) {
- if(i > 0) plugname += ' ';
- GetAString(argv[i],buf,sizeof buf);
-#if FLEXT_OS == FLEXT_OS_WIN
- strlwr(buf);
-#endif
- plugname += stripesc(buf);
- }
-
- if(!plugname.length())
- return false;
- else
- return LoadPlug();
-}
-
-void vst::ms_subplug(int argc,const t_atom *argv)
-{
- subplug.clear();
- char buf[255];
- for(int i = 0; i < argc; i++) {
- if(i > 0) subplug += ' ';
- GetAString(argv[i],buf,sizeof buf);
- subplug += stripesc(buf);
- }
-
- LoadPlug();
-}
-
-bool vst::CbDsp()
-{
- if(plug) {
- FLEXT_ASSERT(vstfun);
-
- InitPlugDSP();
-
- if(blsz != Blocksize()) {
- blsz = Blocksize();
- ClearBuf();
- InitBuf();
- }
- }
- return true;
-}
-
-void vst::CbSignal()
-{
- if(!plug || !plug->UniqueID() || mute)
- flext_dsp::CbSignal();
- else if(bypass) {
- const int n = Blocksize();
- t_sample *const *insigs = InSig();
- t_sample *const *outsigs = OutSig();
-
- // copy as many channels as possible and zero dangling ones
-
- int i,mx = CntInSig();
- if(mx > CntOutSig()) mx = CntOutSig();
- if(mx == 1) {
- CopySamples(outsigs[0],insigs[0],n);
- i = 1;
- }
- else if(mx == 2) {
- t_sample *o1 = outsigs[0],*o2 = outsigs[1];
- const t_sample *i1 = insigs[0],*i2 = insigs[1];
- for(int s = 0; s < n; ++s) {
- const t_sample f = *(i1++);
- *(o2++) = *(i2++);
- *(o1++) = f;
- }
- i = 2;
- }
- else
- for(i = 0; i < mx; ++i) {
- // must copy via temporary buffer as ordering of output signals can collide with input signals
- CopySamples(tmpin[i],insigs[i],n);
- CopySamples(outsigs[i],tmpin[i],n);
- }
-
- for(; i < CntOutSig(); ++i)
- ZeroSamples(outsigs[i],n);
- }
- else if(sigmatch) {
- if(!(plug->*vstfun)(const_cast<t_sample **>(InSig()),const_cast<t_sample **>(OutSig()),Blocksize())) {
- for(int i = 0; i < CntOutSig(); ++i)
- ZeroSamples(OutSig()[i],Blocksize());
- }
- }
- else {
- const int inputs = plug->GetNumInputs(),outputs = plug->GetNumOutputs();
- const int cntin = CntInSig(),cntout = CntOutSig();
- const int n = Blocksize();
- t_sample *const *insigs = InSig();
- t_sample *const *outsigs = OutSig();
- t_sample **inv,**outv;
-
- if(inputs <= cntin)
- inv = const_cast<t_sample **>(insigs);
- else { // more plug inputs than inlets
- int i;
- for(i = 0; i < cntin; ++i) tmpin[i] = const_cast<t_sample *>(insigs[i]);
-
- // set dangling inputs to zero
- // according to mode... (e.g. set zero)
- for(; i < inputs; ++i) ZeroSamples(tmpin[i] = vstin[i],n);
-
- inv = tmpin;
- }
-
- const bool more = outputs <= cntout;
- if(more) // more outlets than plug outputs
- outv = const_cast<t_sample **>(outsigs);
- else {
- int i;
- for(i = 0; i < cntout; ++i) tmpout[i] = outsigs[i];
- for(; i < outputs; ++i) tmpout[i] = vstout[i];
-
- outv = tmpout;
- }
-
- // call plugin DSP function
- if(!(plug->*vstfun)(inv,outv,n)) {
- for(int i = 0; i < outputs; ++i)
- ZeroSamples(outsigs[i],n);
- }
-
- if(more) {
- // according to mode set dangling output vectors
-
- // currently simply clear them....
- for(int i = outputs; i < cntout; ++i)
- ZeroSamples(outsigs[i],n);
- }
- }
-}
-
-void vst::mg_progname(int argc,const t_atom *argv) const
-{
- if(plug) {
- int cat,pnum;
- if(argc == 1 && CanbeInt(argv[0])) {
- cat = -1,pnum = GetAInt(argv[0]);
- }
- else if(argc == 2 && CanbeInt(argv[0]) && CanbeInt(argv[1])) {
- cat = GetAInt(argv[0]),pnum = GetAInt(argv[1]);
- }
- else pnum = -1;
-
- if(pnum >= 0) {
- char str[256];
- plug->GetProgramName(cat,pnum,str);
-
- t_atom at[3];
- SetInt(at[0],cat);
- SetInt(at[1],pnum);
- SetString(at[2],str);
- ToOutAnything(GetOutAttr(),sym_progname,3,at);
- }
- else
- post("%s - Syntax: %s [category] program",thisName(),GetString(thisTag()));
- }
-}
-
-void vst::ms_wintitle(const AtomList &t)
-{
- if(plug) {
- char txt[256];
- t.Print(txt,sizeof txt);
- plug->SetTitle(txt);
- }
-}
-
- /**
- * display the parameters names and values and some other bits and pieces that
- * may be of use
- */
-
-void vst::m_print(int ac,const t_atom *av)
-{
- if(!plug) return;
-
- int i;
- bool params = false;
- bool header = true;
- bool programs = false;
- bool parameters = true;
- int specific = -1;
- if( ac > 0 ) {
- for( i = 0 ; i < ac ; i++) {
- if(IsString(av[i])) {
- const char *buf = GetString(av[i]);
- if ( strcmp( buf , "-params" ) == 0 ) {
- params = true;
- }
- else if ( strcmp( buf , "-noheader" ) == 0 ) {
- header = false;
- }
- else if ( strcmp( buf , "-programs" ) == 0 ) {
- programs = true;
- parameters = false;
- }
- else if ( strcmp( buf , "-parameters" ) == 0 ) {
- parameters = false;
- }
- else if ( strcmp( buf , "-help" ) == 0 ) {
- post("print options:");
- post("-help \t\tprint this");
- post("-programs \tshow the programs");
- post("-parameters \tshow the parameters");
- post("-params \tshow the parameter display values");
- post("-noheader \tdo not display the header");
- return;
- }
- }
- else if(CanbeInt(av[i])) {
- int p = GetAInt(av[i]);
- if (( p > 0 ) && ( p <= plug->GetNumParams())) {
- specific = p - 1;
- }
- }
- }
- }
-
- if ( header ) {
- post("VST~ plugin: %s ", plug->GetName() );
- post("made by: %s ", plug->GetVendorName() );
- post("parameters %d\naudio: %d in(s)/%d out(s) \nLoaded from library \"%s\".\n",
- plug->GetNumParams(),
- CntInSig(),
- CntOutSig(),
- plug->GetDllName());
-
- post("Flags");
- if ( plug->HasEditor() ) post("Has editor");
- if ( plug->IsReplacing() ) post("Can do replacing");
- }
-
- if ( parameters ) {
- if ( specific == -1) {
- for (i = 0; i < plug->GetNumParams(); i++)
- display_parameter( i , params );
- }
- else
- display_parameter( specific , params);
- }
-
- if( programs ) {
- for( int j = 0; j < plug->GetNumCategories() ; j++ ) {
- for( i = 0 ; i < plug->GetNumParams() ; i++ ) {
- char buf[64];
- plug->GetProgramName( j , i , buf );
- post("Program %d: %s ", i , buf );
- }
- }
- }
-}
-
-
-void vst::display_parameter(int param,bool showparams)
-{
- int j = param;
- /* the Steinberg(tm) way... */
- char name[109];
- char display[164];
- float val;
-
-// if(j == 0) post ("Control input/output(s):");
-
- memset (name, 0, sizeof(name));
- memset( display, 0 ,sizeof(display));
- plug->GetParamName( j , name );
-
- if(*name) {
- if (showparams) {
-// plug->DescribeValue( j , display );
- plug->GetParamValue(j,display);
- val = plug->GetParamValue( j );
- post ("parameter[#%d], \"%s\" value=%f (%s) ", j, name, val,display);
- }
- else {
- val = plug->GetParamValue( j );
- post ("parameter[#%d], \"%s\" value=%f ", j, name, val);
- }
- }
-}
-
-void vst::m_pname(int pnum)
-{
- if(!plug || pnum < 0 || pnum >= plug->GetNumParams()) return;
-
- char name[256]; // how many chars needed?
- plug->GetParamName(pnum,name);
-
- t_atom at[2];
- SetInt(at[0],pnum);
- SetString(at[1],name);
- ToOutAnything(GetOutAttr(),sym_pname,2,at);
-}
-
-// set the value of a parameter
-void vst::ms_param(int pnum,float val)
-{
- if(!plug || pnum < 0 || pnum >= plug->GetNumParams()) return;
-
-// float xval = plug->GetParamValue( pnum );
-// if(xval <= 1.0f) // What's that????
- if(true)
- {
- plug->SetParamFloat( pnum, val );
-// if(echoparam) display_parameter(pnum , true );
- }
- else
- FLEXT_ASSERT(false);
-}
-
-void vst::ms_params(int argc,const t_atom *argv)
-{
- if(plug) {
- char str[255]; *str = 0;
- if(argc && CanbeFloat(argv[argc-1]))
- PrintList(argc-1,argv,str,sizeof str);
-
- if(*str) {
- int ix = plug->GetParamIx(str);
- if(ix >= 0)
- ms_param(ix,GetAFloat(argv[argc-1]));
- else
- post("%s %s - Parameter not found",thisName(),GetString(thisTag()),str);
- }
- else
- post("%s - Syntax: %s name value",thisName(),GetString(thisTag()));
- }
-}
-
-void vst::mg_param(int pnum)
-{
- if(!plug || pnum < 0 || pnum >= plug->GetNumParams()) return;
-
- t_atom at[2];
- SetInt(at[0],pnum);
- SetFloat(at[1],plug->GetParamValue(pnum));
- ToOutAnything(GetOutAttr(),sym_param,2,at);
-}
-
-void vst::mg_params(int argc,const t_atom *argv)
-{
- if(plug) {
- char str[255];
- PrintList(argc,argv,str,sizeof str);
-
- if(*str) {
- int ix = plug->GetParamIx(str);
- if(ix >= 0)
- mg_param(ix);
- else
- post("%s %s - Parameter not found",thisName(),GetString(thisTag()),str);
- }
- else
- post("%s - Syntax: %s name value",thisName(),GetString(thisTag()));
- }
-}
-
-void vst::m_ptext(int pnum)
-{
- if(!plug || pnum < 0 || pnum >= plug->GetNumParams()) return;
-
- char display[256]; // how many chars needed?
- memset(display,0,sizeof(display));
- plug->GetParamValue(pnum,display);
-
- t_atom at[2];
- SetInt(at[0],pnum);
- SetString(at[1],display);
- ToOutAnything(GetOutAttr(),sym_ptext,2,at);
-}
-
-void vst::m_ptexts(int argc,const t_atom *argv)
-{
- if(plug) {
- char str[255];
- PrintList(argc,argv,str,sizeof str);
-
- if(*str) {
- int ix = plug->GetParamIx(str);
- if(ix >= 0)
- m_ptext(ix);
- else
- post("%s %s - Parameter not found",thisName(),GetString(thisTag()),str);
- }
- else
- post("%s - Syntax: %s name value",thisName(),GetString(thisTag()));
- }
-}
-
-void vst::m_note(int note,int velocity)
-{
- if(!plug) return;
-
- if(velocity > 0)
- plug->AddNoteOn(note,velocity);
- else
- plug->AddNoteOff(note);
-}
-
-void vst::Respond(const t_symbol *sym,int argc,const t_atom *argv)
-{
- FLEXT_ASSERT(sym);
- ToOutAnything(GetOutAttr(),sym,argc,argv);
-}
diff --git a/externals/grill/vst/src/main.h b/externals/grill/vst/src/main.h
deleted file mode 100644
index c395b63b..00000000
--- a/externals/grill/vst/src/main.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#ifndef __VST_H
-#define __VST_H
-
-#define FLEXT_ATTRIBUTES 1
-
-#include <flext.h>
-
-#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 500)
-#error You need at least flext version 0.5.0
-#endif
-
-#if FLEXT_OS == FLEXT_OS_WIN || FLEXT_OS == FLEXT_OS_MAC
-//
-#else
-#error Platform not supported!
-#endif
-
-#endif
-
diff --git a/externals/grill/vst/src/vst.rc b/externals/grill/vst/src/vst.rc
deleted file mode 100644
index 8f8e368b..00000000
--- a/externals/grill/vst/src/vst.rc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// Englisch (USA) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904b0"
- BEGIN
- VALUE "FileDescription", "vst~ external"
- VALUE "FileVersion", "0,1, 0, 8"
- VALUE "InternalName", "vst~"
- VALUE "LegalCopyright", "Copyright (C) 2003-2005 Thomas Grill"
- VALUE "OriginalFilename", "vst~.DLL"
- VALUE "ProductName", "VST plugin object"
- VALUE "ProductVersion", "0, 1, 0, 8"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1200
- END
-END
-
-#endif // Englisch (USA) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-/////////////////////////////////////////////////////////////////////////////
-// Deutsch (Österreich) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEA)
-#ifdef _WIN32
-LANGUAGE LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
- "#define _AFX_NO_OLE_RESOURCES\r\n"
- "#define _AFX_NO_TRACKER_RESOURCES\r\n"
- "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
- "\r\n"
- "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
- "#ifdef _WIN32\r\n"
- "LANGUAGE 9, 1\r\n"
- "#pragma code_page(1252)\r\n"
- "#endif //_WIN32\r\n"
- "#include ""afxres.rc"" // Standard components\r\n"
- "#endif\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-#endif // Deutsch (Österreich) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-#define _AFX_NO_SPLITTER_RESOURCES
-#define _AFX_NO_OLE_RESOURCES
-#define _AFX_NO_TRACKER_RESOURCES
-#define _AFX_NO_PROPERTY_RESOURCES
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE 9, 1
-#pragma code_page(1252)
-#endif //_WIN32
-#include "afxres.rc" // Standard components
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/externals/grill/vst/src/vstedit.cpp b/externals/grill/vst/src/vstedit.cpp
deleted file mode 100644
index 1536b9d3..00000000
--- a/externals/grill/vst/src/vstedit.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "vsthost.h"
-#include "editor.h"
-
-
-void VSTPlugin::Edit(bool open)
-{
- if(Is()) {
- if(open) {
- if(HasEditor() && !IsEdited())
- StartEditor(this);
- }
- else if(IsEdited())
- StopEditor(this);
- }
-}
-
-void VSTPlugin::StartEditing(WHandle h)
-{
- FLEXT_ASSERT(h != NULL);
- Dispatch(effEditOpen,0,0,hwnd = h);
-
- TitleEditor(this,title.c_str());
-}
-
-void VSTPlugin::StopEditing()
-{
- if(Is() && IsEdited())
- Dispatch(effEditClose);
-}
-
-void VSTPlugin::Visible(bool vis,bool upd)
-{
- visible = vis;
- if(upd && Is() && IsEdited()) ShowEditor(this,vis);
-}
-
-void VSTPlugin::SetPos(int x,int y,bool upd)
-{
- posx = x; posy = y;
- if(upd && Is() && IsEdited()) MoveEditor(this,posx,posy);
-}
-
-void VSTPlugin::SetSize(int x,int y,bool upd)
-{
- sizex = x; sizey = y;
- if(upd && Is() && IsEdited()) SizeEditor(this,sizex,sizey);
-}
-
-void VSTPlugin::SetCaption(bool c)
-{
- caption = c;
- if(Is() && IsEdited()) CaptionEditor(this,c);
-}
-
-void VSTPlugin::SetHandle(bool h)
-{
- handle = h;
- if(Is() && IsEdited()) HandleEditor(this,h);
-}
-
-void VSTPlugin::SetTitle(const char *t)
-{
- title = t;
- if(Is() && IsEdited()) TitleEditor(this,t);
-}
-
-void VSTPlugin::ToFront()
-{
- if(Is() && IsEdited()) {
- FrontEditor(this);
- Dispatch(effEditTop,0,0,vendorname);
- }
-}
diff --git a/externals/grill/vst/src/vsthost.cpp b/externals/grill/vst/src/vsthost.cpp
deleted file mode 100644
index 3fd1a935..00000000
--- a/externals/grill/vst/src/vsthost.cpp
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "vsthost.h"
-#include "editor.h"
-#include <exception>
-#include "flcontainers.h"
-
-const t_symbol
- *VSTPlugin::sym_param,
- *VSTPlugin::sym_event,
- *VSTPlugin::sym_evmidi,
- *VSTPlugin::sym_evaudio,
- *VSTPlugin::sym_evvideo,
- *VSTPlugin::sym_evparam,
- *VSTPlugin::sym_evtrigger,
- *VSTPlugin::sym_evsysex,
- *VSTPlugin::sym_ev_,
- *VSTPlugin::sym_midi[8];
-
-
-class DelPlugin
- : public Fifo::Cell
-{
-public:
- DelPlugin(VSTPlugin *p): plug(p) {}
- VSTPlugin *plug;
-};
-
-static TypedLifo<DelPlugin> todel;
-flext::ThrCond VSTPlugin::thrcond;
-
-void VSTPlugin::Setup()
-{
- LaunchThread(worker);
-
- sym_param = flext::MakeSymbol("param");
- sym_event = flext::MakeSymbol("event");
- sym_evmidi = flext::MakeSymbol("midi");
- sym_evaudio = flext::MakeSymbol("audio");
- sym_evvideo = flext::MakeSymbol("video");
- sym_evparam = flext::MakeSymbol("param");
- sym_evtrigger = flext::MakeSymbol("trigger");
- sym_evsysex = flext::MakeSymbol("sysex");
- sym_ev_ = flext::MakeSymbol("???");
-
- sym_midi[0] = flext::MakeSymbol("noteoff");
- sym_midi[1] = flext::MakeSymbol("note");
- sym_midi[2] = flext::MakeSymbol("atouch");
- sym_midi[3] = flext::MakeSymbol("ctlchg");
- sym_midi[4] = flext::MakeSymbol("progchg");
- sym_midi[5] = flext::MakeSymbol("atouch");
- sym_midi[6] = flext::MakeSymbol("pbend");
- sym_midi[7] = flext::MakeSymbol("sysex");
-}
-
-VSTPlugin::VSTPlugin(Responder *resp)
- : effect(NULL),pluginmain(NULL),audiomaster(NULL)
-#if FLEXT_OS == FLEXT_OS_WIN
- , hdll(NULL)
-#endif
- , hwnd(NULL)
- , responder(resp)
- , posx(0),posy(0),sizex(0),sizey(0)
- , visible(true),caption(true),handle(false)
- , midichannel(0),eventqusz(0),dumpevents(false)
- , paramnamecnt(0)
- , transchg(true)
- , playing(false),looping(false),feedback(false)
- , samplerate(0)
- , samplepos(0),ppqpos(0)
- , tempo(120)
- , timesignom(4),timesigden(4)
- , barstartpos(0)
- , cyclestartpos(0),cycleendpos(0)
- , smpteoffset(0),smpterate(0)
-{}
-
-VSTPlugin::~VSTPlugin()
-{
- Free();
-}
-
-VSTPlugin *VSTPlugin::New(Responder *resp)
-{
- FLEXT_ASSERT(resp);
- return new VSTPlugin(resp);
-}
-
-void VSTPlugin::Delete(VSTPlugin *p)
-{
- FLEXT_ASSERT(p);
-
- // tell plugin to close editor!
- StopEditor(p);
- // transfer to deletion thread
- todel.Push(new DelPlugin(p));
- thrcond.Signal();
-}
-
-void VSTPlugin::worker(thr_params *)
-{
- TypedLifo<DelPlugin> tmp;
- bool again = false;
- for(;;) {
- // wait for signal
- if(again) {
- thrcond.TimedWait(0.01);
- again = false;
- }
- else
- thrcond.Wait();
-
- DelPlugin *p;
- while((p = todel.Pop()) != NULL) {
- // see if editing has stopped
- if(p && p->plug->hwnd == NULL) {
- // yes, it is now safe to delete the plug
- post("DELETE %s",p->plug->dllname.c_str());
- delete p->plug;
- delete p;
- }
- else {
- tmp.Push(p);
- again = true;
- }
- }
-
- // put back remaining entries
- while((p = tmp.Pop()) != NULL) todel.Push(p);
- }
-}
-
-#if FLEXT_OS == FLEXT_OS_MAC
-OSStatus FSPathMakeFSSpec(const UInt8 *path,FSSpec *spec,Boolean *isDirectory) /* can be NULL */
-{
- OSStatus result;
- FSRef ref;
-
- /* check parameters */
- require_action(NULL != spec, BadParameter, result = paramErr);
-
- /* convert the POSIX path to an FSRef */
- result = FSPathMakeRef(path, &ref, isDirectory);
- require_noerr(result, FSPathMakeRef);
-
- /* and then convert the FSRef to an FSSpec */
- result = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL);
- require_noerr(result, FSGetCatalogInfo);
-
-FSGetCatalogInfo:
-FSPathMakeRef:
-BadParameter:
- return result;
-}
-#endif
-
-// hdll, pluginmain and audiomaster are set here
-// must be NULL beforehand!
-bool VSTPlugin::NewPlugin(const char *plugname)
-{
- FLEXT_ASSERT(!pluginmain && !audiomaster);
-
- dllname = plugname;
-
-#if FLEXT_OS == FLEXT_OS_WIN
- hdll = LoadLibraryEx(dllname.c_str(),NULL,0 /*DONT_RESOLVE_DLL_REFERENCES*/);
-/*
- char buf[255],*c;
- strcpy(buf,dllname.c_str());
- for(c = buf; *c; ++c)
- if(*c == '/')
- *c = '\\';
- char *sl = strrchr(buf,'\\');
- if(sl) *sl = 0;
- SetCurrentDirectory(buf);
- hdll = LoadLibrary(dllname.c_str());
-*/
- if(hdll) pluginmain = (PVSTMAIN)GetProcAddress(hdll,"main");
- audiomaster = Master;
-
-#elif FLEXT_OS == FLEXT_OS_MAC
- short resFileID;
- FSSpec spec;
- OSErr err;
-
- err = FSPathMakeFSSpec(dllname.c_str(),&spec,NULL);
- resFileID = FSpOpenResFile(&spec, fsRdPerm);
- short cResCB = Count1Resources('aEff');
-
- for(int i = 0; i < cResCB; i++) {
- Handle codeH;
- CFragConnectionID connID;
- Ptr mainAddr;
- Str255 errName;
- Str255 fragName;
- char fragNameCStr[256];
- short resID;
- OSType resType;
-
- codeH = Get1IndResource('aEff', short(i+1));
- if(!codeH) continue;
-
- GetResInfo(codeH, &resID, &resType, fragName);
- DetachResource(codeH);
- HLock(codeH);
-
- err = GetMemFragment(*codeH,
- GetHandleSize(codeH),
- fragName,
- kPrivateCFragCopy,
- &connID, (Ptr *) & mainAddr, errName);
-
- if(!err) {
- #ifdef __CFM__
- pluginmain = (PVSTMAIN)NewMachOFromCFM(mainAddr);
- #else
- pluginmain = (PVSTMAIN)mainAddr;
- #endif
- }
- }
- CloseResFile(resFileID);
-
- audiomaster =
-#ifdef __CFM__
- NewCFMFromMachO(Master);
-#else
- Master;
-#endif
-
-#else
-#error Platform not supported
-#endif
-
- if(pluginmain && audiomaster)
- return true;
- else {
- FreePlugin();
- return false;
- }
-}
-
-void VSTPlugin::FreePlugin()
-{
-#if FLEXT_OS == FLEXT_OS_WIN
- if(hdll) { FreeLibrary(hdll); hdll = NULL; }
-#elif FLEXT_OS == FLEXT_OS_MAC
-
-#ifdef __MACOSX__
-#ifdef __CFM__
- if(audiomaster) DisposeCFMFromMachO(audiomaster);
- if(pluginmain) DisposeMachOFromCFM(pluginmain);
-#endif
-#endif
-
-#else
-#error Platform not supported
-#endif
-
- effect = NULL;
- audiomaster = NULL;
- pluginmain = NULL;
-}
-
-/*
-This is static to be able to communicate between the plugin methods
-and the static Audiomaster function
-the this (plugin->user) pointer has not been initialized at the point it is needed
-static should not be a problem, as we are single-threaded and it is immediately
-queried in a called function
-*/
-long VSTPlugin::uniqueid = 0;
-
-std::string VSTPlugin::dllloading;
-
-bool VSTPlugin::InstPlugin(long plugid)
-{
- uniqueid = plugid;
- dllloading = dllname;
-
- FLEXT_ASSERT(pluginmain && audiomaster);
-
- //This calls the "main" function and receives the pointer to the AEffect structure.
- try { effect = pluginmain(audiomaster); }
- catch(std::exception &e) {
- flext::post("vst~ - caught exception while instantiating plugin: %s",e.what());
- }
- catch(...) {
- flext::post("vst~ - caught exception while instantiating plugin");
- }
-
- if(!effect)
- return false;
- else if(effect->magic != kEffectMagic) {
- effect = NULL;
- return false;
- }
- return true;
-}
-
-bool VSTPlugin::Instance(const char *name,const char *subname)
-{
- bool ok = false;
- FLEXT_ASSERT(effect == NULL);
-
- try {
-
-/*
- if(!ok && dllname != name) {
- FreePlugin();
- // freshly load plugin
- ok = NewPlugin(name) && InstPlugin();
- }
-*/
- ok = NewPlugin(name) && InstPlugin();
-
- if(ok && subname && *subname && Dispatch(effGetPlugCategory) == kPlugCategShell) {
- // sub plugin-name given -> scan plugs
-
- long plugid;
- char tmp[64];
-
- // Waves5 continues with the next plug after the last loaded
- // that's not what we want - workaround: swallow all remaining
- while((plugid = Dispatch(effShellGetNextPlugin,0,0,tmp))) {}
-
- // restart from the beginning
- while((plugid = Dispatch(effShellGetNextPlugin,0,0,tmp))) {
- // subplug needs a name
- FLEXT_LOG1("subplug %s",tmp);
- if(!strcmp(subname,tmp))
- // found
- break;
- }
-
- // re-init with plugid set
- if(plugid) ok = InstPlugin(plugid);
- }
-
- if(ok) {
- //init plugin
- effect->user = this;
- ok = Dispatch(effOpen) == 0;
- }
-
- if(ok) {
- ok = Dispatch(effIdentify) == 'NvEf';
- }
-
- if(ok) {
- *productname = 0;
- long ret = Dispatch(effGetProductString,0,0,productname);
-
- if(!*productname) {
- // no product name given by plugin -> extract it from the filename
-
- std::string str1(dllname);
- std::string::size_type slpos = str1.rfind('\\');
- if(slpos == std::string::npos) {
- slpos = str1.rfind('/');
- if(slpos == std::string::npos)
- slpos = 0;
- else
- ++slpos;
- }
- else
- ++slpos;
- std::string str2 = str1.substr(slpos);
- int snip = str2.find('.');
- if( snip != std::string::npos )
- str1 = str2.substr(0,snip);
- else
- str1 = str2;
- strcpy(productname,str1.c_str());
- }
-
- if(*productname) {
- char tmp[512];
- sprintf(tmp,"vst~ - %s",productname);
- title = tmp;
- }
- else
- title = "vst~";
-
- *vendorname = 0;
- Dispatch(effGetVendorString,0,0,vendorname);
- }
-
- }
- catch(std::exception &e) {
- flext::post("vst~ - caught exception while loading plugin: %s",e.what());
- ok = false;
- }
- catch(...) {
- flext::post("vst~ - Caught exception while loading plugin");
- ok = false;
- }
-
- if(!ok) Free();
- return ok;
-}
-
-void VSTPlugin::Free()
-{
- // This should only also in destruction
-
- try {
- if(effect) {
- FLEXT_ASSERT(!IsEdited());
-
- // shut down plugin
- Dispatch(effMainsChanged, 0, 0);
- Dispatch(effClose);
- }
- }
- catch(...) {}
-
- FreePlugin();
-}
-
-void VSTPlugin::DspInit(float sr,int blsz)
-{
- try {
- // sample rate and block size must _first_ be set
- Dispatch(effSetSampleRate,0,0,NULL,samplerate = sr);
- Dispatch(effSetBlockSize, 0,blsz);
- // then signal that mains have changed!
- Dispatch(effMainsChanged,0,1);
- }
- catch(std::exception &e) {
- flext::post("vst~ - caught exception while initializing dsp: %s",e.what());
- }
- catch(...) {
- flext::post("vst~ - caught exception while initializing dsp");
- }
-}
-
-void VSTPlugin::ListPlugs(const t_symbol *sym) const
-{
- if(responder) {
- if(Is() && Dispatch(effGetPlugCategory) == kPlugCategShell) {
- t_atom at;
- // sub plugin-name given -> scan plugs
- char tmp[64];
- // scan shell for subplugins
- while(Dispatch(effShellGetNextPlugin,0,0,tmp)) {
- SetString(at,tmp);
- responder->Respond(sym,1,&at);
- }
- }
-
- // bang
- responder->Respond(sym);
- }
-}
diff --git a/externals/grill/vst/src/vsthost.h b/externals/grill/vst/src/vsthost.h
deleted file mode 100644
index 00225b62..00000000
--- a/externals/grill/vst/src/vsthost.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#ifndef __VSTHOST_H
-#define __VSTHOST_H
-
-#include <flext.h>
-#include <string>
-#include <map>
-#include <math.h>
-
-#include "AEffectx.h"
-#include "AEffEditor.hpp"
-
-
-#if FLEXT_OS == FLEXT_OS_WIN
-#include <windows.h>
-typedef HWND WHandle;
-typedef HMODULE MHandle;
-#elif FLEXT_OS == FLEXT_OS_MAC
-#include <CoreServices/CoreServices.h>
-typedef Handle WHandle;
-typedef void *MHandle;
-#else
-#error Platform not supported!
-#endif
-
-
-#define MIDI_MAX_EVENTS 64
-
-class Responder
-{
-public:
- virtual void Respond(const t_symbol *sym,int argc = 0,const t_atom *argv = NULL) = 0;
-};
-
-
-class VSTPlugin:
- public flext
-{
-public:
- static VSTPlugin *New(Responder *resp);
- static void Delete(VSTPlugin *p);
-
- static void Setup();
-
- bool Instance(const char *plug,const char *subplug = NULL);
- void DspInit(float samplerate,int blocksize);
-
-private:
- VSTPlugin(Responder *resp);
- ~VSTPlugin();
-
- static ThrCond thrcond;
- static void worker(thr_params *p);
-
- void Free();
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
- bool Is() const { return effect != NULL; }
-
- long GetVersion() const { return effect->version; }
-
- bool IsSynth() const { return HasFlags(effFlagsIsSynth); }
- bool IsReplacing() const { return HasFlags(effFlagsCanReplacing); }
- bool HasEditor() const { return HasFlags(effFlagsHasEditor); }
-
- const char *GetName() const { return productname; }
- const char *GetVendorName() const { return vendorname; }
- const char *GetDllName() const { return dllname.c_str(); }
-
- long UniqueID() const { return effect->uniqueID; }
-
- int GetNumInputs() const { return effect->numInputs; }
- int GetNumOutputs() const { return effect->numOutputs; }
-
- void ListPlugs(const t_symbol *sym) const;
-
-private:
- char productname[300];
- char vendorname[300];
- std::string dllname; // Contains dll name
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
- int GetNumParams() const { return effect?effect->numParams:0; }
- void GetParamName(int numparam,char *name) const;
- void GetParamValue(int numparam,char *parval) const;
- float GetParamValue(int numparam) const;
-
- // scan plugin names (can take a _long_ time!!)
- void ScanParams(int i = -1);
- // get number of scanned parameters
- int ScannedParams() const { return paramnamecnt; }
- // get index of named (scanned) parameter... -1 if not found
- int GetParamIx(const char *p) const;
-
- bool SetParamFloat(int parameter, float value);
- bool SetParamInt(int parameter, int value) { return SetParamFloat(parameter,value/65535.0f); }
-
- void SetCurrentProgram(int prg) { Dispatch(effSetProgram,0,prg); }
- int GetCurrentProgram() const { return Dispatch(effGetProgram); }
- int GetNumPrograms() const { return effect->numPrograms; }
-
- int GetNumCategories() const { return Dispatch(effGetNumProgramCategories); }
- bool GetProgramName(int cat,int p,char* buf) const;
-
-private:
- struct NameCmp:
- std::less<std::string>
- {
- bool operator()(const std::string &a,const std::string &b) const { return a.compare(b) < 0; }
- };
-
- typedef std::map<std::string,int,NameCmp> NameMap;
- int paramnamecnt;
- NameMap paramnames;
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
- void SetPos(int x,int y,bool upd = true);
- void SetSize(int x,int y,bool upd = true);
- void SetX(int x,bool upd = true) { SetPos(x,posy,upd); }
- void SetY(int y,bool upd = true) { SetPos(posx,y,upd); }
- void SetW(int x,bool upd = true) { SetSize(x,sizey,upd); }
- void SetH(int y,bool upd = true) { SetSize(sizex,y,upd); }
- int GetX() const { return posx; }
- int GetY() const { return posy; }
- int GetW() const { return sizex; }
- int GetH() const { return sizey; }
- void SetCaption(bool b);
- bool GetCaption() const { return caption; }
- void SetHandle(bool h);
- bool GetHandle() const { return handle; }
- void SetTitle(const char *t);
- const char *GetTitle() const { return title.c_str(); }
-
- void ToFront();
-
- void Edit(bool open);
-
- void StartEditing(WHandle h);
- void StopEditing();
- bool IsEdited() const { return hwnd != NULL; }
- WHandle EditorHandle() const { return hwnd; }
- void EditingEnded() { hwnd = NULL; thrcond.Signal(); }
-
- void GetEditorRect(ERect &er) const { ERect *r; Dispatch(effEditGetRect,0,0,&r); er = *r; }
- void EditorIdle() { Dispatch(effEditIdle); }
-
- void Visible(bool vis,bool upd = true);
- bool IsVisible() const { return visible; }
-
- void Paint(ERect &r) const { Dispatch(effEditDraw,0,0,&r); }
-
-private:
- bool visible;
- int posx,posy,sizex,sizey; // Window position
- bool caption; // Window border
- bool handle; // Window handle (like taskbar button)
- std::string title; // Window title
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
- enum {
- MIDI_NOTEOFF = 0x80,
- MIDI_NOTEON = 0x90,
- MIDI_POLYAFTERTOUCH = 0xa0,
- MIDI_CONTROLCHANGE = 0xb0,
- MIDI_PROGRAMCHANGE = 0xc0,
- MIDI_AFTERTOUCH = 0xd0,
- MIDI_PITCHBEND = 0xe0,
- MIDI_SYSEX = 0xf0,
- };
-
- void SetEvents(bool ev) { dumpevents = ev; }
- bool GetEvents() const { return dumpevents; }
-
- bool AddMIDI(unsigned char data0,unsigned char data1 = 0,unsigned char data2 = 0);
-
- static int range(int value,int mn = 0,int mx = 127) { return value < mn?mn:(value > mx?mx:value); }
-
- void SetChannel(int channel) { midichannel = range(channel,0,0xf); }
- int GetChannel() const { return midichannel; }
-
- bool AddNoteOn(unsigned char note,unsigned char speed /*,unsigned char midichannel = 0*/)
- {
- return AddMIDI(MIDI_NOTEON+midichannel,note,speed);
- }
-
- bool AddNoteOff(unsigned char note /*,unsigned char midichannel = 0*/)
- {
- return AddMIDI(MIDI_NOTEOFF+midichannel,note,0);
- }
-
- void AddControlChange(int control,int value)
- {
- AddMIDI(MIDI_CONTROLCHANGE+midichannel,range(control),range(value));
- }
-
- void AddProgramChange(int value)
- {
- AddMIDI(MIDI_PROGRAMCHANGE+midichannel,range(value),0);
- }
-
- void AddPitchBend(int value)
- {
- AddMIDI(MIDI_PITCHBEND+midichannel,(value&127),((value>>7)&127));
- }
-
- void AddAftertouch(int value)
- {
- AddMIDI(MIDI_AFTERTOUCH+midichannel,range(value));
- }
-
- void AddPolyAftertouch(unsigned char note,int value)
- {
- AddMIDI(MIDI_POLYAFTERTOUCH+midichannel,note,range(value));
- }
-
-private:
- void SendMidi();
-
- // static VstTimeInfo _timeInfo;
- VstMidiEvent midievent[MIDI_MAX_EVENTS];
- VstEvents events;
- int eventqusz;
-
- char midichannel;
- bool dumpevents;
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
-
- void SetPlaying(bool p) { if(playing != p) transchg = true,playing = p; }
- bool GetPlaying() const { return playing; }
- void SetLooping(bool p) { if(looping != p) transchg = true,looping = p; }
- bool GetLooping() const { return looping; }
- void SetFeedback(bool p) { feedback = p; }
- bool GetFeedback() const { return feedback; }
-
- void SetSamplePos(double p) { if(samplepos != p) transchg = true,samplepos = p; }
- double GetSamplePos() const { return samplepos; }
- void SetTempo(double p) { if(tempo != p) transchg = true,tempo = p; }
- double GetTempo() const { return tempo; }
- void SetPPQPos(double p) { if(ppqpos != p) transchg = true,ppqpos = p; }
- double GetPPQPos() const { return ppqpos; }
-
- void SetTimesigNom(int p) { if(timesignom != p) transchg = true,timesignom = p; }
- int GetTimesigNom() const { return timesignom; }
- void SetTimesigDen(int p) { if(timesigden != p) transchg = true,timesigden = p; }
- int GetTimesigDen() const { return timesigden; }
- void SetBarStart(double p) { if(barstartpos != p) transchg = true,barstartpos = p; }
- double GetBarStart() const { return barstartpos; }
- void SetCycleStart(double p) { if(cyclestartpos != p) transchg = true,cyclestartpos = p; }
- double GetCycleStart() const { return cyclestartpos; }
- void SetCycleEnd(double p) { if(cycleendpos != p) transchg = true,cycleendpos = p; }
- double GetCycleEnd() const { return cycleendpos; }
-
- void SetSmpteOffset(int p) { if(smpteoffset != p) transchg = true,smpteoffset = p; }
- int GetSmpteOffset() const { return smpteoffset; }
- void SetSmpteRate(int p) { if(smpterate != p) transchg = true,smpterate = p; }
- int GetSmpteRate() const { return smpterate; }
-
-private:
-
- bool playing,looping,feedback;
- float samplerate;
- bool transchg;
-
- double samplepos,tempo;
- double ppqpos;
-
- int timesignom,timesigden;
- double barstartpos;
- double cyclestartpos,cycleendpos;
- int smpteoffset,smpterate;
-
- //////////////////////////////////////////////////////////////////////////////
-
-public:
- bool processReplacing(float **inputs,float **outputs,long sampleframes )
- {
- FLEXT_ASSERT(effect);
- effect->processReplacing(effect,inputs,outputs,sampleframes);
- if(playing) updatepos(sampleframes);
- return true;
- }
-
- bool process(float **inputs,float **outputs,long sampleframes )
- {
- FLEXT_ASSERT(effect);
- effect->process(effect,inputs,outputs,sampleframes);
- return true;
- }
-
-private:
-
- void updatepos(long frames);
-
- //////////////////////////////////////////////////////////////////////////////
-
-private:
- Responder *responder;
-
- bool NewPlugin(const char *plugname);
- void FreePlugin();
- bool InstPlugin(long plugid = 0);
-
- static long uniqueid;
- static std::string dllloading;
-
- inline long GetFlags() const { return effect?effect->flags:0; }
- inline bool HasFlags(long msk) const { return effect && (effect->flags&msk); }
-
-
-#if FLEXT_OS == FLEXT_OS_WIN
- // the handle to the shared library
- MHandle hdll;
-#endif
- // the handle to the plugin editor window
- WHandle hwnd;
- // the VST plugin instance
- AEffect *effect;
-
- typedef AEffect *(VSTCALLBACK *PVSTMAIN)(audioMasterCallback audioMaster);
- PVSTMAIN pluginmain;
- audioMasterCallback audiomaster;
-
- long Dispatch(long opCode,long index = 0,long value = 0,void *ptr = NULL,float opt = 0) const
- {
- FLEXT_ASSERT(effect);
- return effect->dispatcher(effect,opCode,index,value,ptr,opt);
- }
-
- static long VSTCALLBACK Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt);
-
- static const t_symbol *sym_param;
- static const t_symbol *sym_event,*sym_evmidi,*sym_evaudio,*sym_evvideo,*sym_evparam,*sym_evtrigger,*sym_evsysex,*sym_ev_;
- static const t_symbol *sym_midi[8];
-
- void ProcessEvent(const VstEvent &ev);
-};
-
-#endif
diff --git a/externals/grill/vst/src/vstmaster.cpp b/externals/grill/vst/src/vstmaster.cpp
deleted file mode 100644
index 6730a647..00000000
--- a/externals/grill/vst/src/vstmaster.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "vsthost.h"
-
-static const int VST_VERSION = 100;
-static const char *vendor = "grrrr.org";
-static const char *product = "vst~";
-
-
-void VSTPlugin::ProcessEvent(const VstEvent &ev)
-{
- if(!responder && dumpevents) return;
-
- if(ev.type == kVstMidiType) {
- const VstMidiEvent &mev = (const VstMidiEvent &)ev;
- t_atom lst[10];
- SetSymbol(lst[0],sym_evmidi);
- int midi = ((unsigned char)mev.midiData[0]>>4)-8;
- FLEXT_ASSERT(midi >= 0 && midi < 8);
- SetSymbol(lst[1],sym_midi[midi]);
- SetInt(lst[2],(unsigned char)mev.midiData[0]&0x0f);
- SetInt(lst[3],(unsigned char)mev.midiData[1]);
- SetInt(lst[4],(unsigned char)mev.midiData[2]);
- // what about running status? (obviously not possible)
- SetInt(lst[5],mev.deltaFrames);
- SetInt(lst[6],mev.noteLength);
- SetInt(lst[7],mev.noteOffset);
- SetInt(lst[8],(int)mev.detune);
- SetInt(lst[9],(int)mev.noteOffVelocity);
- responder->Respond(sym_event,9,lst);
- }
- else {
- const t_symbol *sym;
- if(ev.type == kVstAudioType)
- sym = sym_evaudio;
- else if(ev.type == kVstVideoType)
- sym = sym_evvideo;
- else if(ev.type == kVstParameterType)
- sym = sym_evparam;
- else if(ev.type == kVstTriggerType)
- sym = sym_evtrigger;
- else if(ev.type == kVstSysExType)
- sym = sym_evsysex;
- else
- sym = sym_ev_;
-
- int data = ev.byteSize-sizeof(ev.deltaFrames)-sizeof(ev.flags);
- const int stsize = 16;
- t_atom stlst[stsize];
- t_atom *lst = data+3 > stsize?new t_atom[data+3]:stlst;
-
- SetSymbol(lst[0],sym);
- SetInt(lst[1],ev.deltaFrames);
- SetInt(lst[2],ev.flags);
- for(int i = 0; i < data; ++i) SetInt(lst[3],(unsigned char)ev.data[i]);
-
- responder->Respond(sym_event,data+3,lst);
-
- if(lst != stlst) delete[] lst;
- }
-}
-
-// Host callback dispatcher
-long VSTPlugin::Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt)
-{
- if(opcode != audioMasterGetTime)
- FLEXT_LOG6("VST -> host: Eff = 0x%.8X, Opcode = %d, Index = %d, Value = %d, PTR = %.8X, OPT = %.3f\n",(int)effect, opcode,index,value,(int)ptr,opt);
-
- VSTPlugin *th = effect?(VSTPlugin *)effect->user:NULL;
-
- switch (opcode) {
- case audioMasterAutomate: // 0
- if(th && th->feedback && th->responder) {
- t_atom lst[2];
- SetInt(lst[0],index);
- SetFloat(lst[1],opt);
- th->responder->Respond(sym_param,2,lst);
- }
- return 0;
-
- case audioMasterVersion: // 1
- // support VST 2.3
- return 2300;
-
- case audioMasterCurrentId: // 2
- // set to subplugin id (default 0)
- return uniqueid;
-
- case audioMasterIdle: // 3
- effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f);
- return 0;
-
- case audioMasterPinConnected: // 4
- //! \todo set connection state correctly (if possible..)
- // index=pin, value=0..input, else..output
- FLEXT_LOG2("Pin connected pin=%li conn=%li",index,value);
- return 0; // 0 means connected
-
- case audioMasterWantMidi: // 6
- FLEXT_LOG1("Want MIDI = %li",value);
- return 0; // VST header says: "currently ignored"
-
- case audioMasterGetTime: { // 7
- if(!th) return 0;
-
- static VstTimeInfo time;
- memset(&time,0,sizeof(time));
-
- // flags
- time.flags = kVstTempoValid|kVstBarsValid|kVstCyclePosValid|kVstPpqPosValid|kVstSmpteValid|kVstTimeSigValid;
-
- if(th->transchg) { time.flags |= kVstTransportChanged; th->transchg = false; }
- if(th->playing) time.flags |= kVstTransportPlaying;
- if(th->looping) time.flags |= kVstTransportCycleActive;
-// if(th->feedback) time.flags |= kVstAutomationWriting;
-
- time.sampleRate = th->samplerate;
- time.samplePos = th->samplepos;
- time.ppqPos = th->ppqpos;
-
- time.tempo = th->tempo;
- time.barStartPos = th->barstartpos;
- time.cycleStartPos = th->cyclestartpos;
- time.cycleEndPos = th->cycleendpos;
-
- time.timeSigNumerator = th->timesignom;
- time.timeSigDenominator = th->timesigden;
-
- // SMPTE data
- time.smpteOffset = th->smpteoffset;
- time.smpteFrameRate = th->smpterate;
-
-// time.samplesToNextClock = 0;
-
- if(value&kVstNanosValid) {
- time.nanoSeconds = flext::GetOSTime()*1.e9;
- time.flags |= kVstNanosValid;
- }
-
- return (long)&time;
- }
-
- case audioMasterProcessEvents: { // 8
- // VST event data from plugin
- VstEvents *evs = static_cast<VstEvents *>(ptr);
- if(th) {
- for(int i = 0; i < evs->numEvents; ++i)
- th->ProcessEvent(*evs->events[i]);
- return 1;
- }
- else
- return 0;
- }
-
- case audioMasterSetTime: { // 9
- VstTimeInfo *tminfo = static_cast<VstTimeInfo *>(ptr);
- FLEXT_LOG3("TimeInfo pos=%lf rate=%lf filter=%li",tminfo->samplePos,tminfo->sampleRate,value);
- return 0; // not supported
- }
-
- case audioMasterTempoAt: // 10
- return 0; // not supported
-
- case audioMasterGetNumAutomatableParameters: // 11
- return 0; // not supported
-
- case audioMasterSizeWindow: // 15
- return 0;
-
- case audioMasterGetSampleRate: // 16
- return 0; // not supported
- case audioMasterGetBlockSize: // 17
- return 0; // not supported
-
- case audioMasterGetCurrentProcessLevel: // 23
- // return thread state
- return flext::IsSystemThread()?2:1;
-
- case audioMasterGetAutomationState: // 24
-// return th?(th->feedback?2:1):0;
- return 0;
-
- case audioMasterGetVendorString: // 32
- strcpy((char*)ptr,vendor);
- return 0;
-
- case audioMasterGetProductString: // 33
- strcpy((char *)ptr,product);
- return 0;
-
- case audioMasterGetVendorVersion: // 34
- return VST_VERSION;
-
- case audioMasterCanDo: // 37
- FLEXT_LOG1("\taudioMasterCanDo PTR = %s",ptr);
- if(!strcmp((char *)ptr,"sendVstEvents"))
- return 1;
- else if(!strcmp((char *)ptr,"sendVstMidiEvent"))
- return 1;
- else if(!strcmp((char *)ptr,"sendVstTimeInfo"))
- return 1; // NOT YET
- else if(!strcmp((char *)ptr,"receiveVstEvents"))
- return 1;
- else if(!strcmp((char *)ptr,"receiveVstMidiEvent"))
- return 1;
- else if(!strcmp((char *)ptr,"receiveVstTimeInfo"))
- return 1; // NOT YET
- else if(!strcmp((char *)ptr,"reportConnectionChanges"))
- return 0; // \TODO PD has hard times supporting that...
- else if(!strcmp((char *)ptr,"acceptIOChanges"))
- return 0; // \TODO what does this means exactly?
- else if(!strcmp((char *)ptr,"supplyIdle"))
- return 1;
- else if(!strcmp((char *)ptr,"sizeWindow"))
- return 1;
- else if(!strcmp((char *)ptr,"supportShell"))
- return 0; // deprecated - new one is shellCategory
- else if(!strcmp((char *)ptr,"offline"))
- return 0; // not supported
- else if(!strcmp((char *)ptr,"asyncProcessing"))
- return 0; // not supported
- else if(!strcmp((char *)ptr,"shellCategory"))
- return 1; // supported!
- else if(!strcmp((char *)ptr,"editFile"))
- return 0; // not supported
- else if(!strcmp((char *)ptr,"openFileSelector"))
- return 0; // not supported
- else if(!strcmp((char *)ptr,"closeFileSelector"))
- return 0; // not supported
- else if(!strcmp((char *)ptr,"startStopProcess"))
- return 0; // not supported
-#ifdef FLEXT_DEBUG
- else
- post("Unknown audioMasterCanDo PTR = %s",ptr);
-#endif
-
- return 0; // not supported
-
- case audioMasterGetLanguage: // 38
- return kVstLangEnglish;
-
- case audioMasterGetDirectory: // 41
- return (long)(th?th->dllname.c_str():dllloading.c_str());
-
- case audioMasterUpdateDisplay: // 42
- FLEXT_LOG("UPDATE DISPLAY");
- return 0;
-
- default:
- FLEXT_LOG1("Unknown opcode %li",opcode);
- return 0;
- }
-}
-
-void VSTPlugin::updatepos(long frames)
-{
- bool inloop = ppqpos < cycleendpos;
-
- // \todo should the sample position also jump back when cycling?
- // and if, how?
- samplepos += frames;
-
- // \todo this factor should be cached
- ppqpos += frames*tempo/(samplerate*60);
-
- if(looping) {
- double cyclelen = cycleendpos-cyclestartpos;
- if(cyclelen > 0) {
- if(inloop && ppqpos >= cycleendpos)
- ppqpos = cyclestartpos+fmod(ppqpos-cyclestartpos,cyclelen);
- }
- else
- ppqpos = cyclestartpos;
- }
-}
diff --git a/externals/grill/vst/src/vstmidi.cpp b/externals/grill/vst/src/vstmidi.cpp
deleted file mode 100644
index 8bddba98..00000000
--- a/externals/grill/vst/src/vstmidi.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "vsthost.h"
-
-bool VSTPlugin::AddMIDI(unsigned char data0,unsigned char data1,unsigned char data2)
-{
- if(Is()) {
- VstMidiEvent *pevent = &midievent[eventqusz];
-
- pevent->type = kVstMidiType;
- pevent->byteSize = 24;
- pevent->deltaFrames = 0;
- pevent->flags = 0;
- pevent->detune = 0;
- pevent->noteLength = 0;
- pevent->noteOffset = 0;
- pevent->reserved1 = 0;
- pevent->reserved2 = 0;
- pevent->noteOffVelocity = 0;
- pevent->midiData[0] = data0;
- pevent->midiData[1] = data1;
- pevent->midiData[2] = data2;
- pevent->midiData[3] = 0;
-
- if(eventqusz < MIDI_MAX_EVENTS) ++eventqusz;
- SendMidi();
- return true;
- }
- else return false;
-}
-
-
-void VSTPlugin::SendMidi()
-{
- if(Is() && eventqusz > 0) {
- // Prepare MIDI events and free queue dispatching all events
- events.numEvents = eventqusz;
- events.reserved = 0;
- for(int q = 0; q < eventqusz; q++)
- events.events[q] = (VstEvent*)&midievent[q];
-
- Dispatch(effProcessEvents, 0, 0, &events, 0.0f);
- eventqusz = 0;
- }
-}
diff --git a/externals/grill/vst/src/vstparam.cpp b/externals/grill/vst/src/vstparam.cpp
deleted file mode 100644
index bb80263e..00000000
--- a/externals/grill/vst/src/vstparam.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-vst~ - VST plugin object for PD
-based on the work of Jarno Seppänen and Mark Williamson
-
-Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org)
-For information on usage and redistribution, and for a DISCLAIMER OF ALL
-WARRANTIES, see the file, "license.txt," in this distribution.
-*/
-
-#include "vsthost.h"
-#include <ctype.h>
-
-static void striptrail(char *txt)
-{
- // strip trailing whitespace
- for(int i = strlen(txt)-1; i >= 0; --i)
- // cast to unsigned char since isspace functions don't want characters like 0x80 = -128
- if(isspace(((unsigned char *)txt)[i])) txt[i] = 0;
- else break;
-}
-
-void VSTPlugin::GetParamName(int numparam,char *name) const
-{
- if(numparam < GetNumParams()) {
- name[0] = 0;
- Dispatch(effGetParamName,numparam,0,name);
- striptrail(name);
- }
- else
- name[0] = 0;
-}
-
-bool VSTPlugin::SetParamFloat(int parameter,float value)
-{
- if(Is() && parameter >= 0 && parameter < GetNumParams()) {
- effect->setParameter(effect,parameter,value);
- return true;
- }
- else
- return false;
-}
-
-void VSTPlugin::GetParamValue(int numparam,char *parval) const
-{
- if(Is()) {
- if(numparam < GetNumParams()) {
- // how many chars needed?
- char par_display[64]; par_display[0] = 0;
- Dispatch(effGetParamDisplay,numparam,0,par_display);
-// if(par_display[7]) par_display[8] = 0; // set trailing zero
-
- // how many chars needed?
- char par_label[64]; par_label[0] = 0;
- Dispatch(effGetParamLabel,numparam,0,par_label);
- striptrail(par_label);
-// if(par_label[7]) par_label[8] = 0; // set trailing zero
-
- sprintf(parval,"%s%s",par_display,par_label);
- }
- else
- strcpy(parval,"Index out of range");
- }
- else
- strcpy(parval,"Plugin not loaded");
-}
-
-float VSTPlugin::GetParamValue(int numparam) const
-{
- if(Is() && numparam < GetNumParams())
- return effect->getParameter(effect,numparam);
- else
- return -1.0;
-}
-
-void VSTPlugin::ScanParams(int cnt)
-{
- if(cnt < 0) cnt = GetNumParams();
- if(paramnamecnt >= cnt) return;
- if(cnt >= GetNumParams()) cnt = GetNumParams();
-
- char name[64];
- for(int i = paramnamecnt; i < cnt; ++i) {
- GetParamName(i,name);
- if(*name) paramnames[std::string(name)] = i;
- }
- paramnamecnt = cnt;
-}
-
-int VSTPlugin::GetParamIx(const char *p) const
-{
- NameMap::const_iterator it = paramnames.find(std::string(p));
- return it == paramnames.end()?-1:it->second;
-}
-
-bool VSTPlugin::GetProgramName(int cat,int p,char *buf) const
-{
- buf[0] = 0;
- int parameter = p;
- if(parameter < GetNumPrograms() && cat < GetNumCategories()) {
- Dispatch(effGetProgramNameIndexed,parameter,cat,buf);
- striptrail(buf);
- return true;
- }
- else
- return false;
-}