External plugins for 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.

1506 lines
45KB

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