25 #ifndef JUCE_VST3COMMON_H_INCLUDED 26 #define JUCE_VST3COMMON_H_INCLUDED 29 #define JUCE_DECLARE_VST3_COM_REF_METHODS \ 30 Steinberg::uint32 PLUGIN_API addRef() override { return (Steinberg::uint32) ++refCount; } \ 31 Steinberg::uint32 PLUGIN_API release() override { const int r = --refCount; if (r == 0) delete this; return (Steinberg::uint32) r; } 33 #define JUCE_DECLARE_VST3_COM_QUERY_METHODS \ 34 Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID, void** obj) override \ 38 return Steinberg::kNotImplemented; \ 41 static bool doUIDsMatch (
const Steinberg::TUID a,
const Steinberg::TUID
b)
noexcept 43 return std::memcmp (a,
b,
sizeof (Steinberg::TUID)) == 0;
46 #define TEST_FOR_AND_RETURN_IF_VALID(iidToTest, ClassType) \ 47 if (doUIDsMatch (iidToTest, ClassType::iid)) \ 50 *obj = dynamic_cast<ClassType*> (this); \ 51 return Steinberg::kResultOk; \ 54 #define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(iidToTest, CommonClassType, SourceClassType) \ 55 if (doUIDsMatch (iidToTest, CommonClassType::iid)) \ 58 *obj = (CommonClassType*) static_cast<SourceClassType*> (this); \ 59 return Steinberg::kResultOk; \ 67 static juce::String toString (
const Steinberg::UString128&
string)
noexcept {
return toString (static_cast<const Steinberg::char16*> (
string)); }
68 static juce::String toString (
const Steinberg::UString256&
string)
noexcept {
return toString (static_cast<const Steinberg::char16*> (
string)); }
70 static void toString128 (Steinberg::Vst::String128 result,
const juce::String& source)
72 Steinberg::UString (result, 128).fromAscii (source.
toUTF8());
81 static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeHWND;
83 static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeNSView;
88 static Steinberg::Vst::SpeakerArrangement getArrangementForBus (Steinberg::Vst::IAudioProcessor* processor,
89 bool isInput,
int busIndex)
91 Steinberg::Vst::SpeakerArrangement arrangement = Steinberg::Vst::SpeakerArr::kEmpty;
93 if (processor !=
nullptr)
94 processor->getBusArrangement (isInput ? Steinberg::Vst::kInput : Steinberg::Vst::kOutput,
103 static Steinberg::Vst::SpeakerArrangement getArrangementForNumChannels (
int numChannels)
noexcept 105 using namespace Steinberg::Vst::SpeakerArr;
109 case 0:
return kEmpty;
110 case 1:
return kMono;
111 case 2:
return kStereo;
112 case 3:
return k30Cine;
113 case 4:
return k31Cine;
116 case 7:
return k61Cine;
117 case 8:
return k71CineFullFront;
120 case 11:
return k101;
121 case 12:
return k111;
122 case 13:
return k130;
123 case 14:
return k131;
124 case 24:
return (Steinberg::Vst::SpeakerArrangement) 1929904127;
131 bi.
setRange (0,
jmin (numChannels, (
int) (
sizeof (Steinberg::Vst::SpeakerArrangement) * 8)),
true);
132 return (Steinberg::Vst::SpeakerArrangement) bi.
toInt64();
136 template <
class ObjectType>
141 ComSmartPtr (ObjectType*
object,
bool autoAddRef =
true)
noexcept : source (
object) {
if (source !=
nullptr && autoAddRef) source->addRef(); }
145 operator ObjectType*()
const noexcept {
return source; }
146 ObjectType*
get()
const noexcept {
return source; }
152 ComSmartPtr& operator= (ObjectType*
const newObjectToTakePossessionOf)
155 std::swap (p.source, source);
165 return o !=
nullptr && o->queryInterface (ObjectType::iid, (
void**) &source) == Steinberg::kResultOk;
168 bool loadFrom (Steinberg::IPluginFactory* factory,
const Steinberg::TUID& uuid)
172 return factory->createInstance (uuid, ObjectType::iid, (
void**) &source) == Steinberg::kResultOk;
205 e = events.getReference ((
int) index);
206 return Steinberg::kResultTrue;
209 return Steinberg::kResultFalse;
212 Steinberg::tresult PLUGIN_API
addEvent (Steinberg::Vst::Event& e)
override 215 return Steinberg::kResultTrue;
221 const int32 numEvents = eventList.getEventCount();
225 Steinberg::Vst::Event e;
227 if (eventList.getEvent (i, e) == Steinberg::kResultOk)
231 case Steinberg::Vst::Event::kNoteOnEvent:
233 createSafeNote (e.noteOn.pitch),
238 case Steinberg::Vst::Event::kNoteOffEvent:
240 createSafeNote (e.noteOff.pitch),
245 case Steinberg::Vst::Event::kPolyPressureEvent:
247 createSafeNote (e.polyPressure.pitch),
248 denormaliseToMidiValue (e.polyPressure.pressure)),
252 case Steinberg::Vst::Event::kDataEvent:
268 int midiEventPosition = 0;
270 enum { maxNumEvents = 2048 };
275 if (++numEvents > maxNumEvents)
278 Steinberg::Vst::Event e = { 0 };
282 e.type = Steinberg::Vst::Event::kNoteOnEvent;
292 e.type = Steinberg::Vst::Event::kNoteOffEvent;
301 e.type = Steinberg::Vst::Event::kDataEvent;
304 e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx;
308 e.type = Steinberg::Vst::Event::kPolyPressureEvent;
309 e.polyPressure.channel = createSafeChannel (msg.
getChannel());
319 e.sampleOffset = midiEventPosition;
335 static float normaliseMidiValue (
int value)
noexcept {
return jlimit (0.0f, 1.0f, (
float) value / 127.0f); }
336 static int denormaliseToMidiValue (
float value)
noexcept {
return roundToInt (
jlimit (0.0f, 127.0f, value * 127.0f)); }
355 int numChannels,
int channelStartOffset,
356 int sampleOffset = 0)
358 const int channelEnd = numChannels + channelStartOffset;
363 for (
int i = channelStartOffset; i < channelEnd; ++i)
367 vstBuffers.numChannels = numChannels;
368 vstBuffers.silenceFlags = 0;
371 static void mapArrangementToBusses (
int& channelIndexOffset,
int index,
373 BusMap& busMapToUse, Steinberg::Vst::SpeakerArrangement arrangement,
378 if (index >= result.
size())
379 result.
add (Steinberg::Vst::AudioBusBuffers());
381 if (index >= busMapToUse.
size())
382 busMapToUse.
add (Bus());
384 if (numChansForBus > 0)
388 source, numChansForBus, channelIndexOffset);
391 channelIndexOffset += numChansForBus;
398 int channelIndexOffset = 0;
400 for (
int i = 0; i < arrangements.
size(); ++i)
401 mapArrangementToBusses (channelIndexOffset, i, result, busMapToUse,
406 Steinberg::Vst::IAudioProcessor& processor,
407 BusMap& busMapToUse,
bool isInput,
int numBusses,
410 int channelIndexOffset = 0;
412 for (
int i = 0; i < numBusses; ++i)
413 mapArrangementToBusses (channelIndexOffset, i,
415 getArrangementForBus (&processor, isInput, i),
420 #endif // JUCE_VST3COMMON_H_INCLUDED Definition: juce_AudioSampleBuffer.h:34
int getAfterTouchValue() const noexcept
Definition: juce_MidiMessage.cpp:406
ObjectType & operator*() const noexcept
Definition: juce_VST3Common.h:147
Definition: juce_BigInteger.h:43
static void toMidiBuffer(MidiBuffer &result, Steinberg::Vst::IEventList &eventList)
Definition: juce_VST3Common.h:219
void clearQuick()
Definition: juce_Array.h:211
static MidiMessage noteOn(int channel, int noteNumber, float velocity) noexcept
Definition: juce_MidiMessage.cpp:525
bool loadFrom(Steinberg::IPluginFactory *factory, const Steinberg::TUID &uuid)
Definition: juce_VST3Common.h:168
ComSmartPtr() noexcept
Definition: juce_VST3Common.h:140
ComSmartPtr(ObjectType *object, bool autoAddRef=true) noexcept
Definition: juce_VST3Common.h:141
int countNumberOfSetBits() const noexcept
Definition: juce_BigInteger.cpp:334
#define noexcept
Definition: juce_CompilerSupport.h:141
CharPointer_UTF8 toUTF8() const
Definition: juce_core.cpp:2058
signed short int16
Definition: juce_MathsFunctions.h:45
Array< Bus > BusMap
Definition: juce_VST3Common.h:345
Type jmin(const Type a, const Type b)
Definition: juce_core.h:113
bool isPositiveAndBelow(Type valueToTest, Type upperLimit) noexcept
Definition: juce_core.h:238
ComSmartPtr(const ComSmartPtr &other) noexcept
Definition: juce_VST3Common.h:142
int roundToInt(const FloatType value) noexcept
Definition: juce_core.h:418
void add(const ElementType &newElement)
Definition: juce_Array.h:392
#define JUCE_DECLARE_VST3_COM_REF_METHODS
Definition: juce_VST3Common.h:29
Definition: juce_core.h:44
long b
Definition: jpegint.h:371
int getNumChannels() const noexcept
Definition: juce_AudioSampleBuffer.h:116
bool isNoteOn(bool returnTrueForVelocity0=false) const noexcept
Definition: juce_MidiMessage.cpp:338
Definition: juce_core.h:44
ElementType & getReference(const int index) const noexcept
Definition: juce_Array.h:274
JOCTET * buffer
Definition: juce_JPEGLoader.cpp:302
void associateBufferTo(Steinberg::Vst::AudioBusBuffers &vstBuffers, Bus &bus, AudioSampleBuffer &buffer, int numChannels, int channelStartOffset, int sampleOffset=0)
Definition: juce_VST3Common.h:352
void addEvent(const MidiMessage &midiMessage, int sampleNumber)
Definition: juce_MidiBuffer.cpp:110
Definition: juce_VST3Common.h:137
bool getNextEvent(MidiMessage &result, int &samplePosition) noexcept
Definition: juce_MidiBuffer.cpp:218
static MidiMessage noteOff(int channel, int noteNumber, uint8 velocity=0) noexcept
Definition: juce_MidiMessage.cpp:539
int16 CharType
Definition: juce_core.h:46
JUCE_DECLARE_VST3_COM_REF_METHODS JUCE_DECLARE_VST3_COM_QUERY_METHODS void clear()
Definition: juce_VST3Common.h:190
float * getWritePointer(int channelNumber) noexcept
Definition: juce_AudioSampleBuffer.h:156
virtual ~MidiEventList()
Definition: juce_VST3Common.h:184
unsigned int uint32
Definition: juce_MathsFunctions.h:51
void setRange(int startBit, int numBits, bool shouldBeSet)
Definition: juce_core.cpp:271
static MidiMessage aftertouchChange(int channel, int noteNumber, int aftertouchAmount) noexcept
Definition: juce_MidiMessage.cpp:412
Steinberg::tresult PLUGIN_API getEvent(Steinberg::int32 index, Steinberg::Vst::Event &e) override
Definition: juce_VST3Common.h:201
static MidiMessage createSysExMessage(const void *sysexData, int dataSize)
Definition: juce_MidiMessage.cpp:593
CharType * getAddress() const noexcept
Definition: juce_core.h:80
ObjectType * operator->() const noexcept
Definition: juce_VST3Common.h:148
int getChannel() const noexcept
Definition: juce_MidiMessage.cpp:307
Steinberg::int32 PLUGIN_API getEventCount() override
Definition: juce_VST3Common.h:195
Definition: juce_VST3Common.h:342
int64 toInt64() const noexcept
Definition: juce_core.cpp:161
#define JUCE_DECLARE_VST3_COM_QUERY_METHODS
Definition: juce_VST3Common.h:33
bool isNoteOff(bool returnTrueForNoteOnVelocity0=true) const noexcept
Definition: juce_MidiMessage.cpp:346
const uint8 * getSysExData() const noexcept
Definition: juce_MidiMessage.cpp:604
~ComSmartPtr()
Definition: juce_VST3Common.h:143
bool operator==(const var &v1, const var &v2) noexcept
Definition: juce_Variant.cpp:565
Type jlimit(const Type lowerLimit, const Type upperLimit, const Type valueToConstrain) noexcept
Definition: juce_MathsFunctions.h:220
bool isSysEx() const noexcept
Definition: juce_MidiMessage.cpp:588
Definition: juce_VST3Common.h:180
uint8 getVelocity() const noexcept
Definition: juce_MidiMessage.cpp:373
CharPointer_UTF16 toUTF16() const
Definition: juce_core.cpp:2059
Steinberg::tresult PLUGIN_API addEvent(Steinberg::Vst::Event &e) override
Definition: juce_VST3Common.h:212
bool isAftertouch() const noexcept
Definition: juce_MidiMessage.cpp:401
ElementType getUnchecked(const int index) const
Definition: juce_Array.h:258
Definition: juce_core.h:40
MidiEventList()
Definition: juce_VST3Common.h:183
ElementType * getRawDataPointer() noexcept
Definition: juce_Array.h:319
Definition: juce_MidiBuffer.h:43
int getSysExDataSize() const noexcept
Definition: juce_MidiMessage.cpp:609
bool operator!=(const var &v1, const var &v2) noexcept
Definition: juce_Variant.cpp:566
static void toEventList(Steinberg::Vst::IEventList &result, MidiBuffer &midiBuffer)
Definition: juce_VST3Common.h:264
unsigned char uint8
Definition: juce_MathsFunctions.h:43
Definition: juce_MidiMessage.h:35
Array< float * > Bus
Definition: juce_VST3Common.h:344
Definition: juce_MidiBuffer.h:171
int size() const noexcept
Definition: juce_Array.h:221
signed int int32
Definition: juce_MathsFunctions.h:49
int getNoteNumber() const noexcept
Definition: juce_MidiMessage.cpp:362
bool loadFrom(Steinberg::FUnknown *o)
Definition: juce_VST3Common.h:162
long long int64
Definition: juce_core.h:61