The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
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.

696 lines
24KB

  1. JUCE breaking changes
  2. =====================
  3. Develop
  4. =======
  5. Version 5.3.2
  6. =============
  7. Change
  8. ------
  9. The behaviour of an UndoManager used by an AudioProcessorValueTreeState has
  10. been improved.
  11. Possible Issues
  12. ---------------
  13. If your plug-in contains an UndoManager used by an AudioProcessorValueTreeState
  14. and relies upon the old behaviour of the UndoManager then it is possible that
  15. the new behaviour is no longer appropriate for your use case.
  16. Workaround
  17. ----------
  18. Use an external UndoManager to reproduce the old behaviour manually.
  19. Rationale
  20. ---------
  21. This change fixes a few bugs in the behaviour of an UndoManager used by an
  22. AudioProcessorValueTreeState.
  23. Change
  24. ------
  25. JUCE no longer supports OS X deployment targets earlier than 10.7.
  26. Possible Issues
  27. ---------------
  28. If you were previously targeting OS X 10.5 or 10.6 you will no longer be able
  29. to build JUCE-based products compatible with those platforms.
  30. Workaround
  31. ----------
  32. None. With the appropriate JUCE licence you may be able to backport new JUCE
  33. features, but there will be no official support for this.
  34. Rationale
  35. ---------
  36. Increasing the minimum supported OS X version allows the JUCE codebase to make
  37. use of the more modern C++ features found in the 10.7 standard library, which
  38. in turn will increase thread and memory safety.
  39. Version 5.3.0
  40. =============
  41. Change
  42. ------
  43. The JUCE examples have been cleaned up, modernised and converted into PIPs
  44. (Projucer Instant Projects). The JUCE Demo has been removed and replaced by the
  45. DemoRunner application and larger projects such as the Audio Plugin Host and
  46. the Network Graphics Demo have been moved into the extras directory.
  47. Possible Issues
  48. ---------------
  49. 1. Due to the large number of changes that have occured in the JUCE Git
  50. repository, pulling this version may result in a messy folder structure with
  51. empty directories that have been removed.
  52. 2. The JUCE Demo project is no longer in the JUCE repository.
  53. 3. The Audio Plugin Host project has moved from the examples directory to the
  54. extras directory.
  55. Workaround
  56. ----------
  57. 1. Run a Git clean command (git clean -xdf) in your JUCE directory to remove
  58. all untracked files, directories and build products.
  59. 2. The new DemoRunner application, located in extras/DemoRunner, can be used to
  60. preview all the JUCE examples and see the code side-by-side.
  61. 3. Change any file paths that depended on the plugin host project being located
  62. in the examples directory to use the extras directory instead.
  63. Rationale
  64. ---------
  65. The JUCE examples had inconsistent naming, coding styles and the projects and
  66. build products took up a large amount of space in the repository. Replacing
  67. them with PIPs reduces the file size and allows us to categorise the examples
  68. better, as well as cleaning up the code.
  69. Change
  70. ------
  71. When hosting plug-ins all AudioProcessor methods of managing parameters that
  72. take a parameter index as an argument have been deprecated.
  73. Possible Issues
  74. ---------------
  75. A single assertion will be fired in debug builds on the first use of a
  76. deprecated function.
  77. Workaround
  78. ----------
  79. When hosting plug-ins you should use the AudioProcessor::getParameters() method
  80. and interact with parameters via the returned array of
  81. AudioProcessorParameters. For a short-term fix you can also continue past the
  82. assertion in your debugger, or temporarily modify the JUCE source code to
  83. remove it.
  84. Rationale
  85. ---------
  86. Given the structure of JUCE's API it is impossible to deprecate these functions
  87. using only compile-time messages. Therefore a single assertion, which can be
  88. safely ignored, serves to indicate that these functions should no longer be
  89. used. The move away from the AudioProcessor methods both improves the interface
  90. to that class and makes ongoing development work much easier.
  91. Change
  92. ------
  93. This InAppPurchases class is now a JUCE Singleton. This means that you need
  94. to get an instance via InAppPurchases::getInstance(), instead of storing a
  95. InAppPurchases object yourself.
  96. Possible Issues
  97. ---------------
  98. Any code using InAppPurchases needs to be updated to retrieve a singleton
  99. pointer to InAppPurchases.
  100. Workaround
  101. ----------
  102. Instead of holding a InAppPurchase member yourself, you should get an instance
  103. via InAppPurchases::getInstance(), e.g.
  104. instead of:
  105. InAppPurchases iap;
  106. iap.purchaseProduct (...);
  107. call:
  108. InAppPurchases::getInstance()->purchaseProduct (...);
  109. Rationale
  110. ---------
  111. This change was required to fix an issue on Android where on failed transaction
  112. a listener would not get called.
  113. Change
  114. ------
  115. JUCE's MPE classes have been updated to reflect the official specification
  116. recently approved by the MIDI Manufacturers Association (MMA).
  117. Possible Issues
  118. ---------------
  119. The most significant changes have occurred in the MPEZoneLayout classes and
  120. programs using the higher level MPE classes such as MPEInstrument,
  121. MPESynthesiser, MPESynthesiserBase and MPESynthesiserVoice should be
  122. unaffected.
  123. Previously, any MIDI channel from 1 - 15 could be selected to be the master
  124. channel of an MPE zone, with a specified number of member channels ascending
  125. from the master channel + 1. However, in the new specification this has been
  126. simplified so that a device only has a lower and/or an upper zone, where the
  127. lower zone has master channel 1 and assigns new member channels ascending from
  128. channel 2 and the upper zone has master channel 16 and assigns new member
  129. channels descending from channel 15.
  130. Workaround
  131. ----------
  132. Use the MPEZoneLayout::setLowerZone() and MPEZoneLayout::setUpperZone() methods
  133. to set zone layouts.
  134. Any UI that allows users to select and set zones on an MPE instrument should
  135. also be updated to reflect the specification changes.
  136. Rationale
  137. ---------
  138. The MPE classes in JUCE are out of date and should be updated to reflect the
  139. new, official MPE standard.
  140. Version 5.2.1
  141. =============
  142. Change
  143. ------
  144. Calling JUCEApplicationBase::quit() on Android will now really quit the app,
  145. rather than just placing it in background. Starting with API level 21 (Android
  146. 5.0), the app will not appear in recent apps list after calling quit(). Prior
  147. to API 21, the app will still appear in recent app lists but when a user
  148. chooses the app, a new instance of the app will be started.
  149. Possible Issues
  150. ---------------
  151. Any code calling JUCEApplicationBase::quit() to place the app in background
  152. will close the app instead.
  153. Workaround
  154. ----------
  155. Use Process::hide().
  156. Rationale
  157. ---------
  158. The old behaviour JUCEApplicationBase::quit() was confusing JUCE code, as a new
  159. instance of JUCE app was attempted to be created, while the older instance was
  160. still running in background. This would result in assertions when starting a
  161. second instance.
  162. Change
  163. ------
  164. On Windows, release builds will now link to the dynamic C++ runtime by default
  165. Possible Issues
  166. ---------------
  167. If you are creating a new .jucer project, then your plug-in will now link to
  168. the dynamic C++ runtime by default, which means that you MUST ensure that the
  169. C++ runtime libraries exist on your customer's computers.
  170. Workaround
  171. ----------
  172. If you are only targeting Windows 10, then the C++ runtime is now part of the
  173. system core components and will always exist on the computers of your customers
  174. (just like kernel332.dll, for example). If you are targeting Windows versions
  175. between Vista and Windows 10, then you should build your plug-in with the
  176. latest updated version of VS2015 or later, which ensures that it's linked to
  177. the universal runtime. Universal runtime is part of the system's core libraries
  178. on Windows 10 and on Windows versions Vista to 8.1, it will be available on
  179. your customer's computers via Windows Update. Unfortunately, if your customer
  180. has just installed Windows 8.1 to Vista on a fresh computer, then there is a
  181. chance that the update mechanism for the universal runtime hasn't triggered yet
  182. and your plug-in may still fail. Your installer should prompt the user to
  183. install all the Windows updates in this case or you can deploy the universal
  184. runtime as a redistributable with your installer. If you are targeting earlier
  185. versions of Windows then you should always include the runtime as a
  186. redistributable with your plug-in's installer. Alternatively, you can change
  187. the runtime linking to static (however, see 'Rationale' section).
  188. Rationale
  189. ---------
  190. In a recent update to Windows 10, Microsoft has limited the number of fiber
  191. local storage (FLS) slots per process. Effectively, this limits how many
  192. plug-ins with static runtime linkage can be loaded into a DAW. In the worst
  193. case, this limits the total number of plug-ins to a maximum of 64 plug-ins.
  194. There is no workaround for DAW vendors and the only solution is to push plug-in
  195. vendors to use the dynamic runtime. To help with this, JUCE has decided to make
  196. dynamic runtime linkage the default in JUCE.
  197. Change
  198. ------
  199. AudioProcessorGraph interface has changed in a number of ways - Node objects
  200. are now reference counted, there are different accessor methods to iterate
  201. them, and misc other small improvements to the API
  202. Possible Issues
  203. ---------------
  204. The changes won't cause any silent errors in user code, but will require some
  205. manual refactoring
  206. Workaround
  207. ----------
  208. Just find equivalent new methods to replace existing code.
  209. Rationale
  210. ---------
  211. The graph class was extremely old and creaky, and these changes is the start of
  212. an improvement process that should eventually result in it being broken down
  213. into fundamental graph building block classes for use in other contexts.
  214. Version 5.2.0
  215. =============
  216. Change
  217. ------
  218. Viewport now enables "scroll on drag" mode by default on Android and iOS.
  219. Possible Issues
  220. ---------------
  221. Any code relying on "scroll on drag" mode being turned off by default, should
  222. disable it manually.
  223. Workaround
  224. ----------
  225. None.
  226. Rationale
  227. ---------
  228. It is expected on mobile devices to be able to scroll a list by just a drag,
  229. rather than using a dedicated scrollbar. The scrollbar is still available
  230. though if needed.
  231. Change
  232. ------
  233. The previous setting of Android exporter "Custom manifest xml elements"
  234. creating child nodes of <application> element has been replaced by "Custom
  235. manifest XML content" setting that allows to specify the content of the entire
  236. manifest instead. Any previously values of the old setting will be used in the
  237. new setting by default, and they will need changing as mentioned in Workaround.
  238. The custom content will be merged with the content auto-generated by Projucer.
  239. Any custom elements or custom attributes will override the ones set by
  240. Projucer. Projucer will also automatically add any missing and required
  241. elements and attributes.
  242. Possible Issues
  243. ---------------
  244. If a Projucer project used "Custom manifest xml elements" field, the value will
  245. no longer be compatible with the project generated in the latest Projucer
  246. version. The solution is very simple and quick though, as mentioned in the
  247. Workaround section.
  248. Workaround
  249. ----------
  250. For any elements previously used, simply embed them explicitly in
  251. <manifest><application> elements, for example instead of:
  252. <meta-data android:name="paramId1" android:value="paramValue1"/>
  253. <meta-data android:name="paramId2" android:value="paramValue2"/>
  254. simply write:
  255. <manifest>
  256. <application>
  257. <meta-data android:name="paramId1" android:value="paramValue1"/>
  258. <meta-data android:name="paramId2" android:value="paramValue2"/>
  259. </application>
  260. </manifest>
  261. Rationale
  262. ---------
  263. To maintain the high level of flexibility of generated Android projects and to
  264. avoid creating fields in Projucer for every possible future parameter, it is
  265. simpler to allow to set up the required parameters manually. This way it is not
  266. only possible to add any custom elements but it is also possible to override
  267. the default attributes assigned by Projucer for the required elements. For
  268. instance, if the default value of <supports-screens> element is not
  269. satisfactory because you want a support for x-large screens only, simply set
  270. "Custom manifest XML content" to:
  271. <manifest>
  272. <supports-screens android:xlargeScreens="true"/>
  273. </manifest>
  274. Version 5.1.2
  275. =============
  276. Change
  277. ------
  278. The method used to classify AudioUnit, VST3 and AAX plug-in parameters as
  279. either continuous or discrete has changed, and AudioUnit and AudioUnit v3
  280. parameters are marked as high precision by default.
  281. Possible Issues
  282. ---------------
  283. Plug-ins: DAW projects with automation data written by an AudioUnit, AudioUnit
  284. v3 VST3 or AAX plug-in built with JUCE version 5.1.1 or earlier may load
  285. incorrectly when opened by an AudioUnit, AudioUnit v3, VST3 or AAX plug-in
  286. built with JUCE version 5.1.2 and later.
  287. Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct
  288. values for AU and VST3 plug-ins.
  289. Workaround
  290. ----------
  291. Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the
  292. juce_audio_plugin_client module config page in the Projucer.
  293. Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of
  294. steps for all parameters.
  295. Rationale
  296. ---------
  297. The old system for presenting plug-in parameters to a host as either continuous
  298. or discrete is inconsistent between plug-in types and lacks sufficient
  299. flexibility. This change harmonises the behaviour and allows individual
  300. parameters to be marked as continuous or discrete. If AudioUnit and AudioUnit
  301. v3 parameters are not marked as high precision then hosts like Logic Pro only
  302. offer a limited number of parameter values, which again produces different
  303. behaviour for different plug-in types.
  304. Change
  305. ------
  306. A new FrameRateType fps23976 has been added to AudioPlayHead,
  307. Possible Issues
  308. ---------------
  309. Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976
  310. fps. If your code uses switch statements (or similar) to handle all possible
  311. frame rate types, then this change may cause it to fall through.
  312. Workaround
  313. ----------
  314. Add fps23976 to your switch statement and handle it appropriately.
  315. Rationale
  316. ---------
  317. JUCE should be able to handle all popular frame rate codes but was missing
  318. support for 23.976.
  319. Change
  320. ------
  321. The String (bool) constructor and operator<< (String&, bool) have been
  322. explicitly deleted.
  323. Possible Issues
  324. ---------------
  325. Previous code which relied on an implicit bool to int type conversion to
  326. produce a String will not compile.
  327. Workaround
  328. ----------
  329. Cast your bool to an integer to generate a string representation of it.
  330. Rationale
  331. ---------
  332. Letting things implicitly convert to bool to produce a String opens the door to
  333. all kinds of nasty type conversion edge cases. Furthermore, before this change,
  334. MacOS would automatically convert bools to ints but this wouldn't occur on
  335. different platform. Now the behaviour is consistent across all operating
  336. systems supported by JUCE.
  337. Change
  338. ------
  339. The writeAsJSON virtual method of the DynamicObject class requires an
  340. additional parameter, maximumDecimalPlaces, to specify the maximum precision of
  341. floating point numbers.
  342. Possible Issues
  343. ---------------
  344. Classes which inherit from DynamicObject and override this method will need to
  345. update their method signature.
  346. Workaround
  347. ----------
  348. Your custom DynamicObject class can choose to ignore the additional parameter
  349. if you don't wish to support this behaviour.
  350. Rationale
  351. ---------
  352. When serialising the results of calculations to JSON the rounding of floating
  353. point numbers can result in numbers with 17 significant figures where only a
  354. few are required. This change to DynamicObject is required to support
  355. truncating those numbers.
  356. Version 5.1.0
  357. =============
  358. Change
  359. ------
  360. The option to set the C++ language standard is now located in the project
  361. settings instead of the build configuration settings.
  362. Possible Issues
  363. ---------------
  364. Projects that had a specific verison of the C++ language standard set for
  365. exporter build configurations will instead use the default (C++11) when
  366. re-saving with the new Projucer.
  367. Workaround
  368. ----------
  369. Change the "C++ Language Standard" setting in the main project settings to the
  370. required version - the Projucer will add this value to the exported project as
  371. a compiler flag when saving exporters.
  372. Rationale
  373. ---------
  374. Having a different C++ language standard option for each build configuration
  375. was unnecessary and was not fully implemented for all exporters. Changing it to
  376. a per-project settings means that the preference will propagate to all
  377. exporters and only needs to be set in one place.
  378. Change
  379. ------
  380. PopupMenus now scale according to the AffineTransform and scaling factor of
  381. their target components.
  382. Possible Issues
  383. ---------------
  384. Developers who have manually scaled their PopupMenus to fit the scaling factor
  385. of the parent UI will now have the scaling applied two times in a row.
  386. Workaround
  387. ----------
  388. 1. Do not apply your own manual scaling to make your popups match the UI
  389. scaling
  390. or
  391. 2. Override the Look&Feel method
  392. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  393. return false. See
  394. https://github.com/WeAreROLI/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  395. Rationale
  396. ---------
  397. Previously, PopupMenus would not scale if the GUI of the target component (or
  398. any of it’s parents) were scaled. The only way to scale PopupMenus was via the
  399. global scaling factor. This had several drawbacks as the global scaling factor
  400. would scale everything. This was especially problematic in plug-in editors.
  401. Change
  402. ------
  403. Removed the setSecurityFlags() method from the Windows implementation of
  404. WebInputStream as it disabled HTTPS security features.
  405. Possible Issues
  406. ---------------
  407. Any code previously relying on connections to insecure webpages succeeding will
  408. no longer work.
  409. Workaround
  410. ----------
  411. Check network connectivity on Windows and re-write any code that relied on
  412. insecure connections.
  413. Rationale
  414. ---------
  415. The previous behaviour resulted in network connections on Windows having all
  416. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  417. connections on Windows are now secure and will fail when connecting to an
  418. insecure web address.
  419. Change
  420. ------
  421. Pointer arithmetic on a pointer will have the same result regardless if it is
  422. wrapped in JUCE's Atomic class or not.
  423. Possible Issues
  424. ---------------
  425. Any code using pointer arithmetic on Atomic<T*> will now have a different
  426. result leading to undefined behaviour or crashes.
  427. Workaround
  428. ----------
  429. Re-write your code in a way that it does not depend on your pointer being
  430. wrapped in JUCE's Atomic or not. See rationale.
  431. Rationale
  432. ---------
  433. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  434. confusing results. For example, the following code would assert before this
  435. change:
  436. int* a; Atomic<int*> b;
  437. jassert (++a == ++b);
  438. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  439. Atomic always advances it's underlying pointer by a single byte. The same is
  440. true for operator+=/operator-= and operator--. The difference in behaviour is
  441. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  442. std::atomic.
  443. Version 4.3.1
  444. =============
  445. Change
  446. ------
  447. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  448. Possible Issues
  449. ---------------
  450. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  451. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  452. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  453. JUCE_FORCE_USE_LEGACY_PARAM_IDS are not affected.
  454. Workaround
  455. ----------
  456. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  457. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  458. be sure to use the default value for this property.
  459. Rationale
  460. --------
  461. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  462. native parameter id formats of the various plug-in backends. For VST3 and
  463. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  464. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  465. parameters that have a negative parameter id. Therefore, the hash function for
  466. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  467. Version 4.3.0
  468. =============
  469. Change
  470. ------
  471. A revised multi-bus API was released which supersedes the previously flawed
  472. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  473. Possible Issues
  474. ---------------
  475. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  476. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  477. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  478. this document.
  479. Woraround
  480. ---------
  481. None.
  482. Rationale
  483. --------
  484. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  485. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  486. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  487. compatibility. However, the new multi-bus API is not compatible with the flawed
  488. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  489. Change
  490. ------
  491. JUCE now generates the AAX plug-in bus layout configuration id independent from
  492. the position as it appears in the Projucer’s legacy "Channel layout
  493. configuration" field.
  494. Possible Issues
  495. ---------------
  496. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  497. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  498. versions of JUCE.
  499. Workaround
  500. ----------
  501. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  502. override which AAX plug-in id is associated to a specific bus layout of your
  503. plug-in. This workaround is only necessary if you have released your plug-in
  504. built with a version previous to JUCE 4.3.0.
  505. Rationale
  506. --------
  507. The new multi-bus API offers more features, flexibility and accuracy in
  508. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  509. "Channel layout configuration" field. The native plug-in format backends use
  510. the new multi-bus callback APIs to negotiate channel layouts with the host -
  511. including the AAX plug-in ids assigned to specific bus layouts. With the
  512. callback API, there is no notion of an order in which the channel
  513. configurations appear - as was the case with the legacy "Channel layout
  514. configuration" field - and therefore cannot be used to generate the AAX plug-in
  515. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  516. transparently convert the legacy "Channel layout configuration" field to the
  517. new callback based multi-bus API, but this does not take the order into account
  518. in which the channel configurations appear in the legacy "Channel layout
  519. configuration" field.
  520. Version 4.2.1
  521. =============
  522. Change
  523. ------
  524. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  525. uniquely identify parameters to the host.
  526. Possible Issues
  527. ---------------
  528. DAW projects with automation data written by an audio plug-in built with pre
  529. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  530. JUCE 4.2.1 and later.
  531. Workaround
  532. ----------
  533. Enable JUCE_FORCE_USE_LEGACY_PARAM_IDS in the juce_audio_plugin_client module config
  534. page in the Projucer. For new plug-ins, be sure to disable this property.
  535. Rationale
  536. --------
  537. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  538. host can uniquely identify parameters. The id has a different data-type for
  539. different plug-in types (for example VST uses integers, AAX uses string
  540. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  541. of the parameter, i.e. the first parameter had id zero, the second parameter
  542. had id one, etc. This caused problems for certain plug-in types where JUCE
  543. needs to add internal parameters to the plug-in (for example VST3 requires the
  544. bypass control to be a parameter - so JUCE automatically creates this parameter
  545. for you in the VST3 backend). This causes subtle problems if a parameter is
  546. added to an update of an already published plug-in. The new parameter’s id
  547. would be identical to the id of the bypass parameter in old versions of your
  548. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  549. their plug-in.
  550. Most plug-in backends differentiate between a parameter’s id an index, so this
  551. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  552. unique id from the paramID property of AudioProcessorParameterWithID class.