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.

1493 lines
44KB

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