/* * aeffectx.h - simple header to allow VeSTige compilation and eventually work * * Copyright (c) 2006 Javier Serrano Polo * * This file is part of LMMS - https://lmms.io * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program (see COPYING); if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * */ // This version of the header was obtained from the Audacity project // https://github.com/audacity/audacity/blob/5900c524928be07d620bd7bfe282d53f839811f8/src/effects/VST/aeffectx.h // and it contains a few opcodes there were missing from the original LMMS // header #pragma once // Calling convention for Wine interoperability, not part of the original // headerfrom the Audacity proejct #ifndef __WINE__ #define __cdecl #endif #define VST_CALL_CONV __cdecl #define CCONST(a, b, c, d) \ ((((int)a) << 24) | (((int)b) << 16) | (((int)c) << 8) | (((int)d) << 0)) const int audioMasterAutomate = 0; const int audioMasterVersion = 1; const int audioMasterCurrentId = 2; const int audioMasterIdle = 3; const int audioMasterPinConnected = 4; // unsupported? 5 const int audioMasterWantMidi = 6; const int audioMasterGetTime = 7; const int audioMasterProcessEvents = 8; const int audioMasterSetTime = 9; const int audioMasterTempoAt = 10; const int audioMasterGetNumAutomatableParameters = 11; const int audioMasterGetParameterQuantization = 12; const int audioMasterIOChanged = 13; const int audioMasterNeedIdle = 14; const int audioMasterSizeWindow = 15; const int audioMasterGetSampleRate = 16; const int audioMasterGetBlockSize = 17; const int audioMasterGetInputLatency = 18; const int audioMasterGetOutputLatency = 19; const int audioMasterGetPreviousPlug = 20; const int audioMasterGetNextPlug = 21; const int audioMasterWillReplaceOrAccumulate = 22; const int audioMasterGetCurrentProcessLevel = 23; const int audioMasterGetAutomationState = 24; const int audioMasterOfflineStart = 25; const int audioMasterOfflineRead = 26; const int audioMasterOfflineWrite = 27; const int audioMasterOfflineGetCurrentPass = 28; const int audioMasterOfflineGetCurrentMetaPass = 29; const int audioMasterSetOutputSampleRate = 30; // unsupported? 31 const int audioMasterGetSpeakerArrangement = 31; // deprecated in 2.4? const int audioMasterGetVendorString = 32; const int audioMasterGetProductString = 33; const int audioMasterGetVendorVersion = 34; const int audioMasterVendorSpecific = 35; const int audioMasterSetIcon = 36; const int audioMasterCanDo = 37; const int audioMasterGetLanguage = 38; const int audioMasterOpenWindow = 39; const int audioMasterCloseWindow = 40; const int audioMasterGetDirectory = 41; const int audioMasterUpdateDisplay = 42; const int audioMasterBeginEdit = 43; const int audioMasterEndEdit = 44; const int audioMasterOpenFileSelector = 45; const int audioMasterCloseFileSelector = 46; // currently unused const int audioMasterEditFile = 47; // currently unused const int audioMasterGetChunkFile = 48; // currently unused const int audioMasterGetInputSpeakerArrangement = 49; // currently unused const int effFlagsHasEditor = 1; const int effFlagsCanReplacing = 1 << 4; // very likely const int effFlagsProgramChunks = 1 << 5; // from Ardour const int effFlagsIsSynth = 1 << 8; // currently unused const int effOpen = 0; const int effClose = 1; // currently unused const int effSetProgram = 2; // currently unused const int effGetProgram = 3; // currently unused // The next one was gleaned from // http://www.kvraudio.com/forum/viewtopic.php?p=1905347 const int effSetProgramName = 4; const int effGetProgramName = 5; // currently unused // The next two were gleaned from // http://www.kvraudio.com/forum/viewtopic.php?p=1905347 const int effGetParamLabel = 6; const int effGetParamDisplay = 7; const int effGetParamName = 8; // currently unused const int effSetSampleRate = 10; const int effSetBlockSize = 11; const int effMainsChanged = 12; const int effEditGetRect = 13; const int effEditOpen = 14; const int effEditClose = 15; const int effEditIdle = 19; const int effEditTop = 20; const int effIdentify = 22; // from http://www.asseca.org/vst-24-specs/efIdentify.html const int effGetChunk = 23; // from Ardour const int effSetChunk = 24; // from Ardour const int effProcessEvents = 25; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efCanBeAutomated.html const int effCanBeAutomated = 26; // The next one was gleaned from // http://www.kvraudio.com/forum/viewtopic.php?p=1905347 const int effGetProgramNameIndexed = 29; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efGetPlugCategory.html const int effGetPlugCategory = 35; const int effGetEffectName = 45; const int effGetParameterProperties = 56; // missing const int effGetVendorString = 47; const int effGetProductString = 48; const int effGetVendorVersion = 49; const int effCanDo = 51; // currently unused // The next one was gleaned from http://www.asseca.org/vst-24-specs/efIdle.html const int effIdle = 53; const int effGetVstVersion = 58; // currently unused // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efBeginSetProgram.html const int effBeginSetProgram = 67; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efEndSetProgram.html const int effEndSetProgram = 68; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efShellGetNextPlugin.html const int effShellGetNextPlugin = 70; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efBeginLoadBank.html const int effBeginLoadBank = 75; // The next one was gleaned from // http://www.asseca.org/vst-24-specs/efBeginLoadProgram.html const int effBeginLoadProgram = 76; // The next two were gleaned from // http://www.kvraudio.com/forum/printview.php?t=143587&start=0 const int effStartProcess = 71; const int effStopProcess = 72; const int kEffectMagic = CCONST('V', 's', 't', 'P'); const int kVstLangEnglish = 1; const int kVstMidiType = 1; const int kVstNanosValid = 1 << 8; const int kVstPpqPosValid = 1 << 9; const int kVstTempoValid = 1 << 10; const int kVstBarsValid = 1 << 11; const int kVstCyclePosValid = 1 << 12; const int kVstTimeSigValid = 1 << 13; const int kVstSmpteValid = 1 << 14; // from Ardour const int kVstClockValid = 1 << 15; // from Ardour const int kVstTransportPlaying = 1 << 1; const int kVstTransportCycleActive = 1 << 2; const int kVstTransportChanged = 1; class RemoteVstPlugin; class VstMidiEvent { public: // 00 int type; // 04 int byteSize; // 08 int deltaFrames; // 0c? int flags; // 10? int noteLength; // 14? int noteOffset; // 18 char midiData[4]; // 1c? char detune; // 1d? char noteOffVelocity; // 1e? char reserved1; // 1f? char reserved2; }; class VstEvent { public: char dump[sizeof(VstMidiEvent)]; }; class VstEvents { public: // 00 int numEvents; // 04 void* reserved; // 08 VstEvent* events[1]; }; // Not finished, neither really used class VstParameterProperties { public: /* float stepFloat; char label[64]; int flags; int minInteger; int maxInteger; int stepInteger; char shortLabel[8]; int category; char categoryLabel[24]; char empty[128];*/ float stepFloat; float smallStepFloat; float largeStepFloat; char label[64]; unsigned int flags; unsigned int minInteger; unsigned int maxInteger; unsigned int stepInteger; unsigned int largeStepInteger; char shortLabel[8]; unsigned short displayIndex; unsigned short category; unsigned short numParametersInCategory; unsigned short reserved; char categoryLabel[24]; char future[16]; }; #include class AEffect { public: // Never use virtual functions!!! // 00-03 int magic; // dispatcher 04-07 intptr_t( VST_CALL_CONV* dispatcher)(AEffect*, int, int, intptr_t, void*, float); // process, quite sure 08-0b void(VST_CALL_CONV* process)(AEffect*, float**, float**, int); // setParameter 0c-0f void(VST_CALL_CONV* setParameter)(AEffect*, int, float); // getParameter 10-13 float(VST_CALL_CONV* getParameter)(AEffect*, int); // programs 14-17 int numPrograms; // Params 18-1b int numParams; // Input 1c-1f int numInputs; // Output 20-23 int numOutputs; // flags 24-27 int flags; // Fill somewhere 28-2b void* ptr1; void* ptr2; int initialDelay; // Zeroes 34-37 38-3b int empty3a; int empty3b; // 1.0f 3c-3f float unkown_float; // An object? pointer 40-43 void* ptr3; // Zeroes 44-47 void* user; // Id 48-4b int uniqueID; int version; // processReplacing 50-53 void(VST_CALL_CONV* processReplacing)(AEffect*, float**, float**, int); // Found at // https://git.iem.at/zmoelnig/VeSTige/-/blob/b0e67183e155fec32dd85a2c7b5c2e4b58407323/vestige.h#L323 // The offset was also found based on a segfualt in REAPER's audio audio // engine when it tried to call this function for the Rx7 plugins when // yabridge did not yet implement it void(VST_CALL_CONV* processDoubleReplacing)(AEffect*, double**, double**, int); }; class VstTimeInfo { public: // 00 double samplePos; // 08 double sampleRate; // 10 double nanoSeconds; // 18 double ppqPos; // 20? double tempo; // 28 double barStartPos; // 30? double cycleStartPos; // 38? double cycleEndPos; // 40? int timeSigNumerator; // 44? int timeSigDenominator; // unconfirmed 48 4c 50 char empty3[4 + 4 + 4]; // 54 int flags; }; typedef intptr_t(VST_CALL_CONV* audioMasterCallback)(AEffect*, int, int, intptr_t, void*, float); // from http://www.asseca.org/vst-24-specs/efGetParameterProperties.html enum VstParameterFlags { kVstParameterIsSwitch = 1 << 0, // parameter is a switch (on/off) kVstParameterUsesIntegerMinMax = 1 << 1, // minInteger, maxInteger valid kVstParameterUsesFloatStep = 1 << 2, // stepFloat, smallStepFloat, largeStepFloat valid kVstParameterUsesIntStep = 1 << 3, // stepInteger, largeStepInteger valid kVstParameterSupportsDisplayIndex = 1 << 4, // displayIndex valid kVstParameterSupportsDisplayCategory = 1 << 5, // category, etc. valid kVstParameterCanRamp = 1 << 6 // set if parameter value can ramp up/down }; // from http://www.asseca.org/vst-24-specs/efBeginLoadProgram.html struct VstPatchChunkInfo { int version; // Format Version (should be 1) int pluginUniqueID; // UniqueID of the plug-in int pluginVersion; // Plug-in Version int numElements; // Number of Programs (Bank) or Parameters (Program) char future[48]; // Reserved for future use }; // from http://www.asseca.org/vst-24-specs/efGetPlugCategory.html enum VstPlugCategory { kPlugCategUnknown = 0, // 0=Unknown, category not implemented kPlugCategEffect, // 1=Simple Effect kPlugCategSynth, // 2=VST Instrument (Synths, samplers,...) kPlugCategAnalysis, // 3=Scope, Tuner, ... kPlugCategMastering, // 4=Dynamics, ... kPlugCategSpacializer, // 5=Panners, ... kPlugCategRoomFx, // 6=Delays and Reverbs kPlugSurroundFx, // 7=Dedicated surround processor kPlugCategRestoration, // 8=Denoiser, ... kPlugCategOfflineProcess, // 9=Offline Process kPlugCategShell, // 10=Plug-in is container of other plug-ins @see // effShellGetNextPlugin() kPlugCategGenerator, // 11=ToneGenerator, ... kPlugCategMaxCount // 12=Marker to count the categories }; class VstRect { public: short top; short left; short bottom; short right; };