Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
12KB

  1. //------------------------------------------------------------------------
  2. // Project : VST SDK
  3. //
  4. // Category : Interfaces
  5. // Filename : pluginterfaces/vst/ivstnoteexpression.h
  6. // Created by : Steinberg, 10/2010
  7. // Description : VST Note Expression Interfaces
  8. //
  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. //-----------------------------------------------------------------------------
  16. #pragma once
  17. #include "pluginterfaces/base/funknown.h"
  18. #include "vsttypes.h"
  19. //------------------------------------------------------------------------
  20. #include "pluginterfaces/base/falignpush.h"
  21. //------------------------------------------------------------------------
  22. namespace Steinberg {
  23. namespace Vst {
  24. typedef uint32 NoteExpressionTypeID;
  25. typedef double NoteExpressionValue;
  26. //------------------------------------------------------------------------
  27. /** NoteExpressionTypeIDs describes the type of the note expression.
  28. VST predefines some types like volume, pan, tuning by defining their ranges and curves.
  29. Used by NoteExpressionEvent::typeId and NoteExpressionTypeID::typeId
  30. \see NoteExpressionTypeInfo
  31. */
  32. enum NoteExpressionTypeIDs : uint32
  33. {
  34. kVolumeTypeID = 0, ///< Volume, plain range [0 = -oo , 0.25 = 0dB, 0.5 = +6dB, 1 = +12dB]: plain = 20 * log (4 * norm)
  35. kPanTypeID, ///< Panning (L-R), plain range [0 = left, 0.5 = center, 1 = right]
  36. kTuningTypeID, ///< Tuning, plain range [0 = -120.0 (ten octaves down), 0.5 none, 1 = +120.0 (ten octaves up)]
  37. ///< plain = 240 * (norm - 0.5) and norm = plain / 240 + 0.5
  38. ///< oneOctave is 12.0 / 240.0; oneHalfTune = 1.0 / 240.0;
  39. kVibratoTypeID, ///< Vibrato
  40. kExpressionTypeID, ///< Expression
  41. kBrightnessTypeID, ///< Brightness
  42. kTextTypeID, ///< TODO:
  43. kPhonemeTypeID, ///< TODO:
  44. kCustomStart = 100000, ///< start of custom note expression type ids
  45. kCustomEnd = 200000, ///< end of custom note expression type ids
  46. kInvalidTypeID = 0xFFFFFFFF ///< indicates an invalid note expression type
  47. };
  48. //------------------------------------------------------------------------
  49. /** Description of a Note Expression Type
  50. This structure is part of the NoteExpressionTypeInfo structure, it describes for given NoteExpressionTypeID its default value
  51. (for example 0.5 for a kTuningTypeID (kIsBipolar: centered)), its minimum and maximum (for predefined NoteExpressionTypeID the full range is predefined too)
  52. and a stepCount when the given NoteExpressionTypeID is limited to discrete values (like on/off state).
  53. \see NoteExpressionTypeInfo
  54. */
  55. //------------------------------------------------------------------------
  56. struct NoteExpressionValueDescription
  57. {
  58. NoteExpressionValue defaultValue; ///< default normalized value [0,1]
  59. NoteExpressionValue minimum; ///< minimum normalized value [0,1]
  60. NoteExpressionValue maximum; ///< maximum normalized value [0,1]
  61. int32 stepCount; ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise - see \ref vst3parameterIntro)
  62. };
  63. #if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64
  64. #include "pluginterfaces/vst/vstpshpack4.h"
  65. #endif
  66. //------------------------------------------------------------------------
  67. /** Note Expression Value event. Used in \ref Event (union)
  68. A note expression event affects one single playing note (referring its noteId).
  69. This kind of event is send from host to the Plug-in like other events (NoteOnEvent, NoteOffEvent,...) in \ref ProcessData during the process call.
  70. 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.
  71. Expression events are always absolute normalized values [0.0, 1.0].
  72. The predefined types have a predefined mapping of the normalized values (see \ref NoteExpressionTypeIDs)
  73. \sa INoteExpressionController
  74. */
  75. //------------------------------------------------------------------------
  76. struct NoteExpressionValueEvent
  77. {
  78. NoteExpressionTypeID typeId; ///< see \ref NoteExpressionTypeID
  79. int32 noteId; ///< associated note identifier to apply the change
  80. NoteExpressionValue value; ///< normalized value [0.0, 1.0].
  81. };
  82. //------------------------------------------------------------------------
  83. /** Note Expression Text event. Used in Event (union)
  84. A Expression event affects one single playing note. \sa INoteExpressionController
  85. \see NoteExpressionTypeInfo*/
  86. //------------------------------------------------------------------------
  87. struct NoteExpressionTextEvent
  88. {
  89. NoteExpressionTypeID typeId; ///< see \ref NoteExpressionTypeID (kTextTypeID or kPhoneticTypeID)
  90. int32 noteId; ///< associated note identifier to apply the change
  91. uint32 textLen; ///< the number of characters (TChar) between the beginning of text and the terminating
  92. ///< null character (without including the terminating null character itself)
  93. const TChar* text; ///< UTF-16, null terminated
  94. };
  95. #if SMTG_OS_WINDOWS && !SMTG_PLATFORM_64
  96. #include "pluginterfaces/base/falignpop.h"
  97. #endif
  98. //------------------------------------------------------------------------
  99. /** NoteExpressionTypeInfo is the structure describing a note expression supported by the Plug-in.
  100. This structure is used by the method \ref INoteExpressionController::getNoteExpressionInfo.
  101. \see INoteExpressionController
  102. */
  103. //------------------------------------------------------------------------
  104. struct NoteExpressionTypeInfo
  105. {
  106. NoteExpressionTypeID typeId; ///< unique identifier of this note Expression type
  107. String128 title; ///< note Expression type title (e.g. "Volume")
  108. String128 shortTitle; ///< note Expression type short title (e.g. "Vol")
  109. String128 units; ///< note Expression type unit (e.g. "dB")
  110. int32 unitId; ///< id of unit this NoteExpression belongs to (see \ref vst3UnitsIntro), in order to sort the note expression, it is possible to use unitId like for parameters. -1 means no unit used.
  111. NoteExpressionValueDescription valueDesc; ///< value description see \ref NoteExpressionValueDescription
  112. 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.
  113. int32 flags; ///< NoteExpressionTypeFlags (see below)
  114. enum NoteExpressionTypeFlags
  115. {
  116. kIsBipolar = 1 << 0, ///< event is bipolar (centered), otherwise unipolar
  117. kIsOneShot = 1 << 1, ///< event occurs only one time for its associated note (at begin of the noteOn)
  118. kIsAbsolute = 1 << 2, ///< This note expression will apply an absolute change to the sound (not relative (offset))
  119. kAssociatedParameterIDValid = 1 << 3,///< indicates that the associatedParameterID is valid and could be used
  120. };
  121. };
  122. //------------------------------------------------------------------------
  123. /** Extended Plug-in interface IEditController for note expression event support
  124. \ingroup vstIPlug vst350
  125. - [plug imp]
  126. - [extends IEditController]
  127. - [released: 3.5.0]
  128. - [optional]
  129. With this Plug-in interface, the host can retrieve all necessary note expression information supported by the Plug-in.
  130. Note expression information (\ref NoteExpressionTypeInfo) are specific for given channel and event bus.
  131. Note that there is only one NoteExpressionTypeID per given channel of an event bus.
  132. The method getNoteExpressionStringByValue allows conversion from a normalized value to a string representation
  133. and the getNoteExpressionValueByString method from a string to a normalized value.
  134. When the note expression state changes (for example when switching presets) the Plug-in needs
  135. to inform the host about it via \ref IComponentHandler::restartComponent (kNoteExpressionChanged).
  136. */
  137. //------------------------------------------------------------------------
  138. class INoteExpressionController: public FUnknown
  139. {
  140. public:
  141. /** Returns number of supported note change types for event bus index and channel. */
  142. virtual int32 PLUGIN_API getNoteExpressionCount (int32 busIndex, int16 channel) = 0;
  143. /** Returns note change type info. */
  144. virtual tresult PLUGIN_API getNoteExpressionInfo (int32 busIndex, int16 channel, int32 noteExpressionIndex, NoteExpressionTypeInfo& info /*out*/) = 0;
  145. /** Gets a user readable representation of the normalized note change value. */
  146. virtual tresult PLUGIN_API getNoteExpressionStringByValue (int32 busIndex, int16 channel, NoteExpressionTypeID id, NoteExpressionValue valueNormalized /*in*/, String128 string /*out*/) = 0;
  147. /** Converts the user readable representation to the normalized note change value. */
  148. virtual tresult PLUGIN_API getNoteExpressionValueByString (int32 busIndex, int16 channel, NoteExpressionTypeID id, const TChar* string /*in*/, NoteExpressionValue& valueNormalized /*out*/) = 0;
  149. //------------------------------------------------------------------------
  150. static const FUID iid;
  151. };
  152. DECLARE_CLASS_IID (INoteExpressionController, 0xB7F8F859, 0x41234872, 0x91169581, 0x4F3721A3)
  153. //------------------------------------------------------------------------
  154. //------------------------------------------------------------------------
  155. /** KeyswitchTypeIDs describes the type of a key switch
  156. \see KeyswitchInfo
  157. */
  158. enum KeyswitchTypeIDs : uint32
  159. {
  160. kNoteOnKeyswitchTypeID = 0, ///< press before noteOn is played
  161. kOnTheFlyKeyswitchTypeID, ///< press while noteOn is played
  162. kOnReleaseKeyswitchTypeID, ///< press before entering release
  163. kKeyRangeTypeID ///< key should be maintained pressed for playing
  164. };
  165. typedef uint32 KeyswitchTypeID;
  166. //------------------------------------------------------------------------
  167. /** KeyswitchInfo is the structure describing a key switch
  168. This structure is used by the method \ref IKeyswitchController::getKeyswitchInfo.
  169. \see IKeyswitchController
  170. */
  171. struct KeyswitchInfo
  172. {
  173. KeyswitchTypeID typeId; ///< see KeyswitchTypeID
  174. String128 title; ///< name of key switch (e.g. "Accentuation")
  175. String128 shortTitle; ///< short title (e.g. "Acc")
  176. int32 keyswitchMin; ///< associated main key switch min (value between [0, 127])
  177. int32 keyswitchMax; ///< associated main key switch max (value between [0, 127])
  178. int32 keyRemapped; /** optional remapped key switch (default -1), the Plug-in could provide one remapped
  179. key for a key switch (allowing better location on the keyboard of the key switches) */
  180. int32 unitId; ///< id of unit this key switch belongs to (see \ref vst3UnitsIntro), -1 means no unit used.
  181. int32 flags; ///< not yet used (set to 0)
  182. };
  183. //------------------------------------------------------------------------
  184. /** Extended Plug-in interface IEditController for key switches support
  185. \ingroup vstIPlug vst350
  186. - [plug imp]
  187. - [extends IEditController]
  188. - [released: 3.5.0]
  189. - [optional]
  190. When a (instrument) Plug-in supports such interface, the host could get from the Plug-in the current set
  191. of used key switches (megatrig/articulation) for a given channel of a event bus and then automatically use them (like in Cubase 6) to
  192. create VST Expression Map (allowing to associated symbol to a given articulation / key switch).
  193. */
  194. //------------------------------------------------------------------------
  195. class IKeyswitchController: public FUnknown
  196. {
  197. public:
  198. /** Returns number of supported key switches for event bus index and channel. */
  199. virtual int32 PLUGIN_API getKeyswitchCount (int32 busIndex, int16 channel) = 0;
  200. /** Returns key switch info. */
  201. virtual tresult PLUGIN_API getKeyswitchInfo (int32 busIndex, int16 channel, int32 keySwitchIndex, KeyswitchInfo& info /*out*/) = 0;
  202. //------------------------------------------------------------------------
  203. static const FUID iid;
  204. };
  205. DECLARE_CLASS_IID (IKeyswitchController, 0x1F2F76D3, 0xBFFB4B96, 0xB99527A5, 0x5EBCCEF4)
  206. //------------------------------------------------------------------------
  207. } // namespace Vst
  208. } // namespace Steinberg
  209. //------------------------------------------------------------------------
  210. #include "pluginterfaces/base/falignpop.h"
  211. //------------------------------------------------------------------------