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.

521 lines
18KB

  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. static const int GUI_COLOUR = 179;
  22. static const int GUIBG_COLOUR = 144;
  23. static const int GUIBG2_COLOUR = 145;
  24. static unsigned char *image_Square[] = {
  25. (unsigned char*)"20 20 2 1",
  26. (unsigned char*)" \tc None",
  27. (unsigned char*)".\tc #000000",
  28. (unsigned char*)" ",
  29. (unsigned char*)" ",
  30. (unsigned char*)" ...... ",
  31. (unsigned char*)" . . ",
  32. (unsigned char*)" . . ",
  33. (unsigned char*)" . . ",
  34. (unsigned char*)" . . ",
  35. (unsigned char*)" . . ",
  36. (unsigned char*)" . . ",
  37. (unsigned char*)" . . ",
  38. (unsigned char*)" ... . ... ",
  39. (unsigned char*)" . . ",
  40. (unsigned char*)" . . ",
  41. (unsigned char*)" . . ",
  42. (unsigned char*)" . . ",
  43. (unsigned char*)" . . ",
  44. (unsigned char*)" . . ",
  45. (unsigned char*)" ...... ",
  46. (unsigned char*)" ",
  47. (unsigned char*)" "};
  48. static unsigned char *image_Saw[] = {
  49. (unsigned char*)"20 20 2 1",
  50. (unsigned char*)" \tc None",
  51. (unsigned char*)".\tc #000000",
  52. (unsigned char*)" ",
  53. (unsigned char*)" ",
  54. (unsigned char*)" .. ",
  55. (unsigned char*)" .. ",
  56. (unsigned char*)" . . ",
  57. (unsigned char*)" . . ",
  58. (unsigned char*)" . . ",
  59. (unsigned char*)" . . ",
  60. (unsigned char*)" . . ",
  61. (unsigned char*)" . . ",
  62. (unsigned char*)" ... . .... ",
  63. (unsigned char*)" . . ",
  64. (unsigned char*)" . . ",
  65. (unsigned char*)" . . ",
  66. (unsigned char*)" . . ",
  67. (unsigned char*)" . . ",
  68. (unsigned char*)" .. ",
  69. (unsigned char*)" .. ",
  70. (unsigned char*)" ",
  71. (unsigned char*)" "};
  72. static unsigned char *image_RevSaw[] = {
  73. (unsigned char*)"20 20 2 1",
  74. (unsigned char*)" \tc None",
  75. (unsigned char*)".\tc #000000",
  76. (unsigned char*)" ",
  77. (unsigned char*)" ",
  78. (unsigned char*)" .. ",
  79. (unsigned char*)" .. ",
  80. (unsigned char*)" . . ",
  81. (unsigned char*)" . . ",
  82. (unsigned char*)" . . ",
  83. (unsigned char*)" . . ",
  84. (unsigned char*)" . . ",
  85. (unsigned char*)" . . ",
  86. (unsigned char*)" ... . .... ",
  87. (unsigned char*)" . . ",
  88. (unsigned char*)" . . ",
  89. (unsigned char*)" . . ",
  90. (unsigned char*)" . . ",
  91. (unsigned char*)" . . ",
  92. (unsigned char*)" . . ",
  93. (unsigned char*)" .. ",
  94. (unsigned char*)" ",
  95. (unsigned char*)" "};
  96. static unsigned char *image_Tri[] = {
  97. (unsigned char*)"20 20 2 1",
  98. (unsigned char*)" \tc None",
  99. (unsigned char*)".\tc #000000",
  100. (unsigned char*)" ",
  101. (unsigned char*)" ",
  102. (unsigned char*)" . ",
  103. (unsigned char*)" . ",
  104. (unsigned char*)" . . ",
  105. (unsigned char*)" . . ",
  106. (unsigned char*)" . . ",
  107. (unsigned char*)" . . ",
  108. (unsigned char*)" . . ",
  109. (unsigned char*)" . . ",
  110. (unsigned char*)" . . . ",
  111. (unsigned char*)" . . ",
  112. (unsigned char*)" . . ",
  113. (unsigned char*)" . . ",
  114. (unsigned char*)" . . ",
  115. (unsigned char*)" . . ",
  116. (unsigned char*)" . ",
  117. (unsigned char*)" . ",
  118. (unsigned char*)" ",
  119. (unsigned char*)" "};
  120. static unsigned char *image_Sine[] = {
  121. (unsigned char*)"20 20 2 1",
  122. (unsigned char*)" \tc None",
  123. (unsigned char*)".\tc #000000",
  124. (unsigned char*)" ",
  125. (unsigned char*)" ",
  126. (unsigned char*)" .. ",
  127. (unsigned char*)" . . ",
  128. (unsigned char*)" . . ",
  129. (unsigned char*)" . . ",
  130. (unsigned char*)" . . ",
  131. (unsigned char*)" . . ",
  132. (unsigned char*)" . . ",
  133. (unsigned char*)" . . . ",
  134. (unsigned char*)" . . . ",
  135. (unsigned char*)" . . ",
  136. (unsigned char*)" . . ",
  137. (unsigned char*)" . . ",
  138. (unsigned char*)" . . ",
  139. (unsigned char*)" . . ",
  140. (unsigned char*)" . . ",
  141. (unsigned char*)" .. ",
  142. (unsigned char*)" ",
  143. (unsigned char*)" "};
  144. static unsigned char *image_Pulse1[] = {
  145. (unsigned char*)"20 20 2 1",
  146. (unsigned char*)" \tc None",
  147. (unsigned char*)".\tc #000000",
  148. (unsigned char*)" ",
  149. (unsigned char*)" ",
  150. (unsigned char*)" .... ",
  151. (unsigned char*)" . . ",
  152. (unsigned char*)" . . ",
  153. (unsigned char*)" . . ",
  154. (unsigned char*)" . . ",
  155. (unsigned char*)" . . ",
  156. (unsigned char*)" . . ",
  157. (unsigned char*)" . . ",
  158. (unsigned char*)" ... . ... ",
  159. (unsigned char*)" . . ",
  160. (unsigned char*)" . . ",
  161. (unsigned char*)" . . ",
  162. (unsigned char*)" . . ",
  163. (unsigned char*)" . . ",
  164. (unsigned char*)" . . ",
  165. (unsigned char*)" ........ ",
  166. (unsigned char*)" ",
  167. (unsigned char*)" "};
  168. static unsigned char *image_Pulse2[] = {
  169. (unsigned char*)"20 20 2 1",
  170. (unsigned char*)" \tc None",
  171. (unsigned char*)".\tc #000000",
  172. (unsigned char*)" ",
  173. (unsigned char*)" ",
  174. (unsigned char*)" ........ ",
  175. (unsigned char*)" . . ",
  176. (unsigned char*)" . . ",
  177. (unsigned char*)" . . ",
  178. (unsigned char*)" . . ",
  179. (unsigned char*)" . . ",
  180. (unsigned char*)" . . ",
  181. (unsigned char*)" . . ",
  182. (unsigned char*)" ... . ... ",
  183. (unsigned char*)" . . ",
  184. (unsigned char*)" . . ",
  185. (unsigned char*)" . . ",
  186. (unsigned char*)" . . ",
  187. (unsigned char*)" . . ",
  188. (unsigned char*)" . . ",
  189. (unsigned char*)" .... ",
  190. (unsigned char*)" ",
  191. (unsigned char*)" "};
  192. static unsigned char *image_InvSine[] = {
  193. (unsigned char*)"20 20 2 1",
  194. (unsigned char*)" \tc None",
  195. (unsigned char*)".\tc #000000",
  196. (unsigned char*)" ",
  197. (unsigned char*)" ",
  198. (unsigned char*)" . . ",
  199. (unsigned char*)" . . ",
  200. (unsigned char*)" . . ",
  201. (unsigned char*)" .. .. ",
  202. (unsigned char*)" .. .. ",
  203. (unsigned char*)" . . . . ",
  204. (unsigned char*)" . .. . ",
  205. (unsigned char*)" . . ",
  206. (unsigned char*)" . . . ",
  207. (unsigned char*)" . . ",
  208. (unsigned char*)" . .. . ",
  209. (unsigned char*)" . . . . ",
  210. (unsigned char*)" .. .. ",
  211. (unsigned char*)" .. .. ",
  212. (unsigned char*)" . . ",
  213. (unsigned char*)" . . ",
  214. (unsigned char*)" ",
  215. (unsigned char*)" "};
  216. WaveTablePluginGUI::WaveTablePluginGUI(int w, int h, SpiralPlugin *o, ChannelHandler *ch, const HostInfo *Info) :
  217. SpiralPluginGUI(w,h,o,ch),
  218. pixmap_Square(image_Square),
  219. pixmap_Saw(image_Saw),
  220. pixmap_RevSaw(image_RevSaw),
  221. pixmap_Tri(image_Tri),
  222. pixmap_Sine(image_Sine),
  223. pixmap_Pulse1(image_Pulse1),
  224. pixmap_Pulse2(image_Pulse2),
  225. pixmap_InvSine(image_InvSine),
  226. m_FineFreq(0),
  227. m_Octave(0)
  228. {
  229. ShapeSine = new Fl_Check_Button(5, 15, 55, 30);
  230. ShapeSine->type(102);
  231. ShapeSine->down_box(FL_DIAMOND_DOWN_BOX);
  232. ShapeSine->selection_color(GUI_COLOUR);
  233. pixmap_Sine.label(ShapeSine);
  234. ShapeSine->set();
  235. ShapeSine->callback((Fl_Callback*)cb_Sine);
  236. ShapeSquare = new Fl_Check_Button(5, 35, 55, 30);
  237. ShapeSquare->type(102);
  238. ShapeSquare->down_box(FL_DIAMOND_DOWN_BOX);
  239. ShapeSquare->selection_color(GUI_COLOUR);
  240. pixmap_Square.label(ShapeSquare);
  241. ShapeSquare->callback((Fl_Callback*)cb_Square);
  242. ShapeSaw = new Fl_Check_Button(5, 55, 55, 30);
  243. ShapeSaw->type(102);
  244. ShapeSaw->down_box(FL_DIAMOND_DOWN_BOX);
  245. ShapeSaw->selection_color(GUI_COLOUR);
  246. pixmap_Saw.label(ShapeSaw);
  247. ShapeSaw->callback((Fl_Callback*)cb_Saw);
  248. ShapeRevSaw = new Fl_Check_Button(5, 75, 55, 30);
  249. ShapeRevSaw->type(102);
  250. ShapeRevSaw->down_box(FL_DIAMOND_DOWN_BOX);
  251. ShapeRevSaw->selection_color(GUI_COLOUR);
  252. pixmap_RevSaw.label(ShapeRevSaw);
  253. ShapeRevSaw->callback((Fl_Callback*)cb_RevSaw);
  254. ShapeTri = new Fl_Check_Button(55, 15, 55, 30);
  255. ShapeTri->type(102);
  256. ShapeTri->down_box(FL_DIAMOND_DOWN_BOX);
  257. ShapeTri->selection_color(GUI_COLOUR);
  258. pixmap_Tri.label(ShapeTri);
  259. ShapeTri->callback((Fl_Callback*)cb_Tri);
  260. Pulse1 = new Fl_Check_Button(55, 35, 55, 30);
  261. Pulse1->type(102);
  262. Pulse1->down_box(FL_DIAMOND_DOWN_BOX);
  263. Pulse1->selection_color(GUI_COLOUR);
  264. pixmap_Pulse1.label(Pulse1);
  265. Pulse1->callback((Fl_Callback*)cb_Pulse1);
  266. Pulse2 = new Fl_Check_Button(55, 55, 55, 30);
  267. Pulse2->type(102);
  268. Pulse2->down_box(FL_DIAMOND_DOWN_BOX);
  269. Pulse2->selection_color(GUI_COLOUR);
  270. pixmap_Pulse2.label(Pulse2);
  271. Pulse2->callback((Fl_Callback*)cb_Pulse2);
  272. ShapeInvSine = new Fl_Check_Button(55, 75, 55, 30);
  273. ShapeInvSine->type(102);
  274. ShapeInvSine->down_box(FL_DIAMOND_DOWN_BOX);
  275. ShapeInvSine->selection_color(GUI_COLOUR);
  276. pixmap_InvSine.label(ShapeInvSine);
  277. ShapeInvSine->callback((Fl_Callback*)cb_InvSine);
  278. Freq = new Fl_Knob(188, 2, 40, 40, "Octave");
  279. Freq->color(GUI_COLOUR);
  280. Freq->type(Fl_Knob::LINELIN);
  281. Freq->labelsize(10);
  282. Freq->maximum(6);
  283. Freq->step(1);
  284. Freq->value(3);
  285. Freq->scaleticks(6);
  286. Freq->cursor(50);
  287. Freq->callback((Fl_Callback*)cb_Freq);
  288. FineTune = new Fl_Knob(112, 22, 65, 65, "Fine Tune");
  289. FineTune->color(GUI_COLOUR);
  290. FineTune->type(Fl_Knob::LINELIN);
  291. FineTune->labelsize(10);
  292. FineTune->scaleticks(20);
  293. FineTune->maximum(1.414);
  294. FineTune->step(0.000001);
  295. FineTune->value(1);
  296. FineTune->callback((Fl_Callback*)cb_FineTune);
  297. ModAmount = new Fl_Knob(188, 54, 40, 40, "Mod Depth");
  298. ModAmount->color(GUI_COLOUR);
  299. ModAmount->type(Fl_Knob::LINELIN);
  300. ModAmount->labelsize(10);
  301. ModAmount->maximum(2.0f);
  302. ModAmount->step(0.001);
  303. ModAmount->value(1.0);
  304. ModAmount->callback((Fl_Callback*)cb_ModAmount);
  305. m_pop = new Fl_Button(1,h-14, 13, 13, "@>");
  306. m_pop->type(1);
  307. m_pop->box(FL_FLAT_BOX);
  308. m_pop->down_box(FL_FLAT_BOX);
  309. //m_pop->labeltype(FL_ICON_LABEL);
  310. m_pop->labelsize(10);
  311. m_pop->labelcolor(25);
  312. m_pop->callback((Fl_Callback*)cb_pop);
  313. m_out_freq = new Fl_Output(65,h+5, 58, 15, "Frequency");
  314. m_out_freq->box(FL_ENGRAVED_BOX);
  315. m_out_freq->color(16);
  316. m_out_freq->labelsize(10);
  317. m_out_freq->textsize(10);
  318. m_out_freq->hide();
  319. m_out_freq->set_output();
  320. m_out_mod = new Fl_Output(188,h+5, 48, 15, "Modulation");
  321. m_out_mod->box(FL_ENGRAVED_BOX);
  322. m_out_mod->color(16);
  323. m_out_mod->labelsize(10);
  324. m_out_mod->textsize(10);
  325. m_out_mod->hide();
  326. m_out_mod->set_output();
  327. end();
  328. }
  329. extern "C" int sprintf(char *,const char *,...);
  330. void WaveTablePluginGUI::UpdateValues(SpiralPlugin *o)
  331. {
  332. WaveTablePlugin *Plugin = (WaveTablePlugin*)o;
  333. ShapeSquare->value(0);
  334. ShapeRevSaw->value(0);
  335. ShapeSaw->value(0);
  336. ShapeTri->value(0);
  337. ShapeSine->value(0);
  338. Pulse1->value(0);
  339. Pulse2->value(0);
  340. ShapeInvSine->value(0);
  341. switch (Plugin->GetType())
  342. {
  343. case WaveTablePlugin::SQUARE : ShapeSquare->value(1); break;
  344. case WaveTablePlugin::SINE : ShapeSine->value(1); break;
  345. case WaveTablePlugin::SAW : ShapeSaw->value(1); break;
  346. case WaveTablePlugin::REVSAW : ShapeRevSaw->value(1); break;
  347. case WaveTablePlugin::TRIANGLE : ShapeTri->value(1); break;
  348. case WaveTablePlugin::PULSE1 : Pulse1->value(1); break;
  349. case WaveTablePlugin::PULSE2 : Pulse2->value(1); break;
  350. case WaveTablePlugin::INVSINE : ShapeInvSine->value(1); break;
  351. }
  352. Freq->value (Plugin->GetOctave () - 3);
  353. ModAmount->value(Plugin->GetModAmount());
  354. FineTune->value(sqrt(Plugin->GetFinefreq()));
  355. char str[10];
  356. float fr = 110.0f * Plugin->GetFinefreq();
  357. m_FineFreq=Plugin->GetFinefreq();
  358. int oc = Plugin->GetOctave();
  359. m_Octave = oc;
  360. if (oc > 0) fr *= 1 << oc;
  361. if (oc < 0) fr /= 1 << (-oc);
  362. sprintf(str,"%4.1f Hz", fr);
  363. m_out_freq->value(str);
  364. sprintf(str,"%4.0f %%", 100*Plugin->GetModAmount());
  365. m_out_mod->value(str);
  366. }
  367. //// Callbacks ////
  368. inline void WaveTablePluginGUI::cb_Freq_i(Fl_Knob* o, void* v)
  369. {
  370. char str[10];
  371. m_GUICH->Set("Octave",(int)o->value()-3);
  372. m_Octave=(int)o->value()-3;
  373. float fr = 110.0f * m_FineFreq;
  374. int oc = m_Octave;
  375. if (oc > 0) fr *= 1 << oc;
  376. if (oc < 0) fr /= 1 << (-oc);
  377. sprintf(str,"%4.1f Hz", fr);
  378. m_out_freq->value(str);
  379. }
  380. void WaveTablePluginGUI::cb_Freq(Fl_Knob* o, void* v)
  381. { ((WaveTablePluginGUI*)(o->parent()))->cb_Freq_i(o,v); }
  382. inline void WaveTablePluginGUI::cb_FineTune_i(Fl_Knob* o, void* v)
  383. {
  384. char str[10];
  385. m_GUICH->Set("FineFreq",(float)(o->value()*o->value()));
  386. m_FineFreq=(float)(o->value()*o->value());
  387. float fr = 110.0f * m_FineFreq;
  388. int oc = m_Octave;
  389. if (oc > 0) fr *= 1 << oc;
  390. if (oc < 0) fr /= 1 << (-oc);
  391. sprintf(str,"%4.1f Hz", fr);
  392. m_out_freq->value(str);
  393. }
  394. void WaveTablePluginGUI::cb_FineTune(Fl_Knob* o, void* v)
  395. { ((WaveTablePluginGUI*)(o->parent()))->cb_FineTune_i(o,v); }
  396. inline void WaveTablePluginGUI::cb_Square_i(Fl_Check_Button* o, void* v)
  397. { m_GUICH->Set("Type",(char)WaveTablePlugin::SQUARE); }
  398. void WaveTablePluginGUI::cb_Square(Fl_Check_Button* o, void* v)
  399. { ((WaveTablePluginGUI*)(o->parent()))->cb_Square_i(o,v); }
  400. inline void WaveTablePluginGUI::cb_Saw_i(Fl_Check_Button* o, void* v)
  401. { m_GUICH->Set("Type",(char)WaveTablePlugin::SAW); }
  402. void WaveTablePluginGUI::cb_Saw(Fl_Check_Button* o, void* v)
  403. { ((WaveTablePluginGUI*)(o->parent()))->cb_Saw_i(o,v); }
  404. inline void WaveTablePluginGUI::cb_Sine_i(Fl_Check_Button* o, void* v)
  405. { m_GUICH->Set("Type",(char)WaveTablePlugin::SINE); }
  406. void WaveTablePluginGUI::cb_Sine(Fl_Check_Button* o, void* v)
  407. { ((WaveTablePluginGUI*)(o->parent()))->cb_Sine_i(o,v); }
  408. inline void WaveTablePluginGUI::cb_RevSaw_i(Fl_Check_Button* o, void* v)
  409. { m_GUICH->Set("Type",(char)WaveTablePlugin::REVSAW); }
  410. void WaveTablePluginGUI::cb_RevSaw(Fl_Check_Button* o, void* v)
  411. { ((WaveTablePluginGUI*)(o->parent()))->cb_RevSaw_i(o,v); }
  412. inline void WaveTablePluginGUI::cb_Tri_i(Fl_Check_Button* o, void* v)
  413. { m_GUICH->Set("Type",(char)WaveTablePlugin::TRIANGLE); }
  414. void WaveTablePluginGUI::cb_Tri(Fl_Check_Button* o, void* v)
  415. { ((WaveTablePluginGUI*)(o->parent()))->cb_Tri_i(o,v); }
  416. inline void WaveTablePluginGUI::cb_Pulse1_i(Fl_Check_Button* o, void* v)
  417. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE1); }
  418. void WaveTablePluginGUI::cb_Pulse1(Fl_Check_Button* o, void* v)
  419. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse1_i(o,v); }
  420. inline void WaveTablePluginGUI::cb_Pulse2_i(Fl_Check_Button* o, void* v)
  421. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE2); }
  422. void WaveTablePluginGUI::cb_Pulse2(Fl_Check_Button* o, void* v)
  423. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse2_i(o,v); }
  424. inline void WaveTablePluginGUI::cb_InvSine_i(Fl_Check_Button* o, void* v)
  425. { m_GUICH->Set("Type",(char)WaveTablePlugin::INVSINE); }
  426. void WaveTablePluginGUI::cb_InvSine(Fl_Check_Button* o, void* v)
  427. { ((WaveTablePluginGUI*)(o->parent()))->cb_InvSine_i(o,v); }
  428. inline void WaveTablePluginGUI::cb_ModAmount_i(Fl_Knob* o, void* v)
  429. {
  430. char str[10];
  431. m_GUICH->Set("ModAmount",(float)o->value());
  432. sprintf(str,"%4.0f %%", 100*o->value());
  433. m_out_mod->value(str);
  434. }
  435. void WaveTablePluginGUI::cb_ModAmount(Fl_Knob* o, void* v)
  436. { ((WaveTablePluginGUI*)(o->parent()))->cb_ModAmount_i(o,v); }
  437. inline void WaveTablePluginGUI::cb_pop_i(Fl_Button *o, void*) {
  438. if (o->value())
  439. {
  440. o->label("@2>");
  441. m_out_freq->show();
  442. m_out_mod->show();
  443. redraw();
  444. }
  445. else
  446. {
  447. o->label("@>");
  448. m_out_freq->hide();
  449. m_out_mod->hide();
  450. redraw();
  451. parent()->redraw();
  452. }
  453. }
  454. void WaveTablePluginGUI::cb_pop(Fl_Button* o, void* v) {
  455. ((WaveTablePluginGUI*)o->parent())->cb_pop_i(o,v);
  456. }
  457. const string WaveTablePluginGUI::GetHelpText(const string &loc){
  458. return string("")
  459. + "The WaveTable plugin is a fast multifunction oscillator with a variety \n"
  460. + "of wave shapes:\n"
  461. + "Sine, Square, Saw, Reverse Saw, Triangle, Two pulse shapes and an inverse\n"
  462. + "sinewave.\n\n"
  463. + "These wave shapes are internally represented as samples, rather than\n"
  464. + "being continually calculated like the conventional oscillator. This \n"
  465. + "makes the plugin fast, but restricts the modulations you can do on the\n"
  466. + "wave forms (no pulsewidth).\n\n"
  467. + "The oscillator can be pitched very low for use as a LFO CV generator,\n"
  468. + "using any of the supported wave shapes. User wave shapes are planned,\n"
  469. + "so you will be able to load your own samples in.";
  470. }