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.

1504 lines
45KB

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