1 //------------------------------------------------------------------------
4 // Category : Interfaces
5 // Filename : pluginterfaces/vst/ivstnoteexpression.h
6 // Created by : Steinberg, 10/2010
7 // Description : VST Note Expression Interfaces
9 //-----------------------------------------------------------------------------
10 // This file is part of a Steinberg SDK. It is subject to the license terms
11 // in the LICENSE file found in the top-level directory of this distribution
12 // and at www.steinberg.net/sdklicenses.
13 // No part of the SDK, including this file, may be copied, modified, propagated,
14 // or distributed except according to the terms contained in the LICENSE file.
15 //-----------------------------------------------------------------------------
19 #include "pluginterfaces/base/funknown.h"
20 #include "pluginterfaces/vst/vsttypes.h"
22 //------------------------------------------------------------------------
23 #include "pluginterfaces/base/falignpush.h"
24 //------------------------------------------------------------------------
26 //------------------------------------------------------------------------
30 //------------------------------------------------------------------------
31 /** \defgroup vst3typedef VST 3 Data Types */
33 //------------------------------------------------------------------------
34 /** Note Expression Types */
35 typedef uint32 NoteExpressionTypeID
;
36 /** Note Expression Value */
37 typedef double NoteExpressionValue
;
40 //------------------------------------------------------------------------
41 /** NoteExpressionTypeIDs describes the type of the note expression.
42 VST predefines some types like volume, pan, tuning by defining their ranges and curves.
43 Used by NoteExpressionEvent::typeId and NoteExpressionTypeID::typeId
44 \see NoteExpressionTypeInfo
46 enum NoteExpressionTypeIDs
: uint32
48 kVolumeTypeID
= 0, ///< Volume, plain range [0 = -oo , 0.25 = 0dB, 0.5 = +6dB, 1 = +12dB]: plain = 20 * log (4 * norm)
49 kPanTypeID
, ///< Panning (L-R), plain range [0 = left, 0.5 = center, 1 = right]
50 kTuningTypeID
, ///< Tuning, plain range [0 = -120.0 (ten octaves down), 0.5 none, 1 = +120.0 (ten octaves up)]
51 ///< plain = 240 * (norm - 0.5) and norm = plain / 240 + 0.5
52 ///< oneOctave is 12.0 / 240.0; oneHalfTune = 1.0 / 240.0;
53 kVibratoTypeID
, ///< Vibrato
54 kExpressionTypeID
, ///< Expression
55 kBrightnessTypeID
, ///< Brightness
56 kTextTypeID
, ///< See NoteExpressionTextEvent
57 kPhonemeTypeID
, ///< TODO:
59 kCustomStart
= 100000, ///< start of custom note expression type ids
60 kCustomEnd
= 200000, ///< end of custom note expression type ids
62 kInvalidTypeID
= 0xFFFFFFFF ///< indicates an invalid note expression type
65 //------------------------------------------------------------------------
66 /** Description of a Note Expression Type
67 This structure is part of the NoteExpressionTypeInfo structure, it describes for given NoteExpressionTypeID its default value
68 (for example 0.5 for a kTuningTypeID (kIsBipolar: centered)), its minimum and maximum (for predefined NoteExpressionTypeID the full range is predefined too)
69 and a stepCount when the given NoteExpressionTypeID is limited to discrete values (like on/off state).
70 \see NoteExpressionTypeInfo
72 struct NoteExpressionValueDescription
74 NoteExpressionValue defaultValue
; ///< default normalized value [0,1]
75 NoteExpressionValue minimum
; ///< minimum normalized value [0,1]
76 NoteExpressionValue maximum
; ///< maximum normalized value [0,1]
77 int32 stepCount
; ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise - see \ref vst3ParameterIntro)
80 #if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64
81 #include "pluginterfaces/vst/vstpshpack4.h"
83 //------------------------------------------------------------------------
84 /** Note Expression Value event. Used in \ref Event (union)
85 A note expression event affects one single playing note (referring its noteId).
86 This kind of event is send from host to the plug-in like other events (NoteOnEvent, NoteOffEvent,...) in \ref ProcessData during the process call.
87 Note expression events for a specific noteId can only occur after a NoteOnEvent. The host must take care that the event list (\ref IEventList) is properly sorted.
88 Expression events are always absolute normalized values [0.0, 1.0].
89 The predefined types have a predefined mapping of the normalized values (see \ref NoteExpressionTypeIDs)
90 \sa INoteExpressionController
92 struct NoteExpressionValueEvent
94 NoteExpressionTypeID typeId
; ///< see \ref NoteExpressionTypeID
95 int32 noteId
; ///< associated note identifier to apply the change
97 NoteExpressionValue value
; ///< normalized value [0.0, 1.0].
100 //------------------------------------------------------------------------
101 /** Note Expression Text event. Used in Event (union)
102 A Expression event affects one single playing note. \sa INoteExpressionController
104 \see NoteExpressionTypeInfo
106 struct NoteExpressionTextEvent
108 NoteExpressionTypeID typeId
; ///< see \ref NoteExpressionTypeID (kTextTypeID or kPhoneticTypeID)
109 int32 noteId
; ///< associated note identifier to apply the change
111 uint32 textLen
; ///< the number of characters (TChar) between the beginning of text and the terminating
112 ///< null character (without including the terminating null character itself)
114 const TChar
* text
; ///< UTF-16, null terminated
117 #if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64
118 #include "pluginterfaces/base/falignpop.h"
121 //------------------------------------------------------------------------
122 /** NoteExpressionTypeInfo is the structure describing a note expression supported by the plug-in.
123 This structure is used by the method \ref INoteExpressionController::getNoteExpressionInfo.
124 \see INoteExpressionController
126 struct NoteExpressionTypeInfo
128 NoteExpressionTypeID typeId
; ///< unique identifier of this note Expression type
129 String128 title
; ///< note Expression type title (e.g. "Volume")
130 String128 shortTitle
; ///< note Expression type short title (e.g. "Vol")
131 String128 units
; ///< note Expression type unit (e.g. "dB")
132 int32 unitId
; ///< id of unit this NoteExpression belongs to (see \ref vst3Units), in order to sort the note expression, it is possible to use unitId like for parameters. -1 means no unit used.
133 NoteExpressionValueDescription valueDesc
; ///< value description see \ref NoteExpressionValueDescription
134 ParamID associatedParameterId
; ///< optional associated parameter ID (for mapping from note expression to global (using the parameter automation for example) and back). Only used when kAssociatedParameterIDValid is set in flags.
136 int32 flags
; ///< NoteExpressionTypeFlags (see below)
137 enum NoteExpressionTypeFlags
139 kIsBipolar
= 1 << 0, ///< event is bipolar (centered), otherwise unipolar
140 kIsOneShot
= 1 << 1, ///< event occurs only one time for its associated note (at begin of the noteOn)
141 kIsAbsolute
= 1 << 2, ///< This note expression will apply an absolute change to the sound (not relative (offset))
142 kAssociatedParameterIDValid
= 1 << 3,///< indicates that the associatedParameterID is valid and could be used
146 //------------------------------------------------------------------------
147 /** Extended plug-in interface IEditController for note expression event support: Vst::INoteExpressionController
148 \ingroup vstIPlug vst350
150 - [extends IEditController]
154 With this plug-in interface, the host can retrieve all necessary note expression information supported by the plug-in.
155 Note expression information (\ref NoteExpressionTypeInfo) are specific for given channel and event bus.
157 Note that there is only one NoteExpressionTypeID per given channel of an event bus.
159 The method getNoteExpressionStringByValue allows conversion from a normalized value to a string representation
160 and the getNoteExpressionValueByString method from a string to a normalized value.
162 When the note expression state changes (for example when switching presets) the plug-in needs
163 to inform the host about it via \ref IComponentHandler::restartComponent (kNoteExpressionChanged).
165 class INoteExpressionController
: public FUnknown
168 /** Returns number of supported note change types for event bus index and channel. */
169 virtual int32 PLUGIN_API
getNoteExpressionCount (int32 busIndex
, int16 channel
) = 0;
171 /** Returns note change type info. */
172 virtual tresult PLUGIN_API
getNoteExpressionInfo (int32 busIndex
, int16 channel
, int32 noteExpressionIndex
, NoteExpressionTypeInfo
& info
/*out*/) = 0;
174 /** Gets a user readable representation of the normalized note change value. */
175 virtual tresult PLUGIN_API
getNoteExpressionStringByValue (int32 busIndex
, int16 channel
, NoteExpressionTypeID id
, NoteExpressionValue valueNormalized
/*in*/, String128 string
/*out*/) = 0;
177 /** Converts the user readable representation to the normalized note change value. */
178 virtual tresult PLUGIN_API
getNoteExpressionValueByString (int32 busIndex
, int16 channel
, NoteExpressionTypeID id
, const TChar
* string
/*in*/, NoteExpressionValue
& valueNormalized
/*out*/) = 0;
180 //------------------------------------------------------------------------
181 static const FUID iid
;
184 DECLARE_CLASS_IID (INoteExpressionController
, 0xB7F8F859, 0x41234872, 0x91169581, 0x4F3721A3)
186 //------------------------------------------------------------------------
187 //------------------------------------------------------------------------
188 /** KeyswitchTypeIDs describes the type of a key switch
191 enum KeyswitchTypeIDs
: uint32
193 kNoteOnKeyswitchTypeID
= 0, ///< press before noteOn is played
194 kOnTheFlyKeyswitchTypeID
, ///< press while noteOn is played
195 kOnReleaseKeyswitchTypeID
, ///< press before entering release
196 kKeyRangeTypeID
///< key should be maintained pressed for playing
199 typedef uint32 KeyswitchTypeID
;
201 //------------------------------------------------------------------------
202 /** KeyswitchInfo is the structure describing a key switch
203 This structure is used by the method \ref IKeyswitchController::getKeyswitchInfo.
204 \see IKeyswitchController
208 KeyswitchTypeID typeId
; ///< see KeyswitchTypeID
209 String128 title
; ///< name of key switch (e.g. "Accentuation")
210 String128 shortTitle
; ///< short title (e.g. "Acc")
212 int32 keyswitchMin
; ///< associated main key switch min (value between [0, 127])
213 int32 keyswitchMax
; ///< associated main key switch max (value between [0, 127])
214 int32 keyRemapped
; /** optional remapped key switch (default -1), the plug-in could provide one remapped
215 key for a key switch (allowing better location on the keyboard of the key switches) */
217 int32 unitId
; ///< id of unit this key switch belongs to (see \ref vst3Units), -1 means no unit used.
219 int32 flags
; ///< not yet used (set to 0)
222 //------------------------------------------------------------------------
223 /** Extended plug-in interface IEditController for key switches support: Vst::IKeyswitchController
224 \ingroup vstIPlug vst350
226 - [extends IEditController]
230 When a (instrument) plug-in supports such interface, the host could get from the plug-in the current set
231 of used key switches (megatrig/articulation) for a given channel of a event bus and then automatically use them (like in Cubase 6) to
232 create VST Expression Map (allowing to associated symbol to a given articulation / key switch).
234 class IKeyswitchController
: public FUnknown
237 /** Returns number of supported key switches for event bus index and channel. */
238 virtual int32 PLUGIN_API
getKeyswitchCount (int32 busIndex
, int16 channel
) = 0;
240 /** Returns key switch info. */
241 virtual tresult PLUGIN_API
getKeyswitchInfo (int32 busIndex
, int16 channel
, int32 keySwitchIndex
, KeyswitchInfo
& info
/*out*/) = 0;
243 //------------------------------------------------------------------------
244 static const FUID iid
;
247 DECLARE_CLASS_IID (IKeyswitchController
, 0x1F2F76D3, 0xBFFB4B96, 0xB99527A5, 0x5EBCCEF4)
249 //------------------------------------------------------------------------
251 } // namespace Steinberg
253 //------------------------------------------------------------------------
254 #include "pluginterfaces/base/falignpop.h"
255 //------------------------------------------------------------------------