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.

1490 lines
44KB

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