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.

1468 lines
42KB

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