ardour/libs/vst3/pluginterfaces/vst/ivstevents.h

193 lines
7.5 KiB
C++

//------------------------------------------------------------------------
// Project : VST SDK
//
// Category : Interfaces
// Filename : pluginterfaces/vst/ivstevents.h
// Created by : Steinberg, 11/2005
// Description : VST Events Interfaces
//
//-----------------------------------------------------------------------------
// This file is part of a Steinberg SDK. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this distribution
// and at www.steinberg.net/sdklicenses.
// No part of the SDK, including this file, may be copied, modified, propagated,
// or distributed except according to the terms contained in the LICENSE file.
//-----------------------------------------------------------------------------
#pragma once
#include "pluginterfaces/vst/ivstprocesscontext.h"
#include "pluginterfaces/vst/ivstnoteexpression.h"
//------------------------------------------------------------------------
#include "pluginterfaces/base/falignpush.h"
//------------------------------------------------------------------------
//------------------------------------------------------------------------
namespace Steinberg {
namespace Vst {
//------------------------------------------------------------------------
/** Note-on event specific data. Used in \ref Event (union)*/
struct NoteOnEvent
{
int16 channel; ///< channel index in event bus
int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz
float tuning; ///< 1.f = +1 cent, -1.f = -1 cent
float velocity; ///< range [0.0, 1.0]
int32 length; ///< in sample frames (optional, Note Off has to follow in any case!)
int32 noteId; ///< note identifier (if not available then -1)
};
//------------------------------------------------------------------------
/** Note-off event specific data. Used in \ref Event (union)*/
struct NoteOffEvent
{
int16 channel; ///< channel index in event bus
int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz
float velocity; ///< range [0.0, 1.0]
int32 noteId; ///< associated noteOn identifier (if not available then -1)
float tuning; ///< 1.f = +1 cent, -1.f = -1 cent
};
//------------------------------------------------------------------------
/** Data event specific data. Used in \ref Event (union)*/
struct DataEvent
{
uint32 size; ///< size in bytes of the data block bytes
uint32 type; ///< type of this data block (see \ref DataTypes)
const uint8* bytes; ///< pointer to the data block
/** Value for DataEvent::type */
enum DataTypes
{
kMidiSysEx = 0 ///< for MIDI system exclusive message
};
};
//------------------------------------------------------------------------
/** PolyPressure event specific data. Used in \ref Event (union)*/
struct PolyPressureEvent
{
int16 channel; ///< channel index in event bus
int16 pitch; ///< range [0, 127] = [C-2, G8] with A3=440Hz
float pressure; ///< range [0.0, 1.0]
int32 noteId; ///< event should be applied to the noteId (if not -1)
};
//------------------------------------------------------------------------
/** Chord event specific data. Used in \ref Event (union)*/
struct ChordEvent
{
int16 root; ///< range [0, 127] = [C-2, G8] with A3=440Hz
int16 bassNote; ///< range [0, 127] = [C-2, G8] with A3=440Hz
int16 mask; ///< root is bit 0
uint16 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating
///< null character (without including the terminating null character itself)
const TChar* text; ///< UTF-16, null terminated Hosts Chord Name
};
//------------------------------------------------------------------------
/** Scale event specific data. Used in \ref Event (union)*/
struct ScaleEvent
{
int16 root; ///< range [0, 127] = root Note/Transpose Factor
int16 mask; ///< Bit 0 = C, Bit 1 = C#, ... (0x5ab5 = Major Scale)
uint16 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating
///< null character (without including the terminating null character itself)
const TChar* text; ///< UTF-16, null terminated, Hosts Scale Name
};
//------------------------------------------------------------------------
/** Legacy MIDI CC Out event specific data. Used in \ref Event (union)*/
struct LegacyMIDICCOutEvent
{
uint8 controlNumber;///< see enum ControllerNumbers [0, 255]
int8 channel; ///< channel index in event bus [0, 15]
int8 value; ///< value of Controller [0, 127]
int8 value2; ///< [0, 127] used for pitch bend (kPitchBend) and polyPressure (kCtrlPolyPressure)
};
//------------------------------------------------------------------------
/** Event */
//------------------------------------------------------------------------
struct Event
{
int32 busIndex; ///< event bus index
int32 sampleOffset; ///< sample frames related to the current block start sample position
TQuarterNotes ppqPosition; ///< position in project
uint16 flags; ///< combination of \ref EventFlags
/** Event Flags - used for Event::flags */
enum EventFlags
{
kIsLive = 1 << 0, ///< indicates that the event is played live (directly from keyboard)
kUserReserved1 = 1 << 14, ///< reserved for user (for internal use)
kUserReserved2 = 1 << 15 ///< reserved for user (for internal use)
};
/** Event Types - used for Event::type */
enum EventTypes
{
kNoteOnEvent = 0, ///< is \ref NoteOnEvent
kNoteOffEvent = 1, ///< is \ref NoteOffEvent
kDataEvent = 2, ///< is \ref DataEvent
kPolyPressureEvent = 3, ///< is \ref PolyPressureEvent
kNoteExpressionValueEvent = 4, ///< is \ref NoteExpressionValueEvent
kNoteExpressionTextEvent = 5, ///< is \ref NoteExpressionTextEvent
kChordEvent = 6, ///< is \ref ChordEvent
kScaleEvent = 7, ///< is \ref ScaleEvent
kLegacyMIDICCOutEvent = 65535 ///< is \ref LegacyMIDICCOutEvent
};
uint16 type; ///< a value from \ref EventTypes
union
{
NoteOnEvent noteOn; ///< type == kNoteOnEvent
NoteOffEvent noteOff; ///< type == kNoteOffEvent
DataEvent data; ///< type == kDataEvent
PolyPressureEvent polyPressure; ///< type == kPolyPressureEvent
NoteExpressionValueEvent noteExpressionValue; ///< type == kNoteExpressionValueEvent
NoteExpressionTextEvent noteExpressionText; ///< type == kNoteExpressionTextEvent
ChordEvent chord; ///< type == kChordEvent
ScaleEvent scale; ///< type == kScaleEvent
LegacyMIDICCOutEvent midiCCOut; ///< type == kLegacyMIDICCOutEvent
};
};
//------------------------------------------------------------------------
/** List of events to process.
\ingroup vstIHost vst300
- [host imp]
- [released: 3.0.0]
- [mandatory]
\see ProcessData, Event */
//------------------------------------------------------------------------
class IEventList: public FUnknown
{
public:
//------------------------------------------------------------------------
/** Returns the count of events. */
virtual int32 PLUGIN_API getEventCount () = 0;
/** Gets parameter by index. */
virtual tresult PLUGIN_API getEvent (int32 index, Event& e /*out*/) = 0;
/** Adds a new event. */
virtual tresult PLUGIN_API addEvent (Event& e /*in*/) = 0;
//------------------------------------------------------------------------
static const FUID iid;
};
DECLARE_CLASS_IID (IEventList, 0x3A2C4214, 0x346349FE, 0xB2C4F397, 0xB9695A44)
//------------------------------------------------------------------------
} // namespace Vst
} // namespace Steinberg
//------------------------------------------------------------------------
#include "pluginterfaces/base/falignpop.h"
//------------------------------------------------------------------------