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.

1457 lines
44KB

  1. /*
  2. * Carla Native Plugins
  3. * Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "CarlaNative.hpp"
  18. #include "CarlaMathUtils.hpp"
  19. #include "Effects/Alienwah.h"
  20. #include "Effects/Chorus.h"
  21. #include "Effects/Distorsion.h"
  22. #include "Effects/DynamicFilter.h"
  23. #include "Effects/Echo.h"
  24. #include "Effects/Phaser.h"
  25. #include "Effects/Reverb.h"
  26. #include "Misc/Allocator.h"
  27. #include "juce_audio_basics.h"
  28. using juce::roundToIntAccurate;
  29. using juce::FloatVectorOperations;
  30. using juce::SharedResourcePointer;
  31. // -----------------------------------------------------------------------
  32. template<class ZynFX>
  33. class FxAbstractPlugin : public NativePluginClass
  34. {
  35. protected:
  36. FxAbstractPlugin(const NativeHostDescriptor* const host, const uint32_t paramCount, const uint32_t programCount)
  37. : NativePluginClass(host),
  38. fParamCount(paramCount-2), // volume and pan handled by host
  39. fProgramCount(programCount),
  40. fBufferSize(getBufferSize()),
  41. fSampleRate(getSampleRate()),
  42. fEffect(nullptr),
  43. efxoutl(nullptr),
  44. efxoutr(nullptr),
  45. leakDetector_FxAbstractPlugin()
  46. {
  47. const int ibufferSize(static_cast<int>(fBufferSize));
  48. efxoutl = new float[fBufferSize];
  49. efxoutr = new float[fBufferSize];
  50. FloatVectorOperations::clear(efxoutl, ibufferSize);
  51. FloatVectorOperations::clear(efxoutr, ibufferSize);
  52. doReinit(true);
  53. }
  54. ~FxAbstractPlugin() override
  55. {
  56. if (efxoutl != nullptr)
  57. {
  58. delete[] efxoutl;
  59. efxoutl = nullptr;
  60. }
  61. if (efxoutr != nullptr)
  62. {
  63. delete[] efxoutr;
  64. efxoutr = nullptr;
  65. }
  66. if (fEffect != nullptr)
  67. {
  68. delete fEffect;
  69. fEffect = nullptr;
  70. }
  71. }
  72. // -------------------------------------------------------------------
  73. // Plugin parameter calls
  74. uint32_t getParameterCount() const final
  75. {
  76. return fParamCount;
  77. }
  78. float getParameterValue(const uint32_t index) const final
  79. {
  80. return static_cast<float>(fEffect->getpar(static_cast<int>(index+2)));
  81. }
  82. // -------------------------------------------------------------------
  83. // Plugin midi-program calls
  84. uint32_t getMidiProgramCount() const final
  85. {
  86. return fProgramCount;
  87. }
  88. // -------------------------------------------------------------------
  89. // Plugin state calls
  90. void setParameterValue(const uint32_t index, const float value) final
  91. {
  92. const int ivalue(roundToIntAccurate(carla_fixValue(0.0f, 127.0f, value)));
  93. fEffect->changepar(static_cast<int>(index+2), static_cast<uchar>(ivalue));
  94. }
  95. void setMidiProgram(const uint8_t, const uint32_t, const uint32_t program) final
  96. {
  97. fEffect->setpreset(static_cast<uchar>(program));
  98. // reset volume and pan
  99. fEffect->changepar(0, 127);
  100. fEffect->changepar(1, 64);
  101. }
  102. // -------------------------------------------------------------------
  103. // Plugin process calls
  104. void activate() final
  105. {
  106. fEffect->cleanup();
  107. }
  108. void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const NativeMidiEvent* const, const uint32_t) final
  109. {
  110. const int iframes(static_cast<int>(frames));
  111. if (outBuffer[0] != inBuffer[0])
  112. FloatVectorOperations::copyWithMultiply(outBuffer[0], inBuffer[0], 0.5f, iframes);
  113. else
  114. FloatVectorOperations::multiply(outBuffer[0], 0.5f, iframes);
  115. if (outBuffer[1] != inBuffer[1])
  116. FloatVectorOperations::copyWithMultiply(outBuffer[1], inBuffer[1], 0.5f, iframes);
  117. else
  118. FloatVectorOperations::multiply(outBuffer[1], 0.5f, iframes);
  119. fEffect->out(Stereo<float*>(inBuffer[0], inBuffer[1]));
  120. FloatVectorOperations::addWithMultiply(outBuffer[0], efxoutl, 0.5f, iframes);
  121. FloatVectorOperations::addWithMultiply(outBuffer[1], efxoutr, 0.5f, iframes);
  122. }
  123. // -------------------------------------------------------------------
  124. // Plugin dispatcher
  125. void bufferSizeChanged(const uint32_t bufferSize) final
  126. {
  127. if (fBufferSize == bufferSize)
  128. return;
  129. fBufferSize = bufferSize;
  130. const int ibufferSize(static_cast<int>(fBufferSize));
  131. delete[] efxoutl;
  132. delete[] efxoutr;
  133. efxoutl = new float[bufferSize];
  134. efxoutr = new float[bufferSize];
  135. FloatVectorOperations::clear(efxoutl, ibufferSize);
  136. FloatVectorOperations::clear(efxoutr, ibufferSize);
  137. doReinit(false);
  138. }
  139. void sampleRateChanged(const double sampleRate) final
  140. {
  141. if (fSampleRate == sampleRate)
  142. return;
  143. fSampleRate = sampleRate;
  144. doReinit(false);
  145. }
  146. void doReinit(const bool firstInit)
  147. {
  148. uchar params[fParamCount];
  149. if (fEffect != nullptr)
  150. {
  151. for (int i=0, count=static_cast<int>(fParamCount); i<count; ++i)
  152. params[i] = fEffect->getpar(i+2);
  153. delete fEffect;
  154. }
  155. EffectParams pars(fAllocator.getObject(), false, efxoutl, efxoutr, 0, static_cast<uint>(fSampleRate), static_cast<int>(fBufferSize));
  156. fEffect = new ZynFX(pars);
  157. if (firstInit)
  158. {
  159. fEffect->setpreset(0);
  160. }
  161. else
  162. {
  163. for (int i=0, count=static_cast<int>(fParamCount); i<count; ++i)
  164. fEffect->changepar(i+2, params[i]);
  165. }
  166. // reset volume and pan
  167. fEffect->changepar(0, 127);
  168. fEffect->changepar(1, 64);
  169. }
  170. // -------------------------------------------------------------------
  171. const uint32_t fParamCount;
  172. const uint32_t fProgramCount;
  173. uint32_t fBufferSize;
  174. double fSampleRate;
  175. Effect* fEffect;
  176. float* efxoutl;
  177. float* efxoutr;
  178. SharedResourcePointer<Allocator> fAllocator;
  179. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxAbstractPlugin)
  180. };
  181. // -----------------------------------------------------------------------
  182. class FxAlienWahPlugin : public FxAbstractPlugin<Alienwah>
  183. {
  184. public:
  185. FxAlienWahPlugin(const NativeHostDescriptor* const host)
  186. : FxAbstractPlugin(host, 11, 4),
  187. leakDetector_FxAlienWahPlugin() {}
  188. protected:
  189. // -------------------------------------------------------------------
  190. // Plugin parameter calls
  191. const NativeParameter* getParameterInfo(const uint32_t index) const override
  192. {
  193. if (index >= fParamCount)
  194. return nullptr;
  195. static NativeParameter param;
  196. static NativeParameterScalePoint scalePoints[2];
  197. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  198. param.name = nullptr;
  199. param.unit = nullptr;
  200. param.ranges.def = 1.0f;
  201. param.ranges.min = 0.0f;
  202. param.ranges.max = 127.0f;
  203. param.ranges.step = 1.0f;
  204. param.ranges.stepSmall = 1.0f;
  205. param.ranges.stepLarge = 20.0f;
  206. param.scalePointCount = 0;
  207. param.scalePoints = nullptr;
  208. switch (index)
  209. {
  210. case 0:
  211. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  212. param.name = "LFO Frequency";
  213. param.ranges.def = 70.0f;
  214. break;
  215. case 1:
  216. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  217. param.name = "LFO Randomness";
  218. param.ranges.def = 0.0f;
  219. break;
  220. case 2:
  221. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN|NATIVE_PARAMETER_USES_SCALEPOINTS;
  222. param.name = "LFO Type";
  223. param.ranges.def = 0.0f;
  224. param.ranges.max = 1.0f;
  225. param.scalePointCount = 2;
  226. param.scalePoints = scalePoints;
  227. scalePoints[0].label = "Sine";
  228. scalePoints[1].label = "Triangle";
  229. scalePoints[0].value = 0.0f;
  230. scalePoints[1].value = 1.0f;
  231. break;
  232. case 3:
  233. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  234. param.name = "LFO Stereo";
  235. param.ranges.def = 62.0f;
  236. break;
  237. case 4:
  238. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  239. param.name = "Depth";
  240. param.ranges.def = 60.0f;
  241. break;
  242. case 5:
  243. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  244. param.name = "Feedback";
  245. param.ranges.def = 105.0f;
  246. break;
  247. case 6:
  248. param.name = "Delay";
  249. param.ranges.def = 25.0f;
  250. param.ranges.min = 1.0f;
  251. param.ranges.max = 100.0f;
  252. break;
  253. case 7:
  254. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  255. param.name = "L/R Cross";
  256. param.ranges.def = 0.0f;
  257. break;
  258. case 8:
  259. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  260. param.name = "Phase";
  261. param.ranges.def = 64.0f;
  262. break;
  263. }
  264. param.hints = static_cast<NativeParameterHints>(hints);
  265. return &param;
  266. }
  267. // -------------------------------------------------------------------
  268. // Plugin midi-program calls
  269. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  270. {
  271. if (index >= fProgramCount)
  272. return nullptr;
  273. static NativeMidiProgram midiProg;
  274. midiProg.bank = 0;
  275. midiProg.program = index;
  276. switch (index)
  277. {
  278. case 0:
  279. midiProg.name = "AlienWah1";
  280. break;
  281. case 1:
  282. midiProg.name = "AlienWah2";
  283. break;
  284. case 2:
  285. midiProg.name = "AlienWah3";
  286. break;
  287. case 3:
  288. midiProg.name = "AlienWah4";
  289. break;
  290. default:
  291. midiProg.name = nullptr;
  292. break;
  293. }
  294. return &midiProg;
  295. }
  296. // -------------------------------------------------------------------
  297. PluginClassEND(FxAlienWahPlugin)
  298. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxAlienWahPlugin)
  299. };
  300. // -----------------------------------------------------------------------
  301. class FxChorusPlugin : public FxAbstractPlugin<Chorus>
  302. {
  303. public:
  304. FxChorusPlugin(const NativeHostDescriptor* const host)
  305. : FxAbstractPlugin(host, 12, 10),
  306. leakDetector_FxChorusPlugin() {}
  307. protected:
  308. // -------------------------------------------------------------------
  309. // Plugin parameter calls
  310. const NativeParameter* getParameterInfo(const uint32_t index) const override
  311. {
  312. if (index >= fParamCount)
  313. return nullptr;
  314. static NativeParameter param;
  315. static NativeParameterScalePoint scalePoints[2];
  316. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  317. param.name = nullptr;
  318. param.unit = nullptr;
  319. param.ranges.def = 1.0f;
  320. param.ranges.min = 0.0f;
  321. param.ranges.max = 127.0f;
  322. param.ranges.step = 1.0f;
  323. param.ranges.stepSmall = 1.0f;
  324. param.ranges.stepLarge = 20.0f;
  325. param.scalePointCount = 0;
  326. param.scalePoints = nullptr;
  327. switch (index)
  328. {
  329. case 0:
  330. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  331. param.name = "LFO Frequency";
  332. param.ranges.def = 50.0f;
  333. break;
  334. case 1:
  335. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  336. param.name = "LFO Randomness";
  337. param.ranges.def = 0.0f;
  338. break;
  339. case 2:
  340. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN|NATIVE_PARAMETER_USES_SCALEPOINTS;
  341. param.name = "LFO Type";
  342. param.ranges.def = 0.0f;
  343. param.ranges.max = 1.0f;
  344. param.scalePointCount = 2;
  345. param.scalePoints = scalePoints;
  346. scalePoints[0].label = "Sine";
  347. scalePoints[1].label = "Triangle";
  348. scalePoints[0].value = 0.0f;
  349. scalePoints[1].value = 1.0f;
  350. break;
  351. case 3:
  352. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  353. param.name = "LFO Stereo";
  354. param.ranges.def = 90.0f;
  355. break;
  356. case 4:
  357. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  358. param.name = "Depth";
  359. param.ranges.def = 40.0f;
  360. break;
  361. case 5:
  362. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  363. param.name = "Delay";
  364. param.ranges.def = 85.0f;
  365. break;
  366. case 6:
  367. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  368. param.name = "Feedback";
  369. param.ranges.def = 64.0f;
  370. break;
  371. case 7:
  372. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  373. param.name = "L/R Cross";
  374. param.ranges.def = 119.0f;
  375. break;
  376. case 8:
  377. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  378. param.name = "Flange Mode";
  379. param.ranges.def = 0.0f;
  380. param.ranges.max = 1.0f;
  381. break;
  382. case 9:
  383. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  384. param.name = "Subtract Output";
  385. param.ranges.def = 0.0f;
  386. param.ranges.max = 1.0f;
  387. break;
  388. }
  389. param.hints = static_cast<NativeParameterHints>(hints);
  390. return &param;
  391. }
  392. // -------------------------------------------------------------------
  393. // Plugin midi-program calls
  394. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  395. {
  396. if (index >= fProgramCount)
  397. return nullptr;
  398. static NativeMidiProgram midiProg;
  399. midiProg.bank = 0;
  400. midiProg.program = index;
  401. switch (index)
  402. {
  403. case 0:
  404. midiProg.name = "Chorus1";
  405. break;
  406. case 1:
  407. midiProg.name = "Chorus2";
  408. break;
  409. case 2:
  410. midiProg.name = "Chorus3";
  411. break;
  412. case 3:
  413. midiProg.name = "Celeste1";
  414. break;
  415. case 4:
  416. midiProg.name = "Celeste2";
  417. break;
  418. case 5:
  419. midiProg.name = "Flange1";
  420. break;
  421. case 6:
  422. midiProg.name = "Flange2";
  423. break;
  424. case 7:
  425. midiProg.name = "Flange3";
  426. break;
  427. case 8:
  428. midiProg.name = "Flange4";
  429. break;
  430. case 9:
  431. midiProg.name = "Flange5";
  432. break;
  433. default:
  434. midiProg.name = nullptr;
  435. break;
  436. }
  437. return &midiProg;
  438. }
  439. // -------------------------------------------------------------------
  440. PluginClassEND(FxChorusPlugin)
  441. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxChorusPlugin)
  442. };
  443. // -----------------------------------------------------------------------
  444. class FxDistortionPlugin : public FxAbstractPlugin<Distorsion>
  445. {
  446. public:
  447. FxDistortionPlugin(const NativeHostDescriptor* const host)
  448. : FxAbstractPlugin(host, 11, 6),
  449. leakDetector_FxDistortionPlugin() {}
  450. protected:
  451. // -------------------------------------------------------------------
  452. // Plugin parameter calls
  453. const NativeParameter* getParameterInfo(const uint32_t index) const override
  454. {
  455. if (index >= fParamCount)
  456. return nullptr;
  457. static NativeParameter param;
  458. static NativeParameterScalePoint scalePoints[14];
  459. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  460. param.name = nullptr;
  461. param.unit = nullptr;
  462. param.ranges.def = 1.0f;
  463. param.ranges.min = 0.0f;
  464. param.ranges.max = 127.0f;
  465. param.ranges.step = 1.0f;
  466. param.ranges.stepSmall = 1.0f;
  467. param.ranges.stepLarge = 20.0f;
  468. param.scalePointCount = 0;
  469. param.scalePoints = nullptr;
  470. switch (index)
  471. {
  472. case 0:
  473. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  474. param.name = "L/R Cross";
  475. param.ranges.def = 35.0f;
  476. break;
  477. case 1:
  478. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  479. param.name = "Drive";
  480. param.ranges.def = 56.0f;
  481. break;
  482. case 2:
  483. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  484. param.name = "Level";
  485. param.ranges.def = 70.0f;
  486. break;
  487. case 3:
  488. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_USES_SCALEPOINTS;
  489. param.name = "Type";
  490. param.ranges.def = 0.0f;
  491. param.ranges.max = 13.0f;
  492. param.scalePointCount = 14;
  493. param.scalePoints = scalePoints;
  494. scalePoints[ 0].label = "Arctangent";
  495. scalePoints[ 1].label = "Asymmetric";
  496. scalePoints[ 2].label = "Pow";
  497. scalePoints[ 3].label = "Sine";
  498. scalePoints[ 4].label = "Quantisize";
  499. scalePoints[ 5].label = "Zigzag";
  500. scalePoints[ 6].label = "Limiter";
  501. scalePoints[ 7].label = "Upper Limiter";
  502. scalePoints[ 8].label = "Lower Limiter";
  503. scalePoints[ 9].label = "Inverse Limiter";
  504. scalePoints[10].label = "Clip";
  505. scalePoints[11].label = "Asym2";
  506. scalePoints[12].label = "Pow2";
  507. scalePoints[13].label = "Sigmoid";
  508. scalePoints[ 0].value = 0.0f;
  509. scalePoints[ 1].value = 1.0f;
  510. scalePoints[ 2].value = 2.0f;
  511. scalePoints[ 3].value = 3.0f;
  512. scalePoints[ 4].value = 4.0f;
  513. scalePoints[ 5].value = 5.0f;
  514. scalePoints[ 6].value = 6.0f;
  515. scalePoints[ 7].value = 7.0f;
  516. scalePoints[ 8].value = 8.0f;
  517. scalePoints[ 9].value = 9.0f;
  518. scalePoints[10].value = 10.0f;
  519. scalePoints[11].value = 11.0f;
  520. scalePoints[12].value = 12.0f;
  521. scalePoints[13].value = 13.0f;
  522. break;
  523. case 4:
  524. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  525. param.name = "Negate";
  526. param.ranges.def = 0.0f;
  527. param.ranges.max = 1.0f;
  528. break;
  529. case 5:
  530. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  531. param.name = "Low-Pass Filter";
  532. param.ranges.def = 96.0f;
  533. break;
  534. case 6:
  535. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  536. param.name = "High-Pass Filter";
  537. param.ranges.def = 0.0f;
  538. break;
  539. case 7:
  540. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  541. param.name = "Stereo";
  542. param.ranges.def = 0.0f;
  543. param.ranges.max = 1.0f;
  544. break;
  545. case 8:
  546. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  547. param.name = "Pre-Filtering";
  548. param.ranges.def = 0.0f;
  549. param.ranges.max = 1.0f;
  550. break;
  551. }
  552. param.hints = static_cast<NativeParameterHints>(hints);
  553. return &param;
  554. }
  555. // -------------------------------------------------------------------
  556. // Plugin midi-program calls
  557. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  558. {
  559. if (index >= fProgramCount)
  560. return nullptr;
  561. static NativeMidiProgram midiProg;
  562. midiProg.bank = 0;
  563. midiProg.program = index;
  564. switch (index)
  565. {
  566. case 0:
  567. midiProg.name = "Overdrive 1";
  568. break;
  569. case 1:
  570. midiProg.name = "Overdrive 2";
  571. break;
  572. case 2:
  573. midiProg.name = "A. Exciter 1";
  574. break;
  575. case 3:
  576. midiProg.name = "A. Exciter 2";
  577. break;
  578. case 4:
  579. midiProg.name = "Guitar Amp";
  580. break;
  581. case 5:
  582. midiProg.name = "Quantisize";
  583. break;
  584. default:
  585. midiProg.name = nullptr;
  586. break;
  587. }
  588. return &midiProg;
  589. }
  590. // -------------------------------------------------------------------
  591. PluginClassEND(FxDistortionPlugin)
  592. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxDistortionPlugin)
  593. };
  594. // -----------------------------------------------------------------------
  595. class FxDynamicFilterPlugin : public FxAbstractPlugin<DynamicFilter>
  596. {
  597. public:
  598. FxDynamicFilterPlugin(const NativeHostDescriptor* const host)
  599. : FxAbstractPlugin(host, 10, 5),
  600. leakDetector_FxDynamicFilterPlugin() {}
  601. protected:
  602. // -------------------------------------------------------------------
  603. // Plugin parameter calls
  604. const NativeParameter* getParameterInfo(const uint32_t index) const override
  605. {
  606. if (index >= fParamCount)
  607. return nullptr;
  608. static NativeParameter param;
  609. static NativeParameterScalePoint scalePoints[2];
  610. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  611. param.name = nullptr;
  612. param.unit = nullptr;
  613. param.ranges.def = 1.0f;
  614. param.ranges.min = 0.0f;
  615. param.ranges.max = 127.0f;
  616. param.ranges.step = 1.0f;
  617. param.ranges.stepSmall = 1.0f;
  618. param.ranges.stepLarge = 20.0f;
  619. param.scalePointCount = 0;
  620. param.scalePoints = nullptr;
  621. switch (index)
  622. {
  623. case 0:
  624. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  625. param.name = "LFO Frequency";
  626. param.ranges.def = 80.0f;
  627. break;
  628. case 1:
  629. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  630. param.name = "LFO Randomness";
  631. param.ranges.def = 0.0f;
  632. break;
  633. case 2:
  634. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN|NATIVE_PARAMETER_USES_SCALEPOINTS;
  635. param.name = "LFO Type";
  636. param.ranges.def = 0.0f;
  637. param.ranges.max = 1.0f;
  638. param.scalePointCount = 2;
  639. param.scalePoints = scalePoints;
  640. scalePoints[0].label = "Sine";
  641. scalePoints[1].label = "Triangle";
  642. scalePoints[0].value = 0.0f;
  643. scalePoints[1].value = 1.0f;
  644. break;
  645. case 3:
  646. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  647. param.name = "LFO Stereo";
  648. param.ranges.def = 64.0f;
  649. break;
  650. case 4:
  651. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  652. param.name = "LFO Depth";
  653. param.ranges.def = 0.0f;
  654. break;
  655. case 5:
  656. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  657. param.name = "Amp sns";
  658. param.ranges.def = 90.0f;
  659. break;
  660. case 6:
  661. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  662. param.name = "Amp sns inv";
  663. param.ranges.def = 0.0f;
  664. param.ranges.max = 1.0f;
  665. break;
  666. case 7:
  667. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  668. param.name = "Amp Smooth";
  669. param.ranges.def = 60.0f;
  670. break;
  671. }
  672. param.hints = static_cast<NativeParameterHints>(hints);
  673. return &param;
  674. }
  675. // -------------------------------------------------------------------
  676. // Plugin midi-program calls
  677. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  678. {
  679. if (index >= fProgramCount)
  680. return nullptr;
  681. static NativeMidiProgram midiProg;
  682. midiProg.bank = 0;
  683. midiProg.program = index;
  684. switch (index)
  685. {
  686. case 0:
  687. midiProg.name = "WahWah";
  688. break;
  689. case 1:
  690. midiProg.name = "AutoWah";
  691. break;
  692. case 2:
  693. midiProg.name = "Sweep";
  694. break;
  695. case 3:
  696. midiProg.name = "VocalMorph1";
  697. break;
  698. case 4:
  699. midiProg.name = "VocalMorph2";
  700. break;
  701. default:
  702. midiProg.name = nullptr;
  703. break;
  704. }
  705. return &midiProg;
  706. }
  707. // -------------------------------------------------------------------
  708. PluginClassEND(FxDynamicFilterPlugin)
  709. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxDynamicFilterPlugin)
  710. };
  711. // -----------------------------------------------------------------------
  712. class FxEchoPlugin : public FxAbstractPlugin<Echo>
  713. {
  714. public:
  715. FxEchoPlugin(const NativeHostDescriptor* const host)
  716. : FxAbstractPlugin(host, 7, 9),
  717. leakDetector_FxEchoPlugin() {}
  718. protected:
  719. // -------------------------------------------------------------------
  720. // Plugin parameter calls
  721. const NativeParameter* getParameterInfo(const uint32_t index) const override
  722. {
  723. if (index >= fParamCount)
  724. return nullptr;
  725. static NativeParameter param;
  726. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  727. param.name = nullptr;
  728. param.unit = nullptr;
  729. param.ranges.def = 1.0f;
  730. param.ranges.min = 0.0f;
  731. param.ranges.max = 127.0f;
  732. param.ranges.step = 1.0f;
  733. param.ranges.stepSmall = 1.0f;
  734. param.ranges.stepLarge = 20.0f;
  735. param.scalePointCount = 0;
  736. param.scalePoints = nullptr;
  737. switch (index)
  738. {
  739. case 0:
  740. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  741. param.name = "Delay";
  742. param.ranges.def = 35.0f;
  743. break;
  744. case 1:
  745. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  746. param.name = "L/R Delay";
  747. param.ranges.def = 64.0f;
  748. break;
  749. case 2:
  750. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  751. param.name = "L/R Cross";
  752. param.ranges.def = 30.0f;
  753. break;
  754. case 3:
  755. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  756. param.name = "Feedback";
  757. param.ranges.def = 59.0f;
  758. break;
  759. case 4:
  760. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  761. param.name = "High Damp";
  762. param.ranges.def = 0.0f;
  763. break;
  764. }
  765. param.hints = static_cast<NativeParameterHints>(hints);
  766. return &param;
  767. }
  768. // -------------------------------------------------------------------
  769. // Plugin midi-program calls
  770. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  771. {
  772. if (index >= fProgramCount)
  773. return nullptr;
  774. static NativeMidiProgram midiProg;
  775. midiProg.bank = 0;
  776. midiProg.program = index;
  777. switch (index)
  778. {
  779. case 0:
  780. midiProg.name = "Echo 1";
  781. break;
  782. case 1:
  783. midiProg.name = "Echo 2";
  784. break;
  785. case 2:
  786. midiProg.name = "Echo 3";
  787. break;
  788. case 3:
  789. midiProg.name = "Simple Echo";
  790. break;
  791. case 4:
  792. midiProg.name = "Canyon";
  793. break;
  794. case 5:
  795. midiProg.name = "Panning Echo 1";
  796. break;
  797. case 6:
  798. midiProg.name = "Panning Echo 2";
  799. break;
  800. case 7:
  801. midiProg.name = "Panning Echo 3";
  802. break;
  803. case 8:
  804. midiProg.name = "Feedback Echo";
  805. break;
  806. default:
  807. midiProg.name = nullptr;
  808. break;
  809. }
  810. return &midiProg;
  811. }
  812. // -------------------------------------------------------------------
  813. PluginClassEND(FxEchoPlugin)
  814. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxEchoPlugin)
  815. };
  816. // -----------------------------------------------------------------------
  817. class FxPhaserPlugin : public FxAbstractPlugin<Phaser>
  818. {
  819. public:
  820. FxPhaserPlugin(const NativeHostDescriptor* const host)
  821. : FxAbstractPlugin(host, 15, 12),
  822. leakDetector_FxPhaserPlugin() {}
  823. protected:
  824. // -------------------------------------------------------------------
  825. // Plugin parameter calls
  826. const NativeParameter* getParameterInfo(const uint32_t index) const override
  827. {
  828. if (index >= fParamCount)
  829. return nullptr;
  830. static NativeParameter param;
  831. static NativeParameterScalePoint scalePoints[2];
  832. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  833. param.name = nullptr;
  834. param.unit = nullptr;
  835. param.ranges.def = 1.0f;
  836. param.ranges.min = 0.0f;
  837. param.ranges.max = 127.0f;
  838. param.ranges.step = 1.0f;
  839. param.ranges.stepSmall = 1.0f;
  840. param.ranges.stepLarge = 20.0f;
  841. param.scalePointCount = 0;
  842. param.scalePoints = nullptr;
  843. switch (index)
  844. {
  845. case 0:
  846. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  847. param.name = "LFO Frequency";
  848. param.ranges.def = 36.0f;
  849. break;
  850. case 1:
  851. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  852. param.name = "LFO Randomness";
  853. param.ranges.def = 0.0f;
  854. break;
  855. case 2:
  856. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN|NATIVE_PARAMETER_USES_SCALEPOINTS;
  857. param.name = "LFO Type";
  858. param.ranges.def = 0.0f;
  859. param.ranges.max = 1.0f;
  860. param.scalePointCount = 2;
  861. param.scalePoints = scalePoints;
  862. scalePoints[0].label = "Sine";
  863. scalePoints[1].label = "Triangle";
  864. scalePoints[0].value = 0.0f;
  865. scalePoints[1].value = 1.0f;
  866. break;
  867. case 3:
  868. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  869. param.name = "LFO Stereo";
  870. param.ranges.def = 64.0f;
  871. break;
  872. case 4:
  873. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  874. param.name = "Depth";
  875. param.ranges.def = 110.0f;
  876. break;
  877. case 5:
  878. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  879. param.name = "Feedback";
  880. param.ranges.def = 64.0f;
  881. break;
  882. case 6:
  883. param.name = "Stages";
  884. param.ranges.def = 1.0f;
  885. param.ranges.min = 1.0f;
  886. param.ranges.max = 12.0f;
  887. break;
  888. case 7:
  889. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  890. param.name = "L/R Cross|Offset";
  891. param.ranges.def = 0.0f;
  892. break;
  893. case 8:
  894. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  895. param.name = "Subtract Output";
  896. param.ranges.def = 0.0f;
  897. param.ranges.max = 1.0f;
  898. break;
  899. case 9:
  900. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  901. param.name = "Phase|Width";
  902. param.ranges.def = 20.0f;
  903. break;
  904. case 10:
  905. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  906. param.name = "Hyper";
  907. param.ranges.def = 0.0f;
  908. param.ranges.max = 1.0f;
  909. break;
  910. case 11:
  911. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  912. param.name = "Distortion";
  913. param.ranges.def = 0.0f;
  914. break;
  915. case 12:
  916. hints |= NATIVE_PARAMETER_IS_AUTOMABLE|NATIVE_PARAMETER_IS_BOOLEAN;
  917. param.name = "Analog";
  918. param.ranges.def = 0.0f;
  919. param.ranges.max = 1.0f;
  920. break;
  921. }
  922. param.hints = static_cast<NativeParameterHints>(hints);
  923. return &param;
  924. }
  925. // -------------------------------------------------------------------
  926. // Plugin midi-program calls
  927. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  928. {
  929. if (index >= fProgramCount)
  930. return nullptr;
  931. static NativeMidiProgram midiProg;
  932. midiProg.bank = 0;
  933. midiProg.program = index;
  934. switch (index)
  935. {
  936. case 0:
  937. midiProg.name = "Phaser 1";
  938. break;
  939. case 1:
  940. midiProg.name = "Phaser 2";
  941. break;
  942. case 2:
  943. midiProg.name = "Phaser 3";
  944. break;
  945. case 3:
  946. midiProg.name = "Phaser 4";
  947. break;
  948. case 4:
  949. midiProg.name = "Phaser 5";
  950. break;
  951. case 5:
  952. midiProg.name = "Phaser 6";
  953. break;
  954. case 6:
  955. midiProg.name = "APhaser 1";
  956. break;
  957. case 7:
  958. midiProg.name = "APhaser 2";
  959. break;
  960. case 8:
  961. midiProg.name = "APhaser 3";
  962. break;
  963. case 9:
  964. midiProg.name = "APhaser 4";
  965. break;
  966. case 10:
  967. midiProg.name = "APhaser 5";
  968. break;
  969. case 11:
  970. midiProg.name = "APhaser 6";
  971. break;
  972. default:
  973. midiProg.name = nullptr;
  974. break;
  975. }
  976. return &midiProg;
  977. }
  978. // -------------------------------------------------------------------
  979. PluginClassEND(FxPhaserPlugin)
  980. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxPhaserPlugin)
  981. };
  982. // -----------------------------------------------------------------------
  983. class FxReverbPlugin : public FxAbstractPlugin<Reverb>
  984. {
  985. public:
  986. FxReverbPlugin(const NativeHostDescriptor* const host)
  987. : FxAbstractPlugin(host, 13, 13),
  988. leakDetector_FxReverbPlugin() {}
  989. protected:
  990. // -------------------------------------------------------------------
  991. // Plugin parameter calls
  992. const NativeParameter* getParameterInfo(const uint32_t index) const override
  993. {
  994. if (index >= fParamCount)
  995. return nullptr;
  996. static NativeParameter param;
  997. static NativeParameterScalePoint scalePoints[3];
  998. int hints = NATIVE_PARAMETER_IS_ENABLED|NATIVE_PARAMETER_IS_INTEGER;
  999. param.name = nullptr;
  1000. param.unit = nullptr;
  1001. param.ranges.def = 1.0f;
  1002. param.ranges.min = 0.0f;
  1003. param.ranges.max = 127.0f;
  1004. param.ranges.step = 1.0f;
  1005. param.ranges.stepSmall = 1.0f;
  1006. param.ranges.stepLarge = 20.0f;
  1007. param.scalePointCount = 0;
  1008. param.scalePoints = nullptr;
  1009. switch (index)
  1010. {
  1011. case 0:
  1012. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  1013. param.name = "Time";
  1014. param.ranges.def = 63.0f;
  1015. break;
  1016. case 1:
  1017. param.name = "Delay";
  1018. param.ranges.def = 24.0f;
  1019. break;
  1020. case 2:
  1021. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  1022. param.name = "Feedback";
  1023. param.ranges.def = 0.0f;
  1024. break;
  1025. case 3:
  1026. hints = 0x0;
  1027. param.name = "bw";
  1028. break;
  1029. case 4:
  1030. hints = 0x0;
  1031. param.name = "E/R";
  1032. break;
  1033. case 5:
  1034. param.name = "Low-Pass Filter";
  1035. param.ranges.def = 85.0f;
  1036. break;
  1037. case 6:
  1038. param.name = "High-Pass Filter";
  1039. param.ranges.def = 5.0f;
  1040. break;
  1041. case 7:
  1042. hints |= NATIVE_PARAMETER_IS_AUTOMABLE;
  1043. param.name = "Damp";
  1044. param.ranges.def = 83.0f;
  1045. param.ranges.min = 64.0f;
  1046. break;
  1047. case 8:
  1048. hints |= NATIVE_PARAMETER_USES_SCALEPOINTS;
  1049. param.name = "Type";
  1050. param.ranges.def = 1.0f;
  1051. param.ranges.max = 2.0f;
  1052. param.scalePointCount = 3;
  1053. param.scalePoints = scalePoints;
  1054. scalePoints[0].label = "Random";
  1055. scalePoints[1].label = "Freeverb";
  1056. scalePoints[2].label = "Bandwidth";
  1057. scalePoints[0].value = 0.0f;
  1058. scalePoints[1].value = 1.0f;
  1059. scalePoints[2].value = 2.0f;
  1060. break;
  1061. case 9:
  1062. param.name = "Room size";
  1063. param.ranges.def = 64.0f;
  1064. param.ranges.min = 1.0f;
  1065. break;
  1066. case 10:
  1067. param.name = "Bandwidth";
  1068. param.ranges.def = 20.0f;
  1069. break;
  1070. }
  1071. param.hints = static_cast<NativeParameterHints>(hints);
  1072. return &param;
  1073. }
  1074. // -------------------------------------------------------------------
  1075. // Plugin midi-program calls
  1076. const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override
  1077. {
  1078. if (index >= fProgramCount)
  1079. return nullptr;
  1080. static NativeMidiProgram midiProg;
  1081. midiProg.bank = 0;
  1082. midiProg.program = index;
  1083. switch (index)
  1084. {
  1085. case 0:
  1086. midiProg.name = "Cathedral1";
  1087. break;
  1088. case 1:
  1089. midiProg.name = "Cathedral2";
  1090. break;
  1091. case 2:
  1092. midiProg.name = "Cathedral3";
  1093. break;
  1094. case 3:
  1095. midiProg.name = "Hall1";
  1096. break;
  1097. case 4:
  1098. midiProg.name = "Hall2";
  1099. break;
  1100. case 5:
  1101. midiProg.name = "Room1";
  1102. break;
  1103. case 6:
  1104. midiProg.name = "Room2";
  1105. break;
  1106. case 7:
  1107. midiProg.name = "Basement";
  1108. break;
  1109. case 8:
  1110. midiProg.name = "Tunnel";
  1111. break;
  1112. case 9:
  1113. midiProg.name = "Echoed1";
  1114. break;
  1115. case 10:
  1116. midiProg.name = "Echoed2";
  1117. break;
  1118. case 11:
  1119. midiProg.name = "VeryLong1";
  1120. break;
  1121. case 12:
  1122. midiProg.name = "VeryLong2";
  1123. break;
  1124. default:
  1125. midiProg.name = nullptr;
  1126. break;
  1127. }
  1128. return &midiProg;
  1129. }
  1130. // -------------------------------------------------------------------
  1131. PluginClassEND(FxReverbPlugin)
  1132. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FxReverbPlugin)
  1133. };
  1134. // -----------------------------------------------------------------------
  1135. static const NativePluginDescriptor fxAlienWahDesc = {
  1136. /* category */ NATIVE_PLUGIN_CATEGORY_MODULATOR,
  1137. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_IS_RTSAFE
  1138. |NATIVE_PLUGIN_USES_PANNING
  1139. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1140. /* supports */ static_cast<NativePluginSupports>(0x0),
  1141. /* audioIns */ 2,
  1142. /* audioOuts */ 2,
  1143. /* midiIns */ 0,
  1144. /* midiOuts */ 0,
  1145. /* paramIns */ 11-2,
  1146. /* paramOuts */ 0,
  1147. /* name */ "ZynAlienWah",
  1148. /* label */ "zynalienwah",
  1149. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1150. /* copyright */ "GNU GPL v2+",
  1151. PluginDescriptorFILL(FxAlienWahPlugin)
  1152. };
  1153. static const NativePluginDescriptor fxChorusDesc = {
  1154. /* category */ NATIVE_PLUGIN_CATEGORY_MODULATOR,
  1155. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_IS_RTSAFE
  1156. |NATIVE_PLUGIN_USES_PANNING
  1157. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1158. /* supports */ static_cast<NativePluginSupports>(0x0),
  1159. /* audioIns */ 2,
  1160. /* audioOuts */ 2,
  1161. /* midiIns */ 0,
  1162. /* midiOuts */ 0,
  1163. /* paramIns */ 12-2,
  1164. /* paramOuts */ 0,
  1165. /* name */ "ZynChorus",
  1166. /* label */ "zynchorus",
  1167. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1168. /* copyright */ "GNU GPL v2+",
  1169. PluginDescriptorFILL(FxChorusPlugin)
  1170. };
  1171. static const NativePluginDescriptor fxDistortionDesc = {
  1172. /* category */ NATIVE_PLUGIN_CATEGORY_MODULATOR,
  1173. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_USES_PANNING
  1174. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1175. /* supports */ static_cast<NativePluginSupports>(0x0),
  1176. /* audioIns */ 2,
  1177. /* audioOuts */ 2,
  1178. /* midiIns */ 0,
  1179. /* midiOuts */ 0,
  1180. /* paramIns */ 11-2,
  1181. /* paramOuts */ 0,
  1182. /* name */ "ZynDistortion",
  1183. /* label */ "zyndistortion",
  1184. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1185. /* copyright */ "GNU GPL v2+",
  1186. PluginDescriptorFILL(FxDistortionPlugin)
  1187. };
  1188. static const NativePluginDescriptor fxDynamicFilterDesc = {
  1189. /* category */ NATIVE_PLUGIN_CATEGORY_FILTER,
  1190. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_USES_PANNING
  1191. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1192. /* supports */ static_cast<NativePluginSupports>(0x0),
  1193. /* audioIns */ 2,
  1194. /* audioOuts */ 2,
  1195. /* midiIns */ 0,
  1196. /* midiOuts */ 0,
  1197. /* paramIns */ 10-2,
  1198. /* paramOuts */ 0,
  1199. /* name */ "ZynDynamicFilter",
  1200. /* label */ "zyndynamicfilter",
  1201. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1202. /* copyright */ "GNU GPL v2+",
  1203. PluginDescriptorFILL(FxDynamicFilterPlugin)
  1204. };
  1205. static const NativePluginDescriptor fxEchoDesc = {
  1206. /* category */ NATIVE_PLUGIN_CATEGORY_DELAY,
  1207. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_IS_RTSAFE
  1208. |NATIVE_PLUGIN_USES_PANNING
  1209. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1210. /* supports */ static_cast<NativePluginSupports>(0x0),
  1211. /* audioIns */ 2,
  1212. /* audioOuts */ 2,
  1213. /* midiIns */ 0,
  1214. /* midiOuts */ 0,
  1215. /* paramIns */ 7-2,
  1216. /* paramOuts */ 0,
  1217. /* name */ "ZynEcho",
  1218. /* label */ "zynecho",
  1219. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1220. /* copyright */ "GNU GPL v2+",
  1221. PluginDescriptorFILL(FxEchoPlugin)
  1222. };
  1223. static const NativePluginDescriptor fxPhaserDesc = {
  1224. /* category */ NATIVE_PLUGIN_CATEGORY_MODULATOR,
  1225. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_USES_PANNING
  1226. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1227. /* supports */ static_cast<NativePluginSupports>(0x0),
  1228. /* audioIns */ 2,
  1229. /* audioOuts */ 2,
  1230. /* midiIns */ 0,
  1231. /* midiOuts */ 0,
  1232. /* paramIns */ 15-2,
  1233. /* paramOuts */ 0,
  1234. /* name */ "ZynPhaser",
  1235. /* label */ "zynphaser",
  1236. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1237. /* copyright */ "GNU GPL v2+",
  1238. PluginDescriptorFILL(FxPhaserPlugin)
  1239. };
  1240. static const NativePluginDescriptor fxReverbDesc = {
  1241. /* category */ NATIVE_PLUGIN_CATEGORY_DELAY,
  1242. /* hints */ static_cast<NativePluginHints>(NATIVE_PLUGIN_USES_PANNING
  1243. |NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS),
  1244. /* supports */ static_cast<NativePluginSupports>(0x0),
  1245. /* audioIns */ 2,
  1246. /* audioOuts */ 2,
  1247. /* midiIns */ 0,
  1248. /* midiOuts */ 0,
  1249. /* paramIns */ 13-2,
  1250. /* paramOuts */ 0,
  1251. /* name */ "ZynReverb",
  1252. /* label */ "zynreverb",
  1253. /* maker */ "falkTX, Mark McCurry, Nasca Octavian Paul",
  1254. /* copyright */ "GNU GPL v2+",
  1255. PluginDescriptorFILL(FxReverbPlugin)
  1256. };
  1257. // -----------------------------------------------------------------------
  1258. CARLA_EXPORT
  1259. void carla_register_native_plugin_zynaddsubfx_fx();
  1260. CARLA_EXPORT
  1261. void carla_register_native_plugin_zynaddsubfx_fx()
  1262. {
  1263. carla_register_native_plugin(&fxAlienWahDesc);
  1264. carla_register_native_plugin(&fxChorusDesc);
  1265. carla_register_native_plugin(&fxDistortionDesc);
  1266. carla_register_native_plugin(&fxDynamicFilterDesc);
  1267. carla_register_native_plugin(&fxEchoDesc);
  1268. carla_register_native_plugin(&fxPhaserDesc);
  1269. carla_register_native_plugin(&fxReverbDesc);
  1270. }
  1271. // -----------------------------------------------------------------------