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.

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