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.

325 lines
11KB

  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 "WaveTablePluginGUI.h"
  19. #include <FL/fl_draw.h>
  20. #include <FL/fl_draw.H>
  21. #include "../GUI/WS_Square.h"
  22. #include "../GUI/WS_Saw.h"
  23. #include "../GUI/WS_RevSaw.h"
  24. #include "../GUI/WS_Tri.h"
  25. #include "../GUI/WS_Sine.h"
  26. #include "../GUI/WS_Pulse1.h"
  27. #include "../GUI/WS_Pulse2.h"
  28. #include "../GUI/WS_InvSine.h"
  29. WaveTablePluginGUI::WaveTablePluginGUI(int w, int h, SpiralPlugin *o, ChannelHandler *ch, const HostInfo *Info) :
  30. SpiralPluginGUI(w,h,o,ch),
  31. pixmap_Square(image_Square),
  32. pixmap_Saw(image_Saw),
  33. pixmap_RevSaw(image_RevSaw),
  34. pixmap_Tri(image_Tri),
  35. pixmap_Sine(image_Sine),
  36. pixmap_Pulse1(image_Pulse1),
  37. pixmap_Pulse2(image_Pulse2),
  38. pixmap_InvSine(image_InvSine),
  39. m_FineFreq(0),
  40. m_Octave(0)
  41. {
  42. ShapeSine = new Fl_Check_Button(5, 15, 55, 30);
  43. ShapeSine->type(102);
  44. ShapeSine->down_box(FL_DIAMOND_DOWN_BOX);
  45. ShapeSine->selection_color(Info->GUI_COLOUR);
  46. pixmap_Sine.label(ShapeSine);
  47. ShapeSine->set();
  48. ShapeSine->callback((Fl_Callback*)cb_Sine);
  49. ShapeSquare = new Fl_Check_Button(5, 35, 55, 30);
  50. ShapeSquare->type(102);
  51. ShapeSquare->down_box(FL_DIAMOND_DOWN_BOX);
  52. ShapeSquare->selection_color(Info->GUI_COLOUR);
  53. pixmap_Square.label(ShapeSquare);
  54. ShapeSquare->callback((Fl_Callback*)cb_Square);
  55. ShapeSaw = new Fl_Check_Button(5, 55, 55, 30);
  56. ShapeSaw->type(102);
  57. ShapeSaw->down_box(FL_DIAMOND_DOWN_BOX);
  58. ShapeSaw->selection_color(Info->GUI_COLOUR);
  59. pixmap_Saw.label(ShapeSaw);
  60. ShapeSaw->callback((Fl_Callback*)cb_Saw);
  61. ShapeRevSaw = new Fl_Check_Button(5, 75, 55, 30);
  62. ShapeRevSaw->type(102);
  63. ShapeRevSaw->down_box(FL_DIAMOND_DOWN_BOX);
  64. ShapeRevSaw->selection_color(Info->GUI_COLOUR);
  65. pixmap_RevSaw.label(ShapeRevSaw);
  66. ShapeRevSaw->callback((Fl_Callback*)cb_RevSaw);
  67. ShapeTri = new Fl_Check_Button(55, 15, 55, 30);
  68. ShapeTri->type(102);
  69. ShapeTri->down_box(FL_DIAMOND_DOWN_BOX);
  70. ShapeTri->selection_color(Info->GUI_COLOUR);
  71. pixmap_Tri.label(ShapeTri);
  72. ShapeTri->callback((Fl_Callback*)cb_Tri);
  73. Pulse1 = new Fl_Check_Button(55, 35, 55, 30);
  74. Pulse1->type(102);
  75. Pulse1->down_box(FL_DIAMOND_DOWN_BOX);
  76. Pulse1->selection_color(Info->GUI_COLOUR);
  77. pixmap_Pulse1.label(Pulse1);
  78. Pulse1->callback((Fl_Callback*)cb_Pulse1);
  79. Pulse2 = new Fl_Check_Button(55, 55, 55, 30);
  80. Pulse2->type(102);
  81. Pulse2->down_box(FL_DIAMOND_DOWN_BOX);
  82. Pulse2->selection_color(Info->GUI_COLOUR);
  83. pixmap_Pulse2.label(Pulse2);
  84. Pulse2->callback((Fl_Callback*)cb_Pulse2);
  85. ShapeInvSine = new Fl_Check_Button(55, 75, 55, 30);
  86. ShapeInvSine->type(102);
  87. ShapeInvSine->down_box(FL_DIAMOND_DOWN_BOX);
  88. ShapeInvSine->selection_color(Info->GUI_COLOUR);
  89. pixmap_InvSine.label(ShapeInvSine);
  90. ShapeInvSine->callback((Fl_Callback*)cb_InvSine);
  91. Freq = new Fl_Knob(188, 2, 40, 40, "Octave");
  92. Freq->color(Info->GUI_COLOUR);
  93. Freq->type(Fl_Knob::LINELIN);
  94. Freq->labelsize(10);
  95. Freq->maximum(6);
  96. Freq->step(1);
  97. Freq->value(3);
  98. Freq->scaleticks(6);
  99. Freq->cursor(50);
  100. Freq->callback((Fl_Callback*)cb_Freq);
  101. FineTune = new Fl_Knob(112, 22, 65, 65, "Fine Tune");
  102. FineTune->color(Info->GUI_COLOUR);
  103. FineTune->type(Fl_Knob::LINELIN);
  104. FineTune->labelsize(10);
  105. FineTune->scaleticks(20);
  106. FineTune->maximum(1.414);
  107. FineTune->step(0.000001);
  108. FineTune->value(1);
  109. FineTune->callback((Fl_Callback*)cb_FineTune);
  110. ModAmount = new Fl_Knob(188, 54, 40, 40, "Mod Depth");
  111. ModAmount->color(Info->GUI_COLOUR);
  112. ModAmount->type(Fl_Knob::LINELIN);
  113. ModAmount->labelsize(10);
  114. ModAmount->maximum(2.0f);
  115. ModAmount->step(0.001);
  116. ModAmount->value(1.0);
  117. ModAmount->callback((Fl_Callback*)cb_ModAmount);
  118. m_pop = new Fl_Button(1,h-14, 13, 13, "@>");
  119. m_pop->type(1);
  120. m_pop->box(FL_FLAT_BOX);
  121. m_pop->down_box(FL_FLAT_BOX);
  122. //m_pop->labeltype(FL_ICON_LABEL);
  123. m_pop->labelsize(10);
  124. m_pop->labelcolor(25);
  125. m_pop->callback((Fl_Callback*)cb_pop);
  126. m_out_freq = new Fl_Output(65,h+5, 58, 15, "Frequency");
  127. m_out_freq->box(FL_ENGRAVED_BOX);
  128. m_out_freq->color(16);
  129. m_out_freq->labelsize(10);
  130. m_out_freq->textsize(10);
  131. m_out_freq->hide();
  132. m_out_freq->set_output();
  133. m_out_mod = new Fl_Output(188,h+5, 48, 15, "Modulation");
  134. m_out_mod->box(FL_ENGRAVED_BOX);
  135. m_out_mod->color(16);
  136. m_out_mod->labelsize(10);
  137. m_out_mod->textsize(10);
  138. m_out_mod->hide();
  139. m_out_mod->set_output();
  140. end();
  141. }
  142. extern "C" int sprintf(char *,const char *,...);
  143. void WaveTablePluginGUI::UpdateValues(SpiralPlugin *o)
  144. {
  145. WaveTablePlugin *Plugin = (WaveTablePlugin*)o;
  146. ShapeSquare->value(0);
  147. ShapeRevSaw->value(0);
  148. ShapeSaw->value(0);
  149. ShapeTri->value(0);
  150. ShapeSine->value(0);
  151. Pulse1->value(0);
  152. Pulse2->value(0);
  153. ShapeInvSine->value(0);
  154. switch (Plugin->GetType())
  155. {
  156. case WaveTablePlugin::SQUARE : ShapeSquare->value(1); break;
  157. case WaveTablePlugin::SINE : ShapeSine->value(1); break;
  158. case WaveTablePlugin::SAW : ShapeSaw->value(1); break;
  159. case WaveTablePlugin::REVSAW : ShapeRevSaw->value(1); break;
  160. case WaveTablePlugin::TRIANGLE : ShapeTri->value(1); break;
  161. case WaveTablePlugin::PULSE1 : Pulse1->value(1); break;
  162. case WaveTablePlugin::PULSE2 : Pulse2->value(1); break;
  163. case WaveTablePlugin::INVSINE : ShapeInvSine->value(1); break;
  164. }
  165. Freq->value (Plugin->GetOctave () - 3);
  166. ModAmount->value(Plugin->GetModAmount());
  167. FineTune->value(sqrt(Plugin->GetFinefreq()));
  168. char str[10];
  169. float fr = 110.0f * Plugin->GetFinefreq();
  170. m_FineFreq=Plugin->GetFinefreq();
  171. int oc = Plugin->GetOctave();
  172. m_Octave = oc;
  173. if (oc > 0) fr *= 1 << oc;
  174. if (oc < 0) fr /= 1 << (-oc);
  175. sprintf(str,"%4.1f Hz", fr);
  176. m_out_freq->value(str);
  177. sprintf(str,"%4.0f %%", 100*Plugin->GetModAmount());
  178. m_out_mod->value(str);
  179. }
  180. //// Callbacks ////
  181. inline void WaveTablePluginGUI::cb_Freq_i(Fl_Knob* o, void* v)
  182. {
  183. char str[10];
  184. m_GUICH->Set("Octave",(int)o->value()-3);
  185. m_Octave=(int)o->value()-3;
  186. float fr = 110.0f * m_FineFreq;
  187. int oc = m_Octave;
  188. if (oc > 0) fr *= 1 << oc;
  189. if (oc < 0) fr /= 1 << (-oc);
  190. sprintf(str,"%4.1f Hz", fr);
  191. m_out_freq->value(str);
  192. }
  193. void WaveTablePluginGUI::cb_Freq(Fl_Knob* o, void* v)
  194. { ((WaveTablePluginGUI*)(o->parent()))->cb_Freq_i(o,v); }
  195. inline void WaveTablePluginGUI::cb_FineTune_i(Fl_Knob* o, void* v)
  196. {
  197. char str[10];
  198. m_GUICH->Set("FineFreq",(float)(o->value()*o->value()));
  199. m_FineFreq=(float)(o->value()*o->value());
  200. float fr = 110.0f * m_FineFreq;
  201. int oc = m_Octave;
  202. if (oc > 0) fr *= 1 << oc;
  203. if (oc < 0) fr /= 1 << (-oc);
  204. sprintf(str,"%4.1f Hz", fr);
  205. m_out_freq->value(str);
  206. }
  207. void WaveTablePluginGUI::cb_FineTune(Fl_Knob* o, void* v)
  208. { ((WaveTablePluginGUI*)(o->parent()))->cb_FineTune_i(o,v); }
  209. inline void WaveTablePluginGUI::cb_Square_i(Fl_Check_Button* o, void* v)
  210. { m_GUICH->Set("Type",(char)WaveTablePlugin::SQUARE); }
  211. void WaveTablePluginGUI::cb_Square(Fl_Check_Button* o, void* v)
  212. { ((WaveTablePluginGUI*)(o->parent()))->cb_Square_i(o,v); }
  213. inline void WaveTablePluginGUI::cb_Saw_i(Fl_Check_Button* o, void* v)
  214. { m_GUICH->Set("Type",(char)WaveTablePlugin::SAW); }
  215. void WaveTablePluginGUI::cb_Saw(Fl_Check_Button* o, void* v)
  216. { ((WaveTablePluginGUI*)(o->parent()))->cb_Saw_i(o,v); }
  217. inline void WaveTablePluginGUI::cb_Sine_i(Fl_Check_Button* o, void* v)
  218. { m_GUICH->Set("Type",(char)WaveTablePlugin::SINE); }
  219. void WaveTablePluginGUI::cb_Sine(Fl_Check_Button* o, void* v)
  220. { ((WaveTablePluginGUI*)(o->parent()))->cb_Sine_i(o,v); }
  221. inline void WaveTablePluginGUI::cb_RevSaw_i(Fl_Check_Button* o, void* v)
  222. { m_GUICH->Set("Type",(char)WaveTablePlugin::REVSAW); }
  223. void WaveTablePluginGUI::cb_RevSaw(Fl_Check_Button* o, void* v)
  224. { ((WaveTablePluginGUI*)(o->parent()))->cb_RevSaw_i(o,v); }
  225. inline void WaveTablePluginGUI::cb_Tri_i(Fl_Check_Button* o, void* v)
  226. { m_GUICH->Set("Type",(char)WaveTablePlugin::TRIANGLE); }
  227. void WaveTablePluginGUI::cb_Tri(Fl_Check_Button* o, void* v)
  228. { ((WaveTablePluginGUI*)(o->parent()))->cb_Tri_i(o,v); }
  229. inline void WaveTablePluginGUI::cb_Pulse1_i(Fl_Check_Button* o, void* v)
  230. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE1); }
  231. void WaveTablePluginGUI::cb_Pulse1(Fl_Check_Button* o, void* v)
  232. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse1_i(o,v); }
  233. inline void WaveTablePluginGUI::cb_Pulse2_i(Fl_Check_Button* o, void* v)
  234. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE2); }
  235. void WaveTablePluginGUI::cb_Pulse2(Fl_Check_Button* o, void* v)
  236. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse2_i(o,v); }
  237. inline void WaveTablePluginGUI::cb_InvSine_i(Fl_Check_Button* o, void* v)
  238. { m_GUICH->Set("Type",(char)WaveTablePlugin::INVSINE); }
  239. void WaveTablePluginGUI::cb_InvSine(Fl_Check_Button* o, void* v)
  240. { ((WaveTablePluginGUI*)(o->parent()))->cb_InvSine_i(o,v); }
  241. inline void WaveTablePluginGUI::cb_ModAmount_i(Fl_Knob* o, void* v)
  242. {
  243. char str[10];
  244. m_GUICH->Set("ModAmount",(float)o->value());
  245. sprintf(str,"%4.0f %%", 100*o->value());
  246. m_out_mod->value(str);
  247. }
  248. void WaveTablePluginGUI::cb_ModAmount(Fl_Knob* o, void* v)
  249. { ((WaveTablePluginGUI*)(o->parent()))->cb_ModAmount_i(o,v); }
  250. inline void WaveTablePluginGUI::cb_pop_i(Fl_Button *o, void*) {
  251. if (o->value())
  252. {
  253. o->label("@2>");
  254. m_out_freq->show();
  255. m_out_mod->show();
  256. redraw();
  257. }
  258. else
  259. {
  260. o->label("@>");
  261. m_out_freq->hide();
  262. m_out_mod->hide();
  263. redraw();
  264. parent()->redraw();
  265. }
  266. }
  267. void WaveTablePluginGUI::cb_pop(Fl_Button* o, void* v) {
  268. ((WaveTablePluginGUI*)o->parent())->cb_pop_i(o,v);
  269. }
  270. const string WaveTablePluginGUI::GetHelpText(const string &loc){
  271. return string("")
  272. + "The WaveTable plugin is a fast multifunction oscillator with a variety \n"
  273. + "of wave shapes:\n"
  274. + "Sine, Square, Saw, Reverse Saw, Triangle, Two pulse shapes and an inverse\n"
  275. + "sinewave.\n\n"
  276. + "These wave shapes are internally represented as samples, rather than\n"
  277. + "being continually calculated like the conventional oscillator. This \n"
  278. + "makes the plugin fast, but restricts the modulations you can do on the\n"
  279. + "wave forms (no pulsewidth).\n\n"
  280. + "The oscillator can be pitched very low for use as a LFO CV generator,\n"
  281. + "using any of the supported wave shapes. User wave shapes are planned,\n"
  282. + "so you will be able to load your own samples in.";
  283. }