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.

730 lines
21KB

  1. /*
  2. * Carla Native Plugins
  3. * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "CarlaNative.hpp"
  18. using namespace juce;
  19. #include "vex/cArp.h"
  20. #include "vex/cChorus.h"
  21. #include "vex/cDelay.h"
  22. #include "vex/cReverb.h"
  23. // -----------------------------------------------------------------------
  24. class VexArpPlugin : public PluginClass
  25. {
  26. public:
  27. enum Params {
  28. kParamOnOff = 0,
  29. kParamLength,
  30. kParamTimeMode,
  31. kParamSyncMode,
  32. kParamFailMode,
  33. kParamVelMode,
  34. kParamCount
  35. };
  36. VexArpPlugin(const HostDescriptor* const host)
  37. : PluginClass(host),
  38. fSettings(),
  39. fArp(&fSettings)
  40. {
  41. for (int i=0; i < 8; ++i)
  42. fSettings.grid[i*10] = true;
  43. fSettings.grid[1] = true;
  44. fSettings.grid[2] = true;
  45. fSettings.grid[3] = true;
  46. fSettings.grid[41] = true;
  47. fSettings.grid[42] = true;
  48. fSettings.grid[43] = true;
  49. fSettings.grid[44] = true;
  50. fSettings.grid[45] = true;
  51. fArp.setSampleRate(getSampleRate());
  52. fMidiInBuffer.ensureSize(512*4);
  53. }
  54. protected:
  55. // -------------------------------------------------------------------
  56. // Plugin parameter calls
  57. uint32_t getParameterCount() const override
  58. {
  59. return kParamCount;
  60. }
  61. const Parameter* getParameterInfo(const uint32_t index) const override
  62. {
  63. static Parameter paramInfo;
  64. static ParameterScalePoint scalePoints[4];
  65. int hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE|PARAMETER_IS_INTEGER;
  66. paramInfo.name = nullptr;
  67. paramInfo.unit = nullptr;
  68. paramInfo.ranges.def = 0.0f;
  69. paramInfo.ranges.min = 0.0f;
  70. paramInfo.ranges.max = 1.0f;
  71. paramInfo.ranges.step = 1.0f;
  72. paramInfo.ranges.stepSmall = 1.0f;
  73. paramInfo.ranges.stepLarge = 1.0f;
  74. paramInfo.scalePointCount = 0;
  75. paramInfo.scalePoints = nullptr;
  76. switch (index)
  77. {
  78. case kParamOnOff:
  79. hints |= PARAMETER_IS_BOOLEAN;
  80. paramInfo.name = "On/Off";
  81. paramInfo.ranges.def = 0.0f;
  82. paramInfo.ranges.min = 0.0f;
  83. paramInfo.ranges.max = 1.0f;
  84. break;
  85. case kParamLength:
  86. paramInfo.name = "Length";
  87. paramInfo.ranges.def = 8.0f;
  88. paramInfo.ranges.min = 1.0f;
  89. paramInfo.ranges.max = 16.0f;
  90. break;
  91. case kParamTimeMode:
  92. hints |= PARAMETER_USES_SCALEPOINTS;
  93. paramInfo.name = "Time Signature";
  94. paramInfo.ranges.def = 2.0f;
  95. paramInfo.ranges.min = 1.0f;
  96. paramInfo.ranges.max = 3.0f;
  97. paramInfo.scalePointCount = 3;
  98. paramInfo.scalePoints = scalePoints;
  99. scalePoints[0].label = "8";
  100. scalePoints[1].label = "16";
  101. scalePoints[2].label = "32";
  102. scalePoints[0].value = 1.0f;
  103. scalePoints[1].value = 2.0f;
  104. scalePoints[2].value = 3.0f;
  105. break;
  106. case kParamSyncMode:
  107. hints |= PARAMETER_USES_SCALEPOINTS;
  108. paramInfo.name = "Sync Mode";
  109. paramInfo.ranges.def = 1.0f;
  110. paramInfo.ranges.min = 1.0f;
  111. paramInfo.ranges.max = 2.0f;
  112. paramInfo.scalePointCount = 2;
  113. paramInfo.scalePoints = scalePoints;
  114. scalePoints[0].label = "Key Sync";
  115. scalePoints[1].label = "Bar Sync";
  116. scalePoints[0].value = 1.0f;
  117. scalePoints[1].value = 2.0f;
  118. break;
  119. case kParamFailMode:
  120. hints |= PARAMETER_USES_SCALEPOINTS;
  121. paramInfo.name = "Fail Mode";
  122. paramInfo.ranges.def = 1.0f;
  123. paramInfo.ranges.min = 1.0f;
  124. paramInfo.ranges.max = 3.0f;
  125. paramInfo.scalePointCount = 3;
  126. paramInfo.scalePoints = scalePoints;
  127. scalePoints[0].label = "Silent Step";
  128. scalePoints[1].label = "Skip One";
  129. scalePoints[2].label = "Skip Two";
  130. scalePoints[0].value = 1.0f;
  131. scalePoints[1].value = 2.0f;
  132. scalePoints[2].value = 3.0f;
  133. break;
  134. case kParamVelMode:
  135. hints |= PARAMETER_USES_SCALEPOINTS;
  136. paramInfo.name = "Velocity Mode";
  137. paramInfo.ranges.def = 1.0f;
  138. paramInfo.ranges.min = 1.0f;
  139. paramInfo.ranges.max = 3.0f;
  140. paramInfo.scalePointCount = 3;
  141. paramInfo.scalePoints = scalePoints;
  142. scalePoints[0].label = "Pattern Velocity";
  143. scalePoints[1].label = "Input Velocity";
  144. scalePoints[2].label = "Sum Velocities";
  145. scalePoints[0].value = 1.0f;
  146. scalePoints[1].value = 2.0f;
  147. scalePoints[2].value = 3.0f;
  148. break;
  149. }
  150. paramInfo.hints = static_cast<ParameterHints>(hints);
  151. return &paramInfo;
  152. }
  153. float getParameterValue(const uint32_t index) const override
  154. {
  155. switch (index)
  156. {
  157. case kParamOnOff:
  158. return fSettings.on ? 1.0f : 0.0f;
  159. case kParamLength:
  160. return fSettings.length;
  161. case kParamTimeMode:
  162. return fSettings.timeMode;
  163. case kParamSyncMode:
  164. return fSettings.syncMode;
  165. case kParamFailMode:
  166. return fSettings.failMode;
  167. case kParamVelMode:
  168. return fSettings.velMode;
  169. default:
  170. return 0.0f;
  171. }
  172. }
  173. // -------------------------------------------------------------------
  174. // Plugin state calls
  175. void setParameterValue(const uint32_t index, const float value)
  176. {
  177. switch (index)
  178. {
  179. case kParamOnOff:
  180. fSettings.on = (value >= 0.5f);
  181. break;
  182. case kParamLength:
  183. fSettings.length = value;
  184. break;
  185. case kParamTimeMode:
  186. fSettings.timeMode = value;
  187. break;
  188. case kParamSyncMode:
  189. fSettings.syncMode = value;
  190. break;
  191. case kParamFailMode:
  192. fSettings.failMode = value;
  193. break;
  194. case kParamVelMode:
  195. fSettings.velMode = value;
  196. break;
  197. }
  198. }
  199. // -------------------------------------------------------------------
  200. // Plugin process calls
  201. void process(float**, float**, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) override
  202. {
  203. if (! fSettings.on)
  204. {
  205. for (uint32_t i=0; i < midiEventCount; ++i)
  206. writeMidiEvent(&midiEvents[i]);
  207. return;
  208. }
  209. const TimeInfo* const timeInfo(getTimeInfo());
  210. double ppqPos, barStartPos, bpm;
  211. if (timeInfo->bbt.valid)
  212. {
  213. ppqPos = 0.0;
  214. barStartPos = 0.0;
  215. bpm = timeInfo->bbt.beatsPerMinute;
  216. }
  217. else
  218. {
  219. double ppqBar = double(timeInfo->bbt.bar - 1) * timeInfo->bbt.beatsPerBar;
  220. double ppqBeat = double(timeInfo->bbt.beat - 1);
  221. double ppqTick = double(timeInfo->bbt.tick) / timeInfo->bbt.ticksPerBeat;
  222. ppqPos = ppqBar + ppqBeat + ppqTick;
  223. barStartPos = ppqBar;
  224. bpm = 120.0;
  225. }
  226. fMidiInBuffer.clear();
  227. for (uint32_t i=0; i < midiEventCount; ++i)
  228. {
  229. const MidiEvent* const midiEvent(&midiEvents[i]);
  230. fMidiInBuffer.addEvent(MidiMessage(midiEvent->data, midiEvent->size, midiEvent->time), timeInfo->frame);
  231. }
  232. const MidiBuffer& outMidiBuffer(fArp.processMidi(fMidiInBuffer, timeInfo->playing, ppqPos, barStartPos, bpm, frames));
  233. MidiBuffer::Iterator outBufferIterator(outMidiBuffer);
  234. MidiMessage midiMessage(0xf4);
  235. int sampleNumber;
  236. MidiEvent tmpEvent;
  237. tmpEvent.port = 0;
  238. while (outBufferIterator.getNextEvent(midiMessage, sampleNumber))
  239. {
  240. tmpEvent.size = midiMessage.getRawDataSize();
  241. tmpEvent.time = midiMessage.getTimeStamp();
  242. if (tmpEvent.size > 4)
  243. continue;
  244. std::memcpy(tmpEvent.data, midiMessage.getRawData(), sizeof(uint8_t)*tmpEvent.size);
  245. writeMidiEvent(&tmpEvent);
  246. }
  247. }
  248. // -------------------------------------------------------------------
  249. // Plugin dispatcher calls
  250. void sampleRateChanged(const double sampleRate) override
  251. {
  252. fArp.setSampleRate(sampleRate);
  253. }
  254. private:
  255. VexArpSettings fSettings;
  256. VexArp fArp;
  257. MidiBuffer fMidiInBuffer;
  258. PluginClassEND(VexArpPlugin)
  259. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexArpPlugin)
  260. };
  261. // -----------------------------------------------------------------------
  262. class VexChorusPlugin : public PluginClass
  263. {
  264. public:
  265. enum Params {
  266. kParamDepth = 0,
  267. kParamRate,
  268. kParamCount
  269. };
  270. VexChorusPlugin(const HostDescriptor* const host)
  271. : PluginClass(host),
  272. chorus(parameters)
  273. {
  274. parameters[0] = 0.6f;
  275. parameters[1] = 0.3f;
  276. chorus.setSampleRate(getSampleRate());
  277. }
  278. protected:
  279. // -------------------------------------------------------------------
  280. // Plugin parameter calls
  281. uint32_t getParameterCount() const override
  282. {
  283. return kParamCount;
  284. }
  285. const Parameter* getParameterInfo(const uint32_t index) const override
  286. {
  287. static Parameter paramInfo;
  288. int hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE;
  289. paramInfo.name = nullptr;
  290. paramInfo.unit = nullptr;
  291. paramInfo.ranges.def = 0.0f;
  292. paramInfo.ranges.min = 0.0f;
  293. paramInfo.ranges.max = 1.0f;
  294. paramInfo.ranges.step = 1.0f;
  295. paramInfo.ranges.stepSmall = 1.0f;
  296. paramInfo.ranges.stepLarge = 1.0f;
  297. paramInfo.scalePointCount = 0;
  298. paramInfo.scalePoints = nullptr;
  299. switch (index)
  300. {
  301. case kParamDepth:
  302. paramInfo.name = "Depth";
  303. paramInfo.ranges.def = 0.6f;
  304. paramInfo.ranges.min = 0.0f;
  305. paramInfo.ranges.max = 1.0f;
  306. break;
  307. case kParamRate:
  308. paramInfo.name = "Rate";
  309. paramInfo.ranges.def = 0.3f;
  310. paramInfo.ranges.min = 0.0f;
  311. paramInfo.ranges.max = 1.0f;
  312. break;
  313. }
  314. paramInfo.hints = static_cast<ParameterHints>(hints);
  315. return &paramInfo;
  316. }
  317. float getParameterValue(const uint32_t index) const override
  318. {
  319. if (index < kParamCount)
  320. return parameters[index];
  321. return 0.0f;
  322. }
  323. // -------------------------------------------------------------------
  324. // Plugin state calls
  325. void setParameterValue(const uint32_t index, const float value)
  326. {
  327. if (index < kParamCount)
  328. parameters[index] = value;
  329. }
  330. // -------------------------------------------------------------------
  331. // Plugin process calls
  332. void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const MidiEvent* const, const uint32_t) override
  333. {
  334. if (inBuffer[0] != outBuffer[0])
  335. carla_copyFloat(outBuffer[0], inBuffer[0], frames);
  336. if (inBuffer[1] != outBuffer[1])
  337. carla_copyFloat(outBuffer[1], inBuffer[1], frames);
  338. chorus.processBlock(outBuffer[0], outBuffer[1], frames);
  339. }
  340. // -------------------------------------------------------------------
  341. // Plugin dispatcher calls
  342. void sampleRateChanged(const double sampleRate) override
  343. {
  344. chorus.setSampleRate(sampleRate);
  345. }
  346. private:
  347. VexChorus chorus;
  348. float parameters[2];
  349. PluginClassEND(VexChorusPlugin)
  350. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexChorusPlugin)
  351. };
  352. // -----------------------------------------------------------------------
  353. class VexDelayPlugin : public PluginClass
  354. {
  355. public:
  356. enum Params {
  357. kParamTime = 0,
  358. kParamFeedback,
  359. kParamCount
  360. };
  361. VexDelayPlugin(const HostDescriptor* const host)
  362. : PluginClass(host),
  363. delay(parameters)
  364. {
  365. parameters[0] = 4.0f;
  366. parameters[1] = 40.0f;
  367. delay.setSampleRate(getSampleRate());
  368. }
  369. protected:
  370. // -------------------------------------------------------------------
  371. // Plugin parameter calls
  372. uint32_t getParameterCount() const override
  373. {
  374. return kParamCount;
  375. }
  376. const Parameter* getParameterInfo(const uint32_t index) const override
  377. {
  378. static Parameter paramInfo;
  379. int hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE;
  380. paramInfo.name = nullptr;
  381. paramInfo.unit = nullptr;
  382. paramInfo.ranges.def = 0.0f;
  383. paramInfo.ranges.min = 0.0f;
  384. paramInfo.ranges.max = 1.0f;
  385. paramInfo.ranges.step = 1.0f;
  386. paramInfo.ranges.stepSmall = 1.0f;
  387. paramInfo.ranges.stepLarge = 1.0f;
  388. paramInfo.scalePointCount = 0;
  389. paramInfo.scalePoints = nullptr;
  390. switch (index)
  391. {
  392. case kParamTime:
  393. hints |= PARAMETER_IS_INTEGER;
  394. paramInfo.name = "Time";
  395. paramInfo.ranges.def = 4.0f;
  396. paramInfo.ranges.min = 0.0f;
  397. paramInfo.ranges.max = 8.0f;
  398. break;
  399. case kParamFeedback:
  400. paramInfo.name = "Feedback";
  401. paramInfo.unit = "%";
  402. paramInfo.ranges.def = 40.0f;
  403. paramInfo.ranges.min = 0.0f;
  404. paramInfo.ranges.max = 100.0f;
  405. break;
  406. }
  407. paramInfo.hints = static_cast<ParameterHints>(hints);
  408. return &paramInfo;
  409. }
  410. float getParameterValue(const uint32_t index) const override
  411. {
  412. if (index < kParamCount)
  413. return parameters[index];
  414. return 0.0f;
  415. }
  416. // -------------------------------------------------------------------
  417. // Plugin state calls
  418. void setParameterValue(const uint32_t index, const float value)
  419. {
  420. if (index < kParamCount)
  421. parameters[index] = value;
  422. }
  423. // -------------------------------------------------------------------
  424. // Plugin process calls
  425. void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const MidiEvent* const, const uint32_t) override
  426. {
  427. if (inBuffer[0] != outBuffer[0])
  428. carla_copyFloat(outBuffer[0], inBuffer[0], frames);
  429. if (inBuffer[1] != outBuffer[1])
  430. carla_copyFloat(outBuffer[1], inBuffer[1], frames);
  431. const TimeInfo* const timeInfo(getTimeInfo());
  432. const double bpm(timeInfo->bbt.valid ? timeInfo->bbt.beatsPerMinute : 120.0);
  433. delay.processBlock(outBuffer[0], outBuffer[1], frames, bpm);
  434. }
  435. // -------------------------------------------------------------------
  436. // Plugin dispatcher calls
  437. void sampleRateChanged(const double sampleRate) override
  438. {
  439. delay.setSampleRate(sampleRate);
  440. }
  441. private:
  442. VexDelay delay;
  443. float parameters[2];
  444. PluginClassEND(VexDelayPlugin)
  445. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexDelayPlugin)
  446. };
  447. // -----------------------------------------------------------------------
  448. class VexReverbPlugin : public PluginClass
  449. {
  450. public:
  451. enum Params {
  452. kParamSize = 0,
  453. kParamWidth,
  454. kParamDamp,
  455. kParamCount
  456. };
  457. VexReverbPlugin(const HostDescriptor* const host)
  458. : PluginClass(host),
  459. reverb(parameters)
  460. {
  461. parameters[0] = 0.6f;
  462. parameters[1] = 0.7f;
  463. parameters[2] = 0.6f;
  464. }
  465. protected:
  466. // -------------------------------------------------------------------
  467. // Plugin parameter calls
  468. uint32_t getParameterCount() const override
  469. {
  470. return kParamCount;
  471. }
  472. const Parameter* getParameterInfo(const uint32_t index) const override
  473. {
  474. static Parameter paramInfo;
  475. int hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE;
  476. paramInfo.name = nullptr;
  477. paramInfo.unit = nullptr;
  478. paramInfo.ranges.def = 0.0f;
  479. paramInfo.ranges.min = 0.0f;
  480. paramInfo.ranges.max = 1.0f;
  481. paramInfo.ranges.step = 1.0f;
  482. paramInfo.ranges.stepSmall = 1.0f;
  483. paramInfo.ranges.stepLarge = 1.0f;
  484. paramInfo.scalePointCount = 0;
  485. paramInfo.scalePoints = nullptr;
  486. switch (index)
  487. {
  488. case kParamSize:
  489. paramInfo.name = "Size";
  490. paramInfo.ranges.def = 0.6f;
  491. paramInfo.ranges.min = 0.0f;
  492. paramInfo.ranges.max = 1.0f;
  493. break;
  494. case kParamWidth:
  495. paramInfo.name = "Width";
  496. paramInfo.ranges.def = 0.7f;
  497. paramInfo.ranges.min = 0.0f;
  498. paramInfo.ranges.max = 1.0f;
  499. break;
  500. case kParamDamp:
  501. paramInfo.name = "Damp";
  502. paramInfo.ranges.def = 0.6f;
  503. paramInfo.ranges.min = 0.0f;
  504. paramInfo.ranges.max = 1.0f;
  505. break;
  506. }
  507. paramInfo.hints = static_cast<ParameterHints>(hints);
  508. return &paramInfo;
  509. }
  510. float getParameterValue(const uint32_t index) const override
  511. {
  512. if (index < kParamCount)
  513. return parameters[index];
  514. return 0.0f;
  515. }
  516. // -------------------------------------------------------------------
  517. // Plugin state calls
  518. void setParameterValue(const uint32_t index, const float value)
  519. {
  520. if (index < kParamCount)
  521. parameters[index] = value;
  522. }
  523. // -------------------------------------------------------------------
  524. // Plugin process calls
  525. void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const MidiEvent* const, const uint32_t) override
  526. {
  527. for (uint32_t i=0; i< frames; ++i)
  528. outBuffer[0][i] = inBuffer[0][i]/2.0f;
  529. for (uint32_t i=0; i< frames; ++i)
  530. outBuffer[1][i] = inBuffer[1][i]/2.0f;
  531. reverb.processBlock(outBuffer[0], outBuffer[1], frames);
  532. }
  533. private:
  534. VexReverb reverb;
  535. float parameters[3];
  536. PluginClassEND(VexReverbPlugin)
  537. CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexReverbPlugin)
  538. };
  539. // -----------------------------------------------------------------------
  540. static const PluginDescriptor vexArpDesc = {
  541. /* category */ PLUGIN_CATEGORY_UTILITY,
  542. /* hints */ static_cast<PluginHints>(0x0),
  543. /* supports */ static_cast<PluginSupports>(PLUGIN_SUPPORTS_EVERYTHING),
  544. /* audioIns */ 0,
  545. /* audioOuts */ 0,
  546. /* midiIns */ 1,
  547. /* midiOuts */ 1,
  548. /* paramIns */ VexArpPlugin::kParamCount,
  549. /* paramOuts */ 0,
  550. /* name */ "Vex Arp",
  551. /* label */ "vexArp",
  552. /* maker */ "falkTX",
  553. /* copyright */ "GNU GPL v2+",
  554. PluginDescriptorFILL(VexArpPlugin)
  555. };
  556. static const PluginDescriptor vexChorusDesc = {
  557. /* category */ PLUGIN_CATEGORY_MODULATOR,
  558. /* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE),
  559. /* supports */ static_cast<PluginSupports>(0x0),
  560. /* audioIns */ 2,
  561. /* audioOuts */ 2,
  562. /* midiIns */ 0,
  563. /* midiOuts */ 0,
  564. /* paramIns */ VexChorusPlugin::kParamCount,
  565. /* paramOuts */ 0,
  566. /* name */ "Vex Chorus",
  567. /* label */ "vexChorus",
  568. /* maker */ "falkTX",
  569. /* copyright */ "GNU GPL v2+",
  570. PluginDescriptorFILL(VexChorusPlugin)
  571. };
  572. static const PluginDescriptor vexDelayDesc = {
  573. /* category */ PLUGIN_CATEGORY_DELAY,
  574. /* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE),
  575. /* supports */ static_cast<PluginSupports>(0x0),
  576. /* audioIns */ 2,
  577. /* audioOuts */ 2,
  578. /* midiIns */ 0,
  579. /* midiOuts */ 0,
  580. /* paramIns */ VexDelayPlugin::kParamCount,
  581. /* paramOuts */ 0,
  582. /* name */ "Vex Delay",
  583. /* label */ "vexDelay",
  584. /* maker */ "falkTX",
  585. /* copyright */ "GNU GPL v2+",
  586. PluginDescriptorFILL(VexDelayPlugin)
  587. };
  588. static const PluginDescriptor vexReverbDesc = {
  589. /* category */ PLUGIN_CATEGORY_DELAY,
  590. /* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE),
  591. /* supports */ static_cast<PluginSupports>(0x0),
  592. /* audioIns */ 2,
  593. /* audioOuts */ 2,
  594. /* midiIns */ 0,
  595. /* midiOuts */ 0,
  596. /* paramIns */ VexReverbPlugin::kParamCount,
  597. /* paramOuts */ 0,
  598. /* name */ "Vex Reverb",
  599. /* label */ "vexReverb",
  600. /* maker */ "falkTX",
  601. /* copyright */ "GNU GPL v2+",
  602. PluginDescriptorFILL(VexReverbPlugin)
  603. };
  604. // -----------------------------------------------------------------------
  605. CARLA_EXPORT
  606. void carla_register_native_plugin_vex()
  607. {
  608. carla_register_native_plugin(&vexArpDesc);
  609. carla_register_native_plugin(&vexChorusDesc);
  610. carla_register_native_plugin(&vexDelayDesc);
  611. carla_register_native_plugin(&vexReverbDesc);
  612. }
  613. // -----------------------------------------------------------------------
  614. #include "vex/freeverb/allpass.cpp"
  615. #include "vex/freeverb/comb.cpp"
  616. #include "vex/freeverb/revmodel.cpp"
  617. // -----------------------------------------------------------------------