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.

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