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.

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