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.

1459 lines
43KB

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