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.

372 lines
13KB

  1. /* SpiralPlugin
  2. * Copyleft (C) 2000 David Griffiths <dave@pawfal.org>
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include "EnvelopePluginGUI.h"
  19. #include <FL/fl_draw.H>
  20. #include <FL/fl_draw.H>
  21. using namespace std;
  22. static const float TIMED_SLIDER_MAX = 3.0f;
  23. ////////////////////////////////////////////
  24. EnvelopePluginGUI::EnvelopePluginGUI(int w, int h,EnvelopePlugin *o,ChannelHandler *ch,const HostInfo *Info) :
  25. SpiralPluginGUI(w,h,o,ch)
  26. {
  27. m_Tabs = new Fl_Tabs (5, 12, 132, 115, "");
  28. m_Tabs->labelsize (10);
  29. m_Tabs->box (FL_PLASTIC_DOWN_BOX);
  30. add (m_Tabs);
  31. m_CtlGroup = new Fl_Group (5, 30, 132, 81, "Controls");
  32. m_CtlGroup->labelsize (10);
  33. m_Tabs->add (m_CtlGroup);
  34. m_Thresh = new Fl_Slider (10, 38, 20, 70, "T");
  35. m_Thresh->user_data ((void*)(this));
  36. m_Thresh->type (FL_VERT_NICE_SLIDER);
  37. m_Thresh->selection_color (Info->GUI_COLOUR);
  38. m_Thresh->box (FL_PLASTIC_DOWN_BOX);
  39. m_Thresh->labelsize (10);
  40. m_Thresh->maximum (1.0);
  41. m_Thresh->step (0.0001);
  42. m_Thresh->value (0.99f);
  43. m_Thresh->callback ((Fl_Callback*)cb_Thresh);
  44. m_CtlGroup->add (m_Thresh);
  45. m_Attack = new Fl_Slider (30, 38, 20, 70, "A");
  46. m_Attack->user_data ((void*)(this));
  47. m_Attack->type (FL_VERT_NICE_SLIDER);
  48. m_Attack->selection_color (Info->GUI_COLOUR);
  49. m_Attack->box (FL_PLASTIC_DOWN_BOX);
  50. m_Attack->labelsize (10);
  51. m_Attack->maximum (TIMED_SLIDER_MAX);
  52. m_Attack->step (0.0001);
  53. m_Attack->value (3.0f);
  54. m_Attack->callback ((Fl_Callback*)cb_Attack);
  55. m_CtlGroup->add (m_Attack);
  56. m_Decay = new Fl_Slider (50, 38, 20, 70, "D");
  57. m_Decay->user_data ((void*)(this));
  58. m_Decay->type (FL_VERT_NICE_SLIDER);
  59. m_Decay->selection_color (Info->GUI_COLOUR);
  60. m_Decay->box (FL_PLASTIC_DOWN_BOX);
  61. m_Decay->labelsize (10);
  62. m_Decay->maximum (TIMED_SLIDER_MAX);
  63. m_Decay->step (0.0001);
  64. m_Decay->value (2.29);
  65. m_Decay->callback ((Fl_Callback*)cb_Decay);
  66. m_CtlGroup->add (m_Decay);
  67. m_Sustain = new Fl_Slider (70, 38, 20, 70, "S");
  68. m_Sustain->user_data ((void*)(this));
  69. m_Sustain->type (FL_VERT_NICE_SLIDER);
  70. m_Sustain->selection_color (Info->GUI_COLOUR);
  71. m_Sustain->box (FL_PLASTIC_DOWN_BOX);
  72. m_Sustain->labelsize (10);
  73. m_Sustain->maximum (1);
  74. m_Sustain->step (0.0001);
  75. m_Sustain->value (0.0);
  76. m_Sustain->callback ((Fl_Callback*)cb_Sustain);
  77. m_CtlGroup->add (m_Sustain);
  78. m_Release = new Fl_Slider (90, 38, 20, 70, "R");
  79. m_Release->user_data ((void*)(this));
  80. m_Release->type (FL_VERT_NICE_SLIDER);
  81. m_Release->selection_color (Info->GUI_COLOUR);
  82. m_Release->box (FL_PLASTIC_DOWN_BOX);
  83. m_Release->labelsize (10);
  84. m_Release->maximum (TIMED_SLIDER_MAX);
  85. m_Release->step (0.0001);
  86. m_Release->value (2.0);
  87. m_Release->callback ((Fl_Callback*)cb_Release);
  88. m_CtlGroup->add (m_Release);
  89. m_Volume = new Fl_Slider (110, 38, 20, 70, "V");
  90. m_Volume->user_data ((void*)(this));
  91. m_Volume->type (FL_VERT_NICE_SLIDER);
  92. m_Volume->selection_color (Info->GUI_COLOUR);
  93. m_Volume->box (FL_PLASTIC_DOWN_BOX);
  94. m_Volume->labelsize (10);
  95. m_Volume->maximum (1);
  96. m_Volume->step (0.0001);
  97. m_Volume->value (0.5f);
  98. m_Volume->callback ((Fl_Callback*)cb_Volume);
  99. m_CtlGroup->add (m_Volume);
  100. m_NumGroup = new Fl_Group (5, 30, 132, 81, "Numbers");
  101. m_NumGroup->labelsize (10);
  102. m_Tabs->add (m_NumGroup);
  103. m_NumThresh = new Fl_Counter (10, 35, 60, 20, "Threshold (%)");
  104. m_NumThresh->user_data ((void*)(this));
  105. m_NumThresh->type (FL_SIMPLE_COUNTER);
  106. m_NumThresh->color (Info->GUI_COLOUR);
  107. m_NumThresh->box (FL_PLASTIC_UP_BOX);
  108. m_NumThresh->labelsize (8);
  109. m_NumThresh->maximum (100);
  110. m_NumThresh->minimum (0);
  111. m_NumThresh->step (1);
  112. m_NumThresh->value (1);
  113. m_NumThresh->callback ((Fl_Callback*)cb_NumThresh);
  114. m_NumGroup->add (m_NumThresh);
  115. m_NumAttack = new Fl_Counter (72, 35, 60, 20, "Attack (s)");
  116. m_NumAttack->user_data ((void*)(this));
  117. m_NumAttack->type (FL_SIMPLE_COUNTER);
  118. m_NumAttack->color (Info->GUI_COLOUR);
  119. m_NumAttack->box (FL_PLASTIC_UP_BOX);
  120. m_NumAttack->labelsize (8);
  121. m_NumAttack->maximum (TIMED_SLIDER_MAX * TIMED_SLIDER_MAX);
  122. m_NumAttack->minimum (0);
  123. m_NumAttack->step (0.001);
  124. m_NumAttack->value (0);
  125. m_NumAttack->callback ((Fl_Callback*)cb_NumAttack);
  126. m_NumGroup->add (m_NumAttack);
  127. m_NumDecay = new Fl_Counter (10, 65, 60, 20, "Decay (s)");
  128. m_NumDecay->user_data ((void*)(this));
  129. m_NumDecay->type (FL_SIMPLE_COUNTER);
  130. m_NumDecay->color (Info->GUI_COLOUR);
  131. m_NumDecay->box (FL_PLASTIC_UP_BOX);
  132. m_NumDecay->labelsize (8);
  133. m_NumDecay->maximum (TIMED_SLIDER_MAX * TIMED_SLIDER_MAX);
  134. m_NumDecay->minimum (0);
  135. m_NumDecay->step (0.001);
  136. m_NumDecay->value (0.5);
  137. m_NumDecay->callback ((Fl_Callback*)cb_NumDecay);
  138. m_NumGroup->add (m_NumDecay);
  139. m_NumSustain = new Fl_Counter (72, 65, 60, 20, "Sustain (%)");
  140. m_NumSustain->user_data ((void*)(this));
  141. m_NumSustain->type (FL_SIMPLE_COUNTER);
  142. m_NumSustain->color (Info->GUI_COLOUR);
  143. m_NumSustain->box (FL_PLASTIC_UP_BOX);
  144. m_NumSustain->labelsize (8);
  145. m_NumSustain->maximum (100);
  146. m_NumSustain->minimum (0);
  147. m_NumSustain->step (1);
  148. m_NumSustain->value (100);
  149. m_NumSustain->callback ((Fl_Callback*)cb_NumSustain);
  150. m_NumGroup->add (m_NumSustain);
  151. m_NumRelease = new Fl_Counter (10, 95, 60, 20, "Release (s)");
  152. m_NumRelease->user_data ((void*)(this));
  153. m_NumRelease->type (FL_SIMPLE_COUNTER);
  154. m_NumRelease->color (Info->GUI_COLOUR);
  155. m_NumRelease->box (FL_PLASTIC_UP_BOX);
  156. m_NumRelease->labelsize (8);
  157. m_NumRelease->maximum (TIMED_SLIDER_MAX * TIMED_SLIDER_MAX);
  158. m_NumRelease->minimum (0);
  159. m_NumRelease->step (0.001);
  160. m_NumRelease->value (1.0);
  161. m_NumRelease->callback ((Fl_Callback*)cb_NumRelease);
  162. m_NumGroup->add (m_NumRelease);
  163. m_NumVolume = new Fl_Counter (72, 95, 60, 20, "Volume (%)");
  164. m_NumVolume->user_data ((void*)(this));
  165. m_NumVolume->type (FL_SIMPLE_COUNTER);
  166. m_NumVolume->color (Info->GUI_COLOUR);
  167. m_NumVolume->box (FL_PLASTIC_UP_BOX);
  168. m_NumVolume->labelsize (8);
  169. m_NumVolume->maximum (100);
  170. m_NumVolume->minimum (0);
  171. m_NumVolume->step (1);
  172. m_NumVolume->value (50);
  173. m_NumVolume->callback ((Fl_Callback*)cb_NumVolume);
  174. m_NumGroup->add (m_NumVolume);
  175. end();
  176. }
  177. void EnvelopePluginGUI::UpdateValues (SpiralPlugin *o) {
  178. float val;
  179. EnvelopePlugin *Plugin = (EnvelopePlugin*)o;
  180. val = Plugin->GetTrigThresh();
  181. m_Thresh->value (1.0f - val);
  182. m_NumThresh->value (100 * val);
  183. val = Plugin->GetAttack();
  184. m_Attack->value (TIMED_SLIDER_MAX - sqrt (val));
  185. m_NumAttack->value (val);
  186. val = Plugin->GetDecay();
  187. m_Decay->value (TIMED_SLIDER_MAX - sqrt (val));
  188. m_NumDecay->value (val);
  189. val = Plugin->GetSustain();
  190. m_Sustain->value (1.0f - val);
  191. m_NumSustain->value (100 * val);
  192. val = Plugin->GetRelease();
  193. m_Release->value (TIMED_SLIDER_MAX - sqrt (val));
  194. m_NumRelease->value (val);
  195. val = Plugin->GetVolume();
  196. m_Volume->value (1.0f - val);
  197. m_NumVolume->value (100 * val);
  198. }
  199. // Slider Callbacks
  200. inline void EnvelopePluginGUI::cb_Thresh_i (Fl_Slider* o, void* v) {
  201. float val = (float)(1.0f - o->value());
  202. m_GUICH->Set ("Trig", val);
  203. m_NumThresh->value (100 * val);
  204. }
  205. void EnvelopePluginGUI::cb_Thresh (Fl_Slider* o, void* v) {
  206. ((EnvelopePluginGUI*)(o->user_data()))->cb_Thresh_i (o, v);
  207. }
  208. inline void EnvelopePluginGUI::cb_Attack_i (Fl_Slider* o, void* v) {
  209. float val = TIMED_SLIDER_MAX - o->value();
  210. val *= val;
  211. m_GUICH->Set ("Attack", val);
  212. m_NumAttack->value (val);
  213. }
  214. void EnvelopePluginGUI::cb_Attack (Fl_Slider* o, void* v) {
  215. ((EnvelopePluginGUI*)(o->user_data()))->cb_Attack_i (o, v);
  216. }
  217. inline void EnvelopePluginGUI::cb_Decay_i (Fl_Slider* o, void* v) {
  218. float val = TIMED_SLIDER_MAX - o->value();
  219. val *= val;
  220. m_GUICH->Set ("Decay", val);
  221. m_NumDecay->value (val);
  222. }
  223. void EnvelopePluginGUI::cb_Decay (Fl_Slider* o, void* v) {
  224. ((EnvelopePluginGUI*)(o->user_data()))->cb_Decay_i (o, v);
  225. }
  226. inline void EnvelopePluginGUI::cb_Sustain_i (Fl_Slider* o, void* v) {
  227. float val = (float)(1.0f - o->value());
  228. m_GUICH->Set ("Sustain", val);
  229. m_NumSustain->value (100 * val);
  230. }
  231. void EnvelopePluginGUI::cb_Sustain (Fl_Slider* o, void* v) {
  232. ((EnvelopePluginGUI*)(o->user_data()))->cb_Sustain_i (o, v);
  233. }
  234. inline void EnvelopePluginGUI::cb_Release_i (Fl_Slider* o, void* v) {
  235. float val = TIMED_SLIDER_MAX - o->value();
  236. val *= val;
  237. m_GUICH->Set ("Release", val);
  238. m_NumRelease->value (val);
  239. }
  240. void EnvelopePluginGUI::cb_Release (Fl_Slider* o, void* v) {
  241. ((EnvelopePluginGUI*)(o->user_data()))->cb_Release_i (o, v);
  242. }
  243. inline void EnvelopePluginGUI::cb_Volume_i (Fl_Slider* o, void* v) {
  244. float val = (float)(1.0f - o->value());
  245. m_GUICH->Set ("Volume", val);
  246. m_NumVolume->value (100 * val);
  247. }
  248. void EnvelopePluginGUI::cb_Volume (Fl_Slider* o, void* v) {
  249. ((EnvelopePluginGUI*)(o->user_data()))->cb_Volume_i (o, v);
  250. }
  251. // Counter Callbacks
  252. inline void EnvelopePluginGUI::cb_NumThresh_i (Fl_Counter* o, void* v) {
  253. float val = o->value() / 100;
  254. m_GUICH->Set ("Trig", val);
  255. m_Thresh->value (1.0f - val);
  256. }
  257. void EnvelopePluginGUI::cb_NumThresh (Fl_Counter* o, void* v) {
  258. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumThresh_i (o, v);
  259. }
  260. inline void EnvelopePluginGUI::cb_NumAttack_i (Fl_Counter* o, void* v) {
  261. float val = o->value();
  262. m_GUICH->Set ("Attack", val);
  263. m_Attack->value (TIMED_SLIDER_MAX - sqrt (val));
  264. }
  265. void EnvelopePluginGUI::cb_NumAttack (Fl_Counter* o, void* v) {
  266. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumAttack_i (o, v);
  267. }
  268. inline void EnvelopePluginGUI::cb_NumDecay_i (Fl_Counter* o, void* v) {
  269. float val = o->value();
  270. m_GUICH->Set ("Decay", val);
  271. m_Decay->value (TIMED_SLIDER_MAX - sqrt (val));
  272. }
  273. void EnvelopePluginGUI::cb_NumDecay (Fl_Counter* o, void* v) {
  274. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumDecay_i (o, v);
  275. }
  276. inline void EnvelopePluginGUI::cb_NumSustain_i (Fl_Counter* o, void* v) {
  277. float val = o->value() / 100;
  278. m_GUICH->Set ("Sustain", val);
  279. m_Sustain->value (1.0f - val);
  280. }
  281. void EnvelopePluginGUI::cb_NumSustain (Fl_Counter* o, void* v) {
  282. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumSustain_i (o, v);
  283. }
  284. inline void EnvelopePluginGUI::cb_NumRelease_i (Fl_Counter* o, void* v) {
  285. float val = o->value();
  286. m_GUICH->Set ("Release", val);
  287. m_Release->value (TIMED_SLIDER_MAX - sqrt (val));
  288. }
  289. void EnvelopePluginGUI::cb_NumRelease (Fl_Counter* o, void* v) {
  290. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumRelease_i (o, v);
  291. }
  292. inline void EnvelopePluginGUI::cb_NumVolume_i (Fl_Counter* o, void* v) {
  293. float val = o->value() / 100;
  294. m_GUICH->Set ("Volume", val);
  295. m_Volume->value (1.0f - val);
  296. }
  297. void EnvelopePluginGUI::cb_NumVolume (Fl_Counter* o, void* v) {
  298. ((EnvelopePluginGUI*)(o->user_data()))->cb_NumVolume_i (o, v);
  299. }
  300. // Help Text
  301. const string EnvelopePluginGUI::GetHelpText (const string &loc) {
  302. return string("")
  303. + "An ADSR envelope. This plugin also has a built in\n"
  304. + "amplifier for signals, so data fed through the Input\n"
  305. + "and Output are amplified according to the envelope value.\n"
  306. + "The envelope is triggered with an input CV, and the output\n"
  307. + "CV is the value of the envelope at that time. The signal\n"
  308. + "level needed to trigger the envelope can be set using\n"
  309. + "the \"T\" slider, also the volume level of the output can\n"
  310. + "be set with the \"V\" slider.\n\n"
  311. + "This envelope can be used to mimic audio triggered effects\n"
  312. + "units, by feeding the audio signal into the trigger CV.\n"
  313. + "In fact, the envelope plugin itself can be made into a\n"
  314. + "compressor, by feeding the audio signal into both inputs,\n"
  315. + "and tweaking the ADSR values. \n";
  316. }