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.

500 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. {
  227. ShapeSine = new Fl_Check_Button(5, 15, 55, 30);
  228. ShapeSine->type(102);
  229. ShapeSine->down_box(FL_DIAMOND_DOWN_BOX);
  230. ShapeSine->selection_color(GUI_COLOUR);
  231. pixmap_Sine.label(ShapeSine);
  232. ShapeSine->set();
  233. ShapeSine->callback((Fl_Callback*)cb_Sine);
  234. ShapeSquare = new Fl_Check_Button(5, 35, 55, 30);
  235. ShapeSquare->type(102);
  236. ShapeSquare->down_box(FL_DIAMOND_DOWN_BOX);
  237. ShapeSquare->selection_color(GUI_COLOUR);
  238. pixmap_Square.label(ShapeSquare);
  239. ShapeSquare->callback((Fl_Callback*)cb_Square);
  240. ShapeSaw = new Fl_Check_Button(5, 55, 55, 30);
  241. ShapeSaw->type(102);
  242. ShapeSaw->down_box(FL_DIAMOND_DOWN_BOX);
  243. ShapeSaw->selection_color(GUI_COLOUR);
  244. pixmap_Saw.label(ShapeSaw);
  245. ShapeSaw->callback((Fl_Callback*)cb_Saw);
  246. ShapeRevSaw = new Fl_Check_Button(5, 75, 55, 30);
  247. ShapeRevSaw->type(102);
  248. ShapeRevSaw->down_box(FL_DIAMOND_DOWN_BOX);
  249. ShapeRevSaw->selection_color(GUI_COLOUR);
  250. pixmap_RevSaw.label(ShapeRevSaw);
  251. ShapeRevSaw->callback((Fl_Callback*)cb_RevSaw);
  252. ShapeTri = new Fl_Check_Button(55, 15, 55, 30);
  253. ShapeTri->type(102);
  254. ShapeTri->down_box(FL_DIAMOND_DOWN_BOX);
  255. ShapeTri->selection_color(GUI_COLOUR);
  256. pixmap_Tri.label(ShapeTri);
  257. ShapeTri->callback((Fl_Callback*)cb_Tri);
  258. Pulse1 = new Fl_Check_Button(55, 35, 55, 30);
  259. Pulse1->type(102);
  260. Pulse1->down_box(FL_DIAMOND_DOWN_BOX);
  261. Pulse1->selection_color(GUI_COLOUR);
  262. pixmap_Pulse1.label(Pulse1);
  263. Pulse1->callback((Fl_Callback*)cb_Pulse1);
  264. Pulse2 = new Fl_Check_Button(55, 55, 55, 30);
  265. Pulse2->type(102);
  266. Pulse2->down_box(FL_DIAMOND_DOWN_BOX);
  267. Pulse2->selection_color(GUI_COLOUR);
  268. pixmap_Pulse2.label(Pulse2);
  269. Pulse2->callback((Fl_Callback*)cb_Pulse2);
  270. ShapeInvSine = new Fl_Check_Button(55, 75, 55, 30);
  271. ShapeInvSine->type(102);
  272. ShapeInvSine->down_box(FL_DIAMOND_DOWN_BOX);
  273. ShapeInvSine->selection_color(GUI_COLOUR);
  274. pixmap_InvSine.label(ShapeInvSine);
  275. ShapeInvSine->callback((Fl_Callback*)cb_InvSine);
  276. Freq = new Fl_Knob(188, 2, 40, 40, "Octave");
  277. Freq->color(GUI_COLOUR);
  278. Freq->type(Fl_Knob::LINELIN);
  279. Freq->labelsize(10);
  280. Freq->maximum(6);
  281. Freq->step(1);
  282. Freq->value(3);
  283. Freq->scaleticks(6);
  284. Freq->cursor(50);
  285. Freq->callback((Fl_Callback*)cb_Freq);
  286. FineTune = new Fl_Knob(112, 22, 65, 65, "Fine Tune");
  287. FineTune->color(GUI_COLOUR);
  288. FineTune->type(Fl_Knob::LINELIN);
  289. FineTune->labelsize(10);
  290. FineTune->scaleticks(20);
  291. FineTune->maximum(1.414);
  292. FineTune->step(0.000001);
  293. FineTune->value(1);
  294. FineTune->callback((Fl_Callback*)cb_FineTune);
  295. ModAmount = new Fl_Knob(188, 54, 40, 40, "Mod Depth");
  296. ModAmount->color(GUI_COLOUR);
  297. ModAmount->type(Fl_Knob::LINELIN);
  298. ModAmount->labelsize(10);
  299. ModAmount->maximum(2.0f);
  300. ModAmount->step(0.001);
  301. ModAmount->value(1.0);
  302. ModAmount->callback((Fl_Callback*)cb_ModAmount);
  303. m_pop = new Fl_Button(1,h-14, 13, 13, "@>");
  304. m_pop->type(1);
  305. m_pop->box(FL_FLAT_BOX);
  306. m_pop->down_box(FL_FLAT_BOX);
  307. //m_pop->labeltype(FL_ICON_LABEL);
  308. m_pop->labelsize(10);
  309. m_pop->labelcolor(25);
  310. m_pop->callback((Fl_Callback*)cb_pop);
  311. m_out_freq = new Fl_Output(65,h+5, 58, 15, "Frequency");
  312. m_out_freq->box(FL_ENGRAVED_BOX);
  313. m_out_freq->color(16);
  314. m_out_freq->labelsize(10);
  315. m_out_freq->textsize(10);
  316. m_out_freq->hide();
  317. m_out_freq->set_output();
  318. m_out_mod = new Fl_Output(188,h+5, 48, 15, "Modulation");
  319. m_out_mod->box(FL_ENGRAVED_BOX);
  320. m_out_mod->color(16);
  321. m_out_mod->labelsize(10);
  322. m_out_mod->textsize(10);
  323. m_out_mod->hide();
  324. m_out_mod->set_output();
  325. end();
  326. }
  327. extern "C" int sprintf(char *,const char *,...);
  328. void WaveTablePluginGUI::UpdateValues(SpiralPlugin *o)
  329. {
  330. WaveTablePlugin *Plugin = (WaveTablePlugin*)o;
  331. ShapeSquare->value(0);
  332. ShapeRevSaw->value(0);
  333. ShapeSaw->value(0);
  334. ShapeTri->value(0);
  335. ShapeSine->value(0);
  336. Pulse1->value(0);
  337. Pulse2->value(0);
  338. ShapeInvSine->value(0);
  339. switch (Plugin->GetType())
  340. {
  341. case WaveTablePlugin::SQUARE : ShapeSquare->value(1); break;
  342. case WaveTablePlugin::SINE : ShapeSine->value(1); break;
  343. case WaveTablePlugin::SAW : ShapeSaw->value(1); break;
  344. case WaveTablePlugin::REVSAW : ShapeRevSaw->value(1); break;
  345. case WaveTablePlugin::TRIANGLE : ShapeTri->value(1); break;
  346. case WaveTablePlugin::PULSE1 : Pulse1->value(1); break;
  347. case WaveTablePlugin::PULSE2 : Pulse2->value(1); break;
  348. case WaveTablePlugin::INVSINE : ShapeInvSine->value(1); break;
  349. }
  350. Freq->value(Plugin->GetOctave());
  351. ModAmount->value(Plugin->GetModAmount());
  352. FineTune->value(sqrt(Plugin->GetFinefreq()));
  353. char str[10];
  354. float fr = 110.0f * Plugin->GetFinefreq();
  355. int oc = Plugin->GetOctave();
  356. if (oc > 0) fr *= 1 << oc;
  357. if (oc < 0) fr /= 1 << (-oc);
  358. sprintf(str,"%4.1f Hz", fr);
  359. m_out_freq->value(str);
  360. sprintf(str,"%4.0f %%", 100*Plugin->GetModAmount());
  361. m_out_mod->value(str);
  362. }
  363. //// Callbacks ////
  364. inline void WaveTablePluginGUI::cb_Freq_i(Fl_Knob* o, void* v)
  365. {
  366. char str[10];
  367. m_GUICH->Set("Octave",(int)o->value()-3);
  368. //float fr = 110.0f * m_Plugin->GetFineFreq();
  369. //int oc = m_Plugin->GetOctave();
  370. //if (oc > 0) fr *= 1 << oc;
  371. //if (oc < 0) fr /= 1 << (-oc);
  372. //sprintf(str,"%4.1f Hz", fr);
  373. //m_out_freq->value(str);
  374. }
  375. void WaveTablePluginGUI::cb_Freq(Fl_Knob* o, void* v)
  376. { ((WaveTablePluginGUI*)(o->parent()))->cb_Freq_i(o,v); }
  377. inline void WaveTablePluginGUI::cb_FineTune_i(Fl_Knob* o, void* v)
  378. {
  379. char str[10];
  380. m_GUICH->Set("FineFreq",(float)(o->value()*o->value()));
  381. //float fr = 110.0f * m_Plugin->GetFineFreq();
  382. //int oc = m_Plugin->GetOctave();
  383. //if (oc > 0) fr *= 1 << oc;
  384. //if (oc < 0) fr /= 1 << (-oc);
  385. //sprintf(str,"%4.1f Hz", fr);
  386. //m_out_freq->value(str);
  387. }
  388. void WaveTablePluginGUI::cb_FineTune(Fl_Knob* o, void* v)
  389. { ((WaveTablePluginGUI*)(o->parent()))->cb_FineTune_i(o,v); }
  390. inline void WaveTablePluginGUI::cb_Square_i(Fl_Check_Button* o, void* v)
  391. { m_GUICH->Set("Type",(char)WaveTablePlugin::SQUARE); }
  392. void WaveTablePluginGUI::cb_Square(Fl_Check_Button* o, void* v)
  393. { ((WaveTablePluginGUI*)(o->parent()))->cb_Square_i(o,v); }
  394. inline void WaveTablePluginGUI::cb_Saw_i(Fl_Check_Button* o, void* v)
  395. { m_GUICH->Set("Type",(char)WaveTablePlugin::SAW); }
  396. void WaveTablePluginGUI::cb_Saw(Fl_Check_Button* o, void* v)
  397. { ((WaveTablePluginGUI*)(o->parent()))->cb_Saw_i(o,v); }
  398. inline void WaveTablePluginGUI::cb_Sine_i(Fl_Check_Button* o, void* v)
  399. { m_GUICH->Set("Type",(char)WaveTablePlugin::SINE); }
  400. void WaveTablePluginGUI::cb_Sine(Fl_Check_Button* o, void* v)
  401. { ((WaveTablePluginGUI*)(o->parent()))->cb_Sine_i(o,v); }
  402. inline void WaveTablePluginGUI::cb_RevSaw_i(Fl_Check_Button* o, void* v)
  403. { m_GUICH->Set("Type",(char)WaveTablePlugin::REVSAW); }
  404. void WaveTablePluginGUI::cb_RevSaw(Fl_Check_Button* o, void* v)
  405. { ((WaveTablePluginGUI*)(o->parent()))->cb_RevSaw_i(o,v); }
  406. inline void WaveTablePluginGUI::cb_Tri_i(Fl_Check_Button* o, void* v)
  407. { m_GUICH->Set("Type",(char)WaveTablePlugin::TRIANGLE); }
  408. void WaveTablePluginGUI::cb_Tri(Fl_Check_Button* o, void* v)
  409. { ((WaveTablePluginGUI*)(o->parent()))->cb_Tri_i(o,v); }
  410. inline void WaveTablePluginGUI::cb_Pulse1_i(Fl_Check_Button* o, void* v)
  411. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE1); }
  412. void WaveTablePluginGUI::cb_Pulse1(Fl_Check_Button* o, void* v)
  413. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse1_i(o,v); }
  414. inline void WaveTablePluginGUI::cb_Pulse2_i(Fl_Check_Button* o, void* v)
  415. { m_GUICH->Set("Type",(char)WaveTablePlugin::PULSE2); }
  416. void WaveTablePluginGUI::cb_Pulse2(Fl_Check_Button* o, void* v)
  417. { ((WaveTablePluginGUI*)(o->parent()))->cb_Pulse2_i(o,v); }
  418. inline void WaveTablePluginGUI::cb_InvSine_i(Fl_Check_Button* o, void* v)
  419. { m_GUICH->Set("Type",(char)WaveTablePlugin::INVSINE); }
  420. void WaveTablePluginGUI::cb_InvSine(Fl_Check_Button* o, void* v)
  421. { ((WaveTablePluginGUI*)(o->parent()))->cb_InvSine_i(o,v); }
  422. inline void WaveTablePluginGUI::cb_ModAmount_i(Fl_Knob* o, void* v)
  423. {
  424. char str[10];
  425. m_GUICH->Set("ModAmount",o->value());
  426. sprintf(str,"%4.0f %%", 100*o->value());
  427. m_out_mod->value(str);
  428. }
  429. void WaveTablePluginGUI::cb_ModAmount(Fl_Knob* o, void* v)
  430. { ((WaveTablePluginGUI*)(o->parent()))->cb_ModAmount_i(o,v); }
  431. inline void WaveTablePluginGUI::cb_pop_i(Fl_Button *o, void*) {
  432. if (o->value())
  433. {
  434. o->label("@2>");
  435. m_out_freq->show();
  436. m_out_mod->show();
  437. redraw();
  438. }
  439. else
  440. {
  441. o->label("@>");
  442. m_out_freq->hide();
  443. m_out_mod->hide();
  444. redraw();
  445. parent()->redraw();
  446. }
  447. }
  448. void WaveTablePluginGUI::cb_pop(Fl_Button* o, void* v) {
  449. ((WaveTablePluginGUI*)o->parent())->cb_pop_i(o,v);
  450. }