diff DPF-Prymula-audioplugins/dpf/distrho/src/xaymar-vst2/vst.h @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DPF-Prymula-audioplugins/dpf/distrho/src/xaymar-vst2/vst.h	Mon Oct 16 21:53:34 2023 +0200
@@ -0,0 +1,1012 @@
+// This was created from released VST2.x plugins, and is technically under the 2-clause BSD license.
+// Depending on which country you are in, Steinberg can do fuck all about this. Notable countries for
+// this are most members of the United States of America, the entirety of Europe, Japan, and Russia.
+// Consult a lawyer if you don't know if clean room reverse engineering is allowed in your country.
+
+// See README.md for all information.
+
+// Known additional information:
+// - Function call standard seems to be stdcall.
+// - Everything is aligned to 8 bytes.
+
+// VST Versioning:
+// - Base-10, thus can't store many version numbers.
+// - Always four components, with the major one being able to store the most numbers.
+// - Format is A...ABCD, so 1.2.3.4 would turn into 1234.
+
+#pragma once
+#ifndef VST2SDK_VST_H
+#define VST2SDK_VST_H
+
+#define VST_FUNCTION_INTERFACE __cdecl
+#define VST_ALIGNMENT 8
+#define VST_MAGICNUMBER 'VstP'
+
+// Common VST buffer lengths:
+// 8: OpCodes(GetLabel, GetName, GetValue)
+#define VST_BUFFER_8 8
+// 16:
+#define VST_BUFFER_16 16
+// 24: OpCodes?
+#define VST_BUFFER_24 24
+// 32: OpCodes(EffectName)
+#define VST_BUFFER_32 32
+#define VST_EFFECT_BUFFER_SIZE 32
+// 64: OpCodes(ProductName, VendorName)
+#define VST_BUFFER_64 64
+#define VST_VENDOR_BUFFER_SIZE VST_BUFFER_64
+#define VST_PRODUCT_BUFFER_SIZE VST_BUFFER_64
+#define VST_NAME_BUFFER_SIZE VST_BUFFER_64
+// 100:
+#define VST_BUFFER_100 100
+
+#define VST_MAX_CHANNELS 32 // Couldn't find any audio editing software which would attempt to add more channels.
+
+#pragma pack(push, VST_ALIGNMENT)
+
+#ifdef __cplusplus
+#ifdef DISTRHO_PROPER_CPP11_SUPPORT
+#include <cinttypes>
+#else
+#include <inttypes.h>
+#endif
+extern "C" {
+#else
+#include <inttypes.h>
+#endif
+
+/*******************************************************************************
+|* Enumeration
+|*/
+enum VST_VERSION {
+	VST_VERSION_1       = 0,    // Anything before 2.0, used by official plug-ins.
+	VST_VERSION_1_0_0_0 = 1000, // 1.0, used by some third-party plug-ins.
+	VST_VERSION_1_1_0_0 = 1100, // 1.1, used by some third-party plug-ins.
+	VST_VERSION_2       = 2,    // 2.0, used by official plug-ins.
+	VST_VERSION_2_0_0_0 = 2000, // 2.0, used by some third-party plug-ins.
+	VST_VERSION_2_1_0_0 = 2100, // 2.1
+	VST_VERSION_2_2_0_0 = 2200, // 2.2
+	VST_VERSION_2_3_0_0 = 2300, // 2.3
+	VST_VERSION_2_4_0_0 = 2400, // 2.4
+
+	// Pad to force 32-bit number.
+	_VST_VERSION_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_CATEGORY {
+	VST_CATEGORY_UNCATEGORIZED = 0x00,
+	VST_CATEGORY_01            = 0x01,
+	VST_CATEGORY_02            = 0x02,
+	VST_CATEGORY_03            = 0x03,
+	VST_CATEGORY_04            = 0x04,
+	VST_CATEGORY_05            = 0x05,
+	VST_CATEGORY_06            = 0x06,
+	VST_CATEGORY_07            = 0x07,
+	VST_CATEGORY_RESTORATION   = 0x08, // Denoising and similar effects.
+	VST_CATEGORY_09            = 0x09,
+	VST_CATEGORY_CONTAINER     = 0x0A, // Plugin contains more than one Plugin.
+	VST_CATEGORY_0B            = 0x0B,
+	VST_CATEGORY_MAX, // Not part of specification, marks maximum category.
+
+	// Pad to force 32-bit number.
+	_VST_CATEGORY_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_EFFECT_OPCODE {
+	/* Create/Initialize the effect (if it has not been created already).
+	 * 
+	 * @return Always 0.
+	 */
+	VST_EFFECT_OPCODE_00         = 0x00,
+	VST_EFFECT_OPCODE_CREATE     = 0x00,
+	VST_EFFECT_OPCODE_INITIALIZE = 0x00,
+
+	/* Destroy the effect (if there is any) and free its memory.
+	 *
+	 * This should destroy the actual object created by VST_ENTRYPOINT.
+	 * 
+	 * @return Always 0.
+	 */
+	VST_EFFECT_OPCODE_01      = 0x01,
+	VST_EFFECT_OPCODE_DESTROY = 0x01,
+
+	/* Set Program
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_02 = 0x02,
+
+	/* Get Program
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_03 = 0x03,
+
+	/* Set Program Name
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_04 = 0x04,
+
+	/* Get Program Name
+	 *
+	 * "Returns 0. If ptr is valid, sets the first byte of ptr to 0 then returns 0."
+	 */
+	VST_EFFECT_OPCODE_05 = 0x05,
+
+	/* Get the value? label for the parameter.
+	 * 
+	 * @param p_int1 Parameter index.
+	 * @param p_ptr 'char[8]'
+	 * @return 0 on success, 1 on failure.
+	 */
+	VST_EFFECT_OPCODE_06             = 0x06,
+	VST_EFFECT_OPCODE_PARAM_GETLABEL = 0x06,
+
+	/* Get the string value for the parameter.
+	 * 
+	 * @param p_int1 Parameter index.
+	 * @param p_ptr 'char[8]'
+	 * @return 0 on success, 1 on failure.
+	 */
+	VST_EFFECT_OPCODE_07             = 0x07,
+	VST_EFFECT_OPCODE_PARAM_GETVALUE = 0x07,
+
+	/* Get the name for the parameter.
+	 * 
+	 * @param p_int1 Parameter index.
+	 * @param p_ptr 'char[8]'
+	 * @return 0 on success, 1 on failure.
+	 */
+	VST_EFFECT_OPCODE_08            = 0x08,
+	VST_EFFECT_OPCODE_PARAM_GETNAME = 0x08,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_09 = 0x09,
+
+	/* Set the new sample rate for the plugin to use.
+	 * 
+	 * @param p_float New sample rate as a float (double on 64-bit because register upgrades).
+	 */
+	VST_EFFECT_OPCODE_0A              = 0x0A,
+	VST_EFFECT_OPCODE_SETSAMPLERATE   = 0x0A,
+	VST_EFFECT_OPCODE_SET_SAMPLE_RATE = 0x0A,
+
+	/* Sets the block size, which is the maximum number of samples passed into the effect via process calls.
+	 *
+	 * @param p_int2 The maximum number of samples to be passed in.
+	 */
+	VST_EFFECT_OPCODE_0B             = 0x0B,
+	VST_EFFECT_OPCODE_SETBLOCKSIZE   = 0x0B,
+	VST_EFFECT_OPCODE_SET_BLOCK_SIZE = 0x0B,
+
+	/* Effect processing should be suspended/paused.
+	 *
+	 * Unclear if this is should result in a flush of buffers.
+	 * 
+	 * @param p_int2 0 if the effect should suspend processing, 1 if it should resume.
+	 */
+	VST_EFFECT_OPCODE_0C      = 0x0C,
+	VST_EFFECT_OPCODE_SUSPEND = 0x0C,
+
+	/* Retrieve the client rect size of the plugins window.
+	 * If no window has been created, returns the default rect.
+	 *
+	 * @param p_ptr Pointer of type 'struct vst_rect*'.
+	 * @return On success, returns 1 and updates p_ptr to the rect. On failure, returns 0.
+	 */
+	VST_EFFECT_OPCODE_0D             = 0x0D,
+	VST_EFFECT_OPCODE_WINDOW_GETRECT = 0x0D,
+
+	/* Create the window for the plugin.
+	 * 
+	 * @param p_ptr HWND of the parent window.
+	 * @return 0 on failure, or HWND on success.
+	 */
+	VST_EFFECT_OPCODE_0E            = 0x0E,
+	VST_EFFECT_OPCODE_WINDOW_CREATE = 0x0E,
+
+	/* Destroy the plugins window.
+	 * 
+	 * @return Always 0.
+	 */
+	VST_EFFECT_OPCODE_0F             = 0x0F,
+	VST_EFFECT_OPCODE_WINDOW_DESTROY = 0x0F,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_10 = 0x10,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_11 = 0x11,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_12 = 0x12,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_13 = 0x13,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_14 = 0x14,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_15 = 0x15,
+
+	/* Always returns the FourCC 'NvEF' (0x4E764566).
+	 */
+	VST_EFFECT_OPCODE_16 = 0x16,
+
+	/* Get Chunk
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_17 = 0x17,
+
+	/* Set Chunk
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_18 = 0x18,
+
+	// VST2.x starts here.
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_19 = 0x19,
+
+	/* Can the parameter be automated?
+	 *
+	 * @param p_int1 Index of the parameter.
+	 * @return 1 if the parameter can be automated, otherwise 0.
+	 */
+	VST_EFFECT_OPCODE_1A                  = 0x1A,
+	VST_EFFECT_OPCODE_PARAM_ISAUTOMATABLE = 0x1A,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_1B = 0x1B,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_1C = 0x1C,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_1D = 0x1D, // See VST_EFFECT_OPCODE_05
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_1E = 0x1E,
+
+	/* Input connected.
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_1F = 0x1F,
+
+	/* Input disconnected.
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_20 = 0x20,
+
+	/* Retrieve the name of the input channel at the given index.
+	 *
+	 * @param p_int1 Index of the input to get the name for.
+	 * @param p_ptr Pointer to a char* buffer able to hold at minimum 20 characters. Might need to be 32 even.
+	 * @return 0 on failure, 1 on success.
+	 */
+	VST_EFFECT_OPCODE_21                   = 0x21,
+	VST_EFFECT_OPCODE_INPUT_GETCHANNELNAME = 0x21,
+	VST_EFFECT_OPCODE_INPUT_CHANNEL_NAME   = 0x21,
+
+	/* Retrieve the name of the output channel at the given index.
+	 *
+	 * @param p_int1 Index of the output to get the name for.
+	 * @param p_ptr Pointer to a char* buffer able to hold at minimum 20 characters. Might need to be 32 even.
+	 * @return 0 on failure, 1 on success.
+	 */
+	VST_EFFECT_OPCODE_22                    = 0x22,
+	VST_EFFECT_OPCODE_OUTPUT_GETCHANNELNAME = 0x22,
+	VST_EFFECT_OPCODE_OUTPUT_CHANNEL_NAME   = 0x22,
+
+	/* Retrieve category of this effect.
+	 *
+	 * @return The category that this effect is in, see VST_CATEGORY.
+	 */
+	VST_EFFECT_OPCODE_23              = 0x23,
+	VST_EFFECT_OPCODE_EFFECT_CATEGORY = 0x23,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_24 = 0x24,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_25 = 0x25,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_26 = 0x26,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_27 = 0x27,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_28 = 0x28,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_29 = 0x29,
+
+	/* Set the speaker arrangement 
+	 *
+	 * @param p_int2 (vst_speaker_arrangement*) Pointer to a pointer to the speaker arrangement for the input.
+	 * @param p_ptr (vst_speaker_arrangement*) Pointer to a pointer to the speaker arrangement for the output.
+	 */
+	VST_EFFECT_OPCODE_2A                      = 0x2A,
+	VST_EFFECT_OPCODE_SET_SPEAKER_ARRANGEMENT = 0x2A,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_2B = 0x2B,
+
+	/* Enable/Disable bypassing the effect.
+	 *
+	 * @param p_int2 Zero if bypassing the effect is disabled, otherwise 1.
+	 */
+	VST_EFFECT_OPCODE_2C     = 0x2C,
+	VST_EFFECT_OPCODE_BYPASS = 0x2C,
+
+	/* Retrieve the effect name into the ptr buffer.
+	 *
+	 * @param p_ptr char[64] Buffer containing a zero-terminated effect information string. May be shorter than 64 bytes on older hosts.
+	 * @return Always 0, even on failure.
+	 */
+	VST_EFFECT_OPCODE_2D          = 0x2D,
+	VST_EFFECT_OPCODE_GETNAME     = 0x2D,
+	VST_EFFECT_OPCODE_EFFECT_NAME = 0x2D,
+
+	/* Translate an error code to a string.
+	 *
+	 * @param p_ptr char[256] Buffer that should contain a zero-terminated error string.
+	 */
+	VST_EFFECT_OPCODE_2E              = 0x2E,
+	VST_EFFECT_OPCODE_TRANSLATE_ERROR = 0x2E,
+
+	/* Retrieve the vendor name into the ptr buffer.
+	 *
+	 * @param p_ptr char[64] Buffer containing a zero-terminated vendor information string. May be shorter than 64 bytes on older hosts.
+	 * @return Always 0, even on failure.
+	 */
+	VST_EFFECT_OPCODE_2F          = 0x2F,
+	VST_EFFECT_OPCODE_GETVENDOR   = 0x2F,
+	VST_EFFECT_OPCODE_VENDOR_NAME = 0x2F,
+
+	/* See VST_EFFECT_OPCODE_GETNAME
+	 *
+	 * Rarely used, if at all even supported. Not sure what the purpose of this is even.
+	 */
+	VST_EFFECT_OPCODE_30           = 0x30,
+	VST_EFFECT_OPCODE_GETNAME2     = 0x30,
+	VST_EFFECT_OPCODE_PRODUCT_NAME = 0x30,
+
+	/* Retrieve the vendor version in return value.
+	 *
+	 * @return Version.
+	 */
+	VST_EFFECT_OPCODE_31               = 0x31,
+	VST_EFFECT_OPCODE_GETVENDORVERSION = 0x31,
+	VST_EFFECT_OPCODE_VENDOR_VERSION   = 0x31,
+
+	/* User defined OP Code, for custom interaction.
+	 * 
+	 */
+	VST_EFFECT_OPCODE_32     = 0x32,
+	VST_EFFECT_OPCODE_CUSTOM = 0x32,
+
+	/* Test for support of a specific named feature.
+	 * 
+	 * @param p_ptr Pointer to a zero-terminated buffer containing the feature name.
+	 * @return Non-zero if the feature is supported, otherwise 0.
+	 */
+	VST_EFFECT_OPCODE_33       = 0x33,
+	VST_EFFECT_OPCODE_SUPPORTS = 0x33,
+
+	/* Number of samples that are at the tail at the end of playback.
+	 * 
+	 * @return 0 or 1 for no tail, > 1 for number of samples to tail.
+	 */
+	VST_EFFECT_OPCODE_34             = 0x34,
+	VST_EFFECT_OPCODE_GETTAILSAMPLES = 0x34,
+	VST_EFFECT_OPCODE_TAIL_SAMPLES   = 0x34,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_35 = 0x35,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_36 = 0x36,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_37 = 0x37,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_38 = 0x38,
+
+	/* Parameter Properties
+	 *
+	 * @param p_ptr vst_parameter_properties*
+	 * @return 1 if supported, otherwise 0.
+	 */
+	VST_EFFECT_OPCODE_39                       = 0x39,
+	VST_EFFECT_OPCODE_GET_PARAMETER_PROPERTIES = VST_EFFECT_OPCODE_39,
+
+	/* Retrieve the VST Version supported.
+	 *
+	 * @return Return 0 for <2.0, 2 for 2.0, 2100 for 2.1, 2200 for 2.2, 2300 for 2.3, etc.
+	 */
+	VST_EFFECT_OPCODE_3A          = 0x3A,
+	VST_EFFECT_OPCODE_VST_VERSION = 0x3A,
+
+	// VST 2.1 or later
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_3B = 0x3B,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_3C = 0x3C,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_3D = 0x3D,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_3E = 0x3E,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_3F = 0x3F,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_40 = 0x40,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_41 = 0x41,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_42 = 0x42,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_43 = 0x43,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_44 = 0x44,
+
+	// VST 2.3 or later
+
+	/* Retrieve the speaker arrangement.
+	 *
+	 * @param p_int2 (vst_speaker_arrangement**) Pointer to a pointer to the speaker arrangement for the input.
+	 * @param p_ptr (vst_speaker_arrangement**) Pointer to a pointer to the speaker arrangement for the output.
+	 */
+	VST_EFFECT_OPCODE_45                      = 0x45,
+	VST_EFFECT_OPCODE_GET_SPEAKER_ARRANGEMENT = 0x45,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_46 = 0x46,
+
+	/* Begin processing of audio.
+	 *
+	 * 
+	 * 
+	 */
+	VST_EFFECT_OPCODE_PROCESS_BEGIN = 0x47,
+
+	/* End processing of audio.
+	 *
+	 * 
+	 *
+	 */
+	VST_EFFECT_OPCODE_PROCESS_END = 0x48,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_49 = 0x49,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4A = 0x4A,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4B = 0x4B,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4C = 0x4C,
+
+	// VST 2.4 or later
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4D = 0x4D,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4E = 0x4E,
+
+	/*
+	 *
+	 *
+	 */
+	VST_EFFECT_OPCODE_4F = 0x4F,
+
+	// Highest number of known OPCODE.
+	VST_EFFECT_OPCODE_MAX,
+
+	// Pad to force 32-bit number.
+	_VST_EFFECT_OPCODE_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_HOST_OPCODE {
+	/*
+	 * @param int1 -1 or Parameter Index
+	 * @return Expected to return... something.
+	 */
+	VST_HOST_OPCODE_00 = 0x00, // cb(vst, 0x00, ?, 0, 0);
+	VST_HOST_OPCODE_01 = 0x01,
+	VST_HOST_OPCODE_02 = 0x02, // bool cb(0, 0x02, 0, 0, 0);
+	VST_HOST_OPCODE_03 = 0x03,
+	VST_HOST_OPCODE_04 = 0x04,
+	VST_HOST_OPCODE_05 = 0x05,
+	VST_HOST_OPCODE_06 = 0x06,
+	VST_HOST_OPCODE_07 = 0x07,
+	VST_HOST_OPCODE_08 = 0x08,
+	VST_HOST_OPCODE_09 = 0x09,
+	VST_HOST_OPCODE_0A = 0x0A,
+	VST_HOST_OPCODE_0B = 0x0B,
+	VST_HOST_OPCODE_0C = 0x0C,
+	VST_HOST_OPCODE_0D = 0x0D,
+	VST_HOST_OPCODE_0E = 0x0E,
+	VST_HOST_OPCODE_0F = 0x0F,
+	VST_HOST_OPCODE_10 = 0x10,
+	VST_HOST_OPCODE_11 = 0x11,
+	VST_HOST_OPCODE_12 = 0x12,
+	VST_HOST_OPCODE_13 = 0x13,
+	VST_HOST_OPCODE_14 = 0x14,
+	VST_HOST_OPCODE_15 = 0x15,
+	VST_HOST_OPCODE_16 = 0x16,
+	VST_HOST_OPCODE_17 = 0x17,
+	VST_HOST_OPCODE_18 = 0x18,
+	VST_HOST_OPCODE_19 = 0x19,
+	VST_HOST_OPCODE_1A = 0x1A,
+	VST_HOST_OPCODE_1B = 0x1B,
+	VST_HOST_OPCODE_1C = 0x1C,
+	VST_HOST_OPCODE_1D = 0x1D,
+	VST_HOST_OPCODE_1E = 0x1E,
+	VST_HOST_OPCODE_1F = 0x1F,
+	VST_HOST_OPCODE_20 = 0x20,
+	VST_HOST_OPCODE_21 = 0x21,
+	VST_HOST_OPCODE_22 = 0x22,
+	VST_HOST_OPCODE_23 = 0x23,
+	VST_HOST_OPCODE_24 = 0x24,
+	VST_HOST_OPCODE_25 = 0x25,
+	VST_HOST_OPCODE_26 = 0x26,
+	VST_HOST_OPCODE_27 = 0x27,
+	VST_HOST_OPCODE_28 = 0x28,
+	VST_HOST_OPCODE_29 = 0x29,
+	VST_HOST_OPCODE_2A = 0x2A,
+
+	/* Parameter gained focus.
+	 *
+	 * @param int1 Parameter index.
+	 */
+	VST_HOST_OPCODE_2B = 0x2B,
+
+	/* Parameter lost focus.
+	 * 
+	 * @param int1 Parameter index.
+	 */
+	VST_HOST_OPCODE_2C = 0x2C,
+
+	VST_HOST_OPCODE_2D = 0x2D,
+	VST_HOST_OPCODE_2E = 0x2E,
+	VST_HOST_OPCODE_2F = 0x2F,
+
+	// Highest number of known OPCODE.
+	VST_HOST_OPCODE_MAX,
+
+	// Pad to force 32-bit number.
+	_VST_HOST_OPCODE_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_ARRANGEMENT_TYPE {
+	/* Custom speaker arrangement.
+	 *
+	 * Accidentally discovered through random testing.
+	 */
+	VST_ARRANGEMENT_TYPE_CUSTOM = -2,
+
+	/* Unknown/Empty speaker layout.
+	 *
+	 */
+	VST_ARRANGEMENT_TYPE_UNKNOWN = -1,
+
+	/* Mono
+	 */
+	VST_ARRANGEMENT_TYPE_MONO = 0,
+
+	/* Stereo
+	 */
+	VST_ARRANGEMENT_TYPE_STEREO = 1,
+
+	/* 5.1
+	 */
+	VST_ARRANGEMENT_TYPE_5_1 = 0x0F,
+
+	// Pad to force 32-bit number.
+	_VST_ARRANGEMENT_TYPE_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_SPEAKER_TYPE {
+	VST_SPEAKER_TYPE_MONO       = 0,
+	VST_SPEAKER_TYPE_LEFT       = 1,
+	VST_SPEAKER_TYPE_RIGHT      = 2,
+	VST_SPEAKER_TYPE_CENTER     = 3,
+	VST_SPEAKER_TYPE_LFE        = 4,
+	VST_SPEAKER_TYPE_LEFT_SIDE  = 5,
+	VST_SPEAKER_TYPE_RIGHT_SIDE = 6,
+
+	// Pad to force 32-bit number.
+	_VST_SPEAKER_TYPE_PAD = 0xFFFFFFFFul,
+};
+
+enum VST_PARAMETER_FLAGS {
+	/**
+	 * Parameter is an on/off switch.
+	 */
+	VST_PARAMETER_FLAGS_SWITCH = 1,
+	/**
+	 * Limits defined by integers.
+	 */
+	VST_PARAMETER_FLAGS_INTEGER_LIMITS = 1 << 1,
+	/**
+	 * Uses float steps.
+	 */
+	VST_PARAMETER_FLAGS_STEP_FLOAT = 1 << 2,
+	/**
+	 * Uses integer steps.
+	 */
+	VST_PARAMETER_FLAGS_STEP_INT = 1 << 3,
+	/**
+	 * Respect index variable for display ordering.
+	 */
+	VST_PARAMETER_FLAGS_INDEX = 1 << 4,
+	/**
+	 * Respect category value and names.
+	 */
+	VST_PARAMETER_FLAGS_CATEGORY = 1 << 5,
+	VST_PARAMETER_FLAGS_UNKNOWN6 = 1 << 6,
+	_VST_PARAMETER_FLAGS_PAD     = 0xFFFFFFFFul,
+};
+
+/*******************************************************************************
+|* Structures
+|*/
+
+struct vst_rect {
+	int16_t top;
+	int16_t left;
+	int16_t bottom;
+	int16_t right;
+};
+
+struct vst_effect {
+	int32_t magic_number; // Should always be VST_MAGICNUMBER
+
+	// 64-bit adds 4-byte padding here to align pointers.
+
+	/* Control the VST through an opcode and up to four parameters.
+	 * 
+	 * @param this Pointer to the effect itself.
+	 * @param opcode The opcode to run, see VST_EFFECT_OPCODES.
+	 * @param p_int1 Parameter, see VST_EFFECT_OPCODES.
+	 * @param p_int2 Parameter, see VST_EFFECT_OPCODES.
+	 * @param p_ptr Parameter, see VST_EFFECT_OPCODES.
+	 * @param p_float Parameter, see VST_EFFECT_OPCODES.
+	 */
+	intptr_t(VST_FUNCTION_INTERFACE* control)(vst_effect* pthis, VST_EFFECT_OPCODE opcode, int32_t p_int1,
+											  intptr_t p_int2, void* p_ptr, float p_float);
+
+	/* Process the given number of samples in inputs and outputs.
+	 *
+	 * Different to process_float how? Never seen any difference.
+	 * 
+	 * @param pthis Pointer to the effect itself.
+	 * @param inputs Pointer to an array of 'const float[samples]' with size numInputs.
+	 * @param outputs Pointer to an array of 'float[samples]' with size numOutputs.
+	 * @param samples Number of samples per channel in inputs.
+	 */
+	void(VST_FUNCTION_INTERFACE* process)(vst_effect* pthis, const float* const* inputs, float** outputs,
+										  int32_t samples);
+
+	/* Updates the value for the parameter at the given index, or does nothing if out of bounds.
+	 * 
+	 * @param pthis Pointer to the effect itself.
+	 * @param index Parameter index.
+	 * @param value New value for the parameter.
+	 */
+	void(VST_FUNCTION_INTERFACE* set_parameter)(vst_effect* pthis, uint32_t index, float value);
+
+	/* Returns the value stored for the parameter at index, or 0 if out of bounds.
+	 * 
+	 * @param pthis Pointer to the effect itself.
+	 * @param index Parameter index.
+	 * @return float Value of the parameter.
+	 */
+	float(VST_FUNCTION_INTERFACE* get_parameter)(vst_effect* pthis, uint32_t index);
+
+	int32_t num_programs; // Number of possible programs.
+	int32_t num_params;   // Number of possible parameters.
+	int32_t num_inputs;   // Number of inputs.
+	int32_t num_outputs;  // Number of outputs.
+
+	/* Bitflags
+	 * 
+	 * Bit		Description
+	 * 1		Effect has "Editor"
+	 * 2		Unknown (Found in: ReaDelay)
+	 * 3		Unknown (Found in: ReaDelay)
+	 * 4		Unknown (Found in: ReaDelay)
+	 * 5		Has process_float (Found in: ReaDelay, ReaComp, ReaControlMIDI, ReaStream, ReaFir)
+	 * 6		Unknown (Found in: ReaControlMIDI, ReaStream, ReaFir)
+	 * 10		Unknown (Found in: ReaFir)
+	 * 13		Has process_double (Found in: ReaControlMIDI)
+	 */
+	int32_t flags;
+
+	// 64-bit adds 4-byte padding here to align pointers.
+
+	void* _unknown_ptr_00[2];
+
+	/* Initial delay before processing of samples can actually begin in Samples.
+	 *
+	 * Should be updated before or during handling the 0x47 control call. 
+	 */
+	int32_t delay;
+
+	int32_t _unknown_int32_00[2]; // Unknown int32_t values.
+	float   _unknown_float_00;    // Seems to always be 1.0
+
+	void* effect_internal; // Pointer to Plugin internal data
+	void* host_internal;   // Pointer to Host internal data.
+
+	/* Id of the plugin.
+	 *
+	 * Due to this not being enough for uniqueness, it should not be used alone 
+	 * for indexing. Ideally you want to index like this:
+	 *     [unique_id][module_name][version][flags]
+	 * If any of the checks after unique_id fail, you default to the first 
+	 * possible choice.
+	 */
+	int32_t unique_id;
+
+	/* Plugin version
+	 * 
+	 * Unrelated to the minimum VST Version, but often the same.
+	 */
+	int32_t version;
+
+	// There is no padding here if everything went right.
+
+	/* Process the given number of single samples in inputs and outputs.
+	 *
+	 * @param pthis Pointer to the effect itself.
+	 * @param inputs Pointer to an array of 'const float[samples]' with size numInputs.
+	 * @param outputs Pointer to an array of 'float[samples]' with size numOutputs.
+	 * @param samples Number of samples per channel in inputs.
+	 */
+	void(VST_FUNCTION_INTERFACE* process_float)(vst_effect* pthis, const float* const* inputs, float** outputs,
+												int32_t samples);
+
+	/* Process the given number of double samples in inputs and outputs.
+	 *
+	 * Used only by 2.4 hosts and plugins, possibly restricted to said version.
+	 * 
+	 * @param pthis Pointer to the effect itself.
+	 * @param inputs Pointer to an array of 'const double[samples]' with size numInputs.
+	 * @param outputs Pointer to an array of 'double[samples]' with size numOutputs.
+	 * @param samples Number of samples per channel in inputs.
+	 */
+	void(VST_FUNCTION_INTERFACE* process_double)(vst_effect* pthis, const double* const* inputs, double** outputs,
+												 int32_t samples);
+
+	// Everything after this is unknown and was present in reacomp-standalone.dll.
+	uint8_t _unknown[56]; // 56-bytes of something. Could also just be 52-bytes.
+};
+
+struct vst_parameter_properties {
+	float step_f32;
+	float step_small_f32;
+	float step_large_f32;
+
+	char name[VST_BUFFER_64];
+
+	uint32_t flags;
+	int32_t  min_value_i32;
+	int32_t  max_value_i32;
+	int32_t  step_i32;
+
+	char label[VST_BUFFER_8];
+
+	uint16_t index;
+
+	uint16_t category;
+	uint16_t num_parameters_in_category;
+	uint16_t _unknown_00;
+
+	char category_label[VST_BUFFER_24];
+
+	char _unknown_01[VST_BUFFER_16];
+};
+
+struct vst_speaker_properties {
+	float            _unknown_00; // 10.0 if LFE, otherwise random? Never exceeds -PI to PI range.
+	float            _unknown_04; // 10.0 if LFE, otherwise random? Never exceeds -PI to PI range.
+	float            _unknown_08; // 0.0 if LFE, otherwise 1.0.
+	float            _unknown_0C;
+	char             name[VST_BUFFER_64];
+	VST_SPEAKER_TYPE type;
+
+	uint8_t _unknown[28]; // Padding detected from testing.
+};
+
+struct vst_speaker_arrangement {
+	VST_ARRANGEMENT_TYPE   type;                       // See VST_SPEAKER_ARRANGEMENT_TYPE
+	int32_t                channels;                   // Number of channels in speakers.
+	vst_speaker_properties speakers[VST_MAX_CHANNELS]; // Array of speaker properties, actual size defined by channels.
+};
+
+/* Callback used by the plugin to interface with the host.
+ * 
+ * @param opcode See VST_HOST_OPCODE
+ * @param p_str Zero terminated string or null on call.
+ * @return ?
+ */
+typedef intptr_t (*vst_host_callback)(vst_effect* plugin, VST_HOST_OPCODE opcode, int32_t p_int1, int64_t p_int2,
+									  void* p_str, int32_t p_int3);
+
+/* Entry point for VST2.x plugins.
+ *
+ * @return A new instance of the VST2.x effect.
+ */
+#define VST_ENTRYPOINT vst_effect* VSTPluginMain(vst_host_callback callback)
+#define VST_ENTRYPOINT_WINDOWS                   \
+	vst_effect* MAIN(vst_host_callback callback) \
+	{                                            \
+		return VSTPluginMain(callback);          \
+	}
+#define VST_ENTRYPOINT_MACOS                           \
+	vst_effect* main_macho(vst_host_callback callback) \
+	{                                                  \
+		return VSTPluginMain(callback);                \
+	}
+
+#ifdef __cplusplus
+}
+#endif
+
+// Variable size variant of vst_speaker_arrangement.
+#ifdef __cplusplus
+template<size_t T>
+struct vst_speaker_arrangement_t {
+	VST_ARRANGEMENT_TYPE   type;        // See VST_SPEAKER_ARRANGEMENT_TYPE
+	int32_t                channels;    // Number of channels in speakers.
+	vst_speaker_properties speakers[T]; // Array of speaker properties, actual size defined by channels.
+};
+#endif
+
+#pragma pack(pop)
+
+#endif