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.

409 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 "MatrixPluginGUI.h"
  19. #include <FL/fl_draw.h>
  20. #include <FL/fl_draw.H>
  21. #include <FL/fl_file_chooser.h>
  22. static const int GUI_COLOUR = 179;
  23. static const int GUIBG_COLOUR = 144;
  24. static const int GUIBG2_COLOUR = 145;
  25. ////////////////////////////////////////////
  26. Fl_MatrixButton::Fl_MatrixButton(int x, int y, int w, int h, char* n) :
  27. Fl_Button(x,y,w,h,n),
  28. m_Volume(NULL),
  29. cb_VolChange(NULL),
  30. cb_context(NULL)
  31. {
  32. m_SliderHidden=true;
  33. m_VolVal=255;
  34. }
  35. void Fl_MatrixButton::draw()
  36. {
  37. if (m_Volume)
  38. {
  39. m_VolVal=255-m_Volume->value();
  40. fl_color((char)m_VolVal,(char)m_VolVal,255);
  41. selection_color(fl_color());
  42. if (cb_VolChange) cb_VolChange(this,cb_context);
  43. }
  44. Fl_Button::draw();
  45. }
  46. int Fl_MatrixButton::handle(int event)
  47. {
  48. if (value()==true && event==FL_PUSH && Fl::event_button()==3)
  49. {
  50. if (m_SliderHidden)
  51. {
  52. m_Volume = new Fl_Slider(x(),y()+h(),w(),50,"");
  53. m_Volume->type(4);
  54. m_Volume->selection_color(GUI_COLOUR);
  55. m_Volume->maximum(255);
  56. m_Volume->step(1);
  57. m_Volume->value(255-m_VolVal);
  58. m_Volume->show();
  59. parent()->add(m_Volume);
  60. parent()->redraw();
  61. m_SliderHidden=false;
  62. }
  63. else
  64. {
  65. m_Volume->hide();
  66. m_VolVal=m_Volume->value();
  67. parent()->remove(m_Volume);
  68. parent()->redraw();
  69. m_Volume=NULL;
  70. m_SliderHidden=true;
  71. }
  72. return 1;
  73. }
  74. if (Fl::event_button()!=3) return Fl_Button::handle(event);
  75. return 1;
  76. }
  77. ////////////////////////////////////////////
  78. MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) :
  79. SpiralPluginGUI(w,h,o,ch)
  80. {
  81. //size_range(10,10);
  82. m_NoteCut = new Fl_Button (5, h-30, 85, 20,"NoteCut");
  83. m_NoteCut->type(1);
  84. m_NoteCut->labelsize(10);
  85. m_NoteCut->value(0);
  86. m_NoteCut->callback((Fl_Callback*)cb_NoteCut);
  87. add(m_NoteCut);
  88. m_Pattern = new Fl_Counter(5, 20, 40, 20, "Pattern");
  89. m_Pattern->labelsize(10);
  90. m_Pattern->type(FL_SIMPLE_COUNTER);
  91. m_Pattern->step(1);
  92. m_Pattern->value(0);
  93. m_Pattern->callback((Fl_Callback*)cb_Pattern);
  94. add(m_Pattern);
  95. m_Length = new Fl_Counter(5, 55, 40, 20, "Length");
  96. m_Length->labelsize(10);
  97. m_Length->type(FL_SIMPLE_COUNTER);
  98. m_Length->step(1);
  99. m_Length->value(64);
  100. m_Length->callback((Fl_Callback*)cb_Length);
  101. add(m_Length);
  102. m_Speed = new Fl_Knob (50, 60, 40, 40, "Speed");
  103. m_Speed->color(GUI_COLOUR);
  104. m_Speed->type(Fl_Knob::DOTLIN);
  105. m_Speed->labelsize(10);
  106. m_Speed->maximum(200);
  107. m_Speed->step(0.01);
  108. m_Speed->value(1.0);
  109. m_Speed->callback((Fl_Callback*)cb_Speed);
  110. add(m_Speed);
  111. m_SpeedVal = new Fl_Counter (5, 125, 85, 20, "");
  112. m_SpeedVal->labelsize(10);
  113. m_SpeedVal->value(10);
  114. m_SpeedVal->type(FL_SIMPLE_COUNTER);
  115. m_SpeedVal->step(1);
  116. m_SpeedVal->callback((Fl_Callback*)cb_Speed);
  117. add(m_SpeedVal);
  118. m_Octave = new Fl_Counter(5, 90, 40, 20, "Octave");
  119. m_Octave->labelsize(10);
  120. m_Octave->type(FL_SIMPLE_COUNTER);
  121. m_Octave->step(1);
  122. m_Octave->value(0);
  123. m_Octave->callback((Fl_Callback*)cb_Octave);
  124. add(m_Octave);
  125. m_CopyBtn = new Fl_Button (5, 150, 40, 20, "Copy");
  126. m_CopyBtn->labelsize (10);
  127. m_CopyBtn->callback ((Fl_Callback*)cb_CopyBtn);
  128. add (m_CopyBtn);
  129. m_PasteBtn = new Fl_Button (50, 150, 40, 20, "Paste");
  130. m_PasteBtn->labelsize (10);
  131. m_PasteBtn->deactivate();
  132. m_PasteBtn->callback ((Fl_Callback*)cb_PasteBtn);
  133. add (m_PasteBtn);
  134. m_ClearBtn = new Fl_Button (5, 175, 85, 20, "Clear");
  135. m_ClearBtn->labelsize (10);
  136. m_ClearBtn->callback ((Fl_Callback*)cb_ClearBtn);
  137. add (m_ClearBtn);
  138. m_TransUpBtn = new Fl_Button (5, 200, 40, 20, "Up");
  139. m_TransUpBtn->labelsize (10);
  140. m_TransUpBtn->callback ((Fl_Callback*)cb_TransUpBtn);
  141. add (m_TransUpBtn);
  142. m_TransDnBtn = new Fl_Button (50, 200, 40, 20, "Down");
  143. m_TransDnBtn->labelsize (10);
  144. m_TransDnBtn->callback ((Fl_Callback*)cb_TransDnBtn);
  145. add (m_TransDnBtn);
  146. m_TransLbl = new Fl_Box (5, 216, 85, 20, "Transpose");
  147. m_TransLbl->labelsize(10);
  148. add (m_TransLbl);
  149. int xoff=95;
  150. int yoff=40;
  151. int butsize=7;
  152. int n=0;
  153. fl_color(150,150,150);
  154. int markercol=fl_color();
  155. for(int x=0; x<MATX; x++)
  156. for(int y=0; y<MATY; y++)
  157. {
  158. Numbers[n]=n;
  159. m_Matrix[x][y] = new Fl_MatrixButton(xoff+x*butsize,yoff+y*butsize,butsize+1,butsize+1,"");
  160. m_Matrix[x][y]->type(1);
  161. m_Matrix[x][y]->box(FL_BORDER_BOX);
  162. if ((x%8)==0) m_Matrix[x][y]->color(markercol);
  163. else m_Matrix[x][y]->color(FL_GRAY);
  164. m_Matrix[x][y]->selection_color(FL_WHITE);
  165. m_Matrix[x][y]->callback((Fl_Callback*)cb_Matrix,(void*)&Numbers[n]);
  166. m_Matrix[x][y]->SetVolCallback((Fl_Callback*)cb_MatVol,(void*)&Numbers[n]);
  167. add(m_Matrix[x][y]);
  168. n++;
  169. }
  170. xoff=93;
  171. for(int x=0; x<MATX; x++)
  172. {
  173. m_Flash[x] = new Fl_LED_Button(xoff+x*butsize,20,15,15,"");
  174. m_Flash[x]->selection_color(FL_WHITE);
  175. add(m_Flash[x]);
  176. }
  177. end();
  178. }
  179. void MatrixPluginGUI::Update()
  180. {
  181. for(int x=0; x<MATX; x++)
  182. {
  183. m_Flash[x]->value(0);
  184. }
  185. m_Flash[m_GUICH->GetInt("Step")]->value(1);
  186. redraw();
  187. }
  188. void MatrixPluginGUI::UpdateValues(SpiralPlugin *o)
  189. {
  190. MatrixPlugin *Plugin = (MatrixPlugin*)o;
  191. m_Pattern->value(Plugin->GetCurrent());
  192. m_Length->value(Plugin->GetPattern()->Length);
  193. m_Speed->value(Plugin->GetPattern()->Speed);
  194. m_SpeedVal->value((int)m_Speed->value());
  195. m_Octave->value(Plugin->GetPattern()->Octave);
  196. for(int x=0; x<MATX; x++)
  197. for(int y=0; y<MATY; y++)
  198. {
  199. m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]);
  200. m_Matrix[x][y]->SetVolume(Plugin->GetPattern()->Volume[x][y]);
  201. }
  202. //if (Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate();
  203. //if (Plugin->CanTransposeDown()) m_TransDnBtn->activate(); else m_TransDnBtn->deactivate();
  204. }
  205. /*void MatrixPluginGUI::SetLED(int n)
  206. {
  207. for (int i=0; i<MATX; i++)
  208. {
  209. m_Flash[i]->value(false);
  210. }
  211. m_Flash[n]->value(true);
  212. }*/
  213. void MatrixPluginGUI::UpdateMatrix()
  214. {
  215. m_GUICH->Wait();
  216. m_GUICH->RequestChannelAndWait("Matrix");
  217. m_GUICH->GetData("Matrix",(void*)m_GUIMatrix);
  218. for(int x=0; x<MATX; x++)
  219. for(int y=0; y<MATY; y++)
  220. {
  221. m_Matrix[x][y]->value(m_GUIMatrix[(int)m_Pattern->value()].Matrix[x][y]);
  222. m_Matrix[x][y]->SetVolume(m_GUIMatrix[(int)m_Pattern->value()].Volume[x][y]);
  223. }
  224. }
  225. inline void MatrixPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v)
  226. {
  227. m_GUICH->Set("NoteCut",o->value());
  228. }
  229. void MatrixPluginGUI::cb_NoteCut(Fl_Button* o, void* v)
  230. { ((MatrixPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);}
  231. inline void MatrixPluginGUI::cb_Matrix_i(Fl_Button* o, void* v)
  232. {
  233. m_GUICH->Set("X",*(int*)v/MATY);
  234. m_GUICH->Set("Y",*(int*)v%MATY);
  235. if (o->value()) m_GUICH->SetCommand(MatrixPlugin::MAT_ACTIVATE);
  236. else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE);
  237. m_GUICH->Wait();
  238. }
  239. void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v)
  240. { ((MatrixPluginGUI*)(o->parent()))->cb_Matrix_i(o,v);}
  241. inline void MatrixPluginGUI::cb_MatVol_i(Fl_Button* o, void* v)
  242. {
  243. m_GUICH->Set("X",*(int*)v/MATY);
  244. m_GUICH->Set("Y",*(int*)v%MATY);
  245. m_GUICH->Set("Volume",((Fl_MatrixButton*)o)->GetVolume());
  246. m_GUICH->SetCommand(MatrixPlugin::MAT_VOLUME);
  247. }
  248. void MatrixPluginGUI::cb_MatVol(Fl_Button* o, void* v)
  249. { ((MatrixPluginGUI*)(o->parent()))->cb_MatVol_i(o,v);}
  250. inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v)
  251. {
  252. if (o->value()<0) o->value(0);
  253. if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1);
  254. m_GUICH->Set("Current",(int)o->value());
  255. UpdateMatrix();
  256. }
  257. void MatrixPluginGUI::cb_Pattern(Fl_Counter* o, void* v)
  258. { ((MatrixPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);}
  259. inline void MatrixPluginGUI::cb_Length_i(Fl_Counter* o, void* v)
  260. {
  261. if (o->value()<1) o->value(1);
  262. if (o->value()>64) o->value(64);
  263. //m_GUICH->GetPattern()->Length=(int)o->value();
  264. cerr<<(int)o->value()<<endl;
  265. m_GUICH->Set("Length",(int)o->value());
  266. m_GUICH->SetCommand(MatrixPlugin::MAT_LENGTH);
  267. }
  268. void MatrixPluginGUI::cb_Length(Fl_Counter* o, void* v)
  269. { ((MatrixPluginGUI*)(o->parent()))->cb_Length_i(o,v);}
  270. inline void MatrixPluginGUI::cb_Speed_i(Fl_Knob* o, void* v)
  271. {
  272. // Round off value, but it should be a float for tweaking
  273. float value=o->value()+((int)o->value()-o->value());
  274. m_SpeedVal->value(value);
  275. m_GUICH->Set("Speed",(float)value);
  276. m_GUICH->SetCommand(MatrixPlugin::MAT_SPEED);
  277. }
  278. void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v)
  279. { ((MatrixPluginGUI*)(o->parent()))->cb_Speed_i(o,v);}
  280. inline void MatrixPluginGUI::cb_Octave_i(Fl_Counter* o, void* v)
  281. {
  282. if (o->value()<0) o->value(0);
  283. if (o->value()>6) o->value(6);
  284. m_GUICH->Set("Octave",(int)o->value());
  285. m_GUICH->SetCommand(MatrixPlugin::MAT_OCTAVE);
  286. }
  287. void MatrixPluginGUI::cb_Octave(Fl_Counter* o, void* v)
  288. { ((MatrixPluginGUI*)(o->parent()))->cb_Octave_i(o,v);}
  289. inline void MatrixPluginGUI::cb_SpeedVal_i (Fl_Counter* o, void* v)
  290. {
  291. m_Speed->value(o->value());
  292. }
  293. void MatrixPluginGUI::cb_SpeedVal (Fl_Counter* o, void* v)
  294. {
  295. ((MatrixPluginGUI*)(o->parent())) -> cb_SpeedVal_i (o, v);
  296. }
  297. inline void MatrixPluginGUI::cb_CopyBtn_i (Fl_Button* o, void* v)
  298. {
  299. m_PasteBtn->activate();
  300. m_GUICH->SetCommand(MatrixPlugin::COPY);
  301. UpdateMatrix();
  302. }
  303. void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v)
  304. {
  305. ((MatrixPluginGUI*)(o->parent())) -> cb_CopyBtn_i (o, v);
  306. }
  307. inline void MatrixPluginGUI::cb_PasteBtn_i (Fl_Button* o, void* v)
  308. {
  309. m_GUICH->SetCommand(MatrixPlugin::PASTE);
  310. UpdateMatrix();
  311. }
  312. void MatrixPluginGUI::cb_PasteBtn (Fl_Button* o, void* v)
  313. {
  314. ((MatrixPluginGUI*)(o->parent())) -> cb_PasteBtn_i (o, v);
  315. }
  316. inline void MatrixPluginGUI::cb_ClearBtn_i (Fl_Button* o, void* v)
  317. {
  318. m_GUICH->SetCommand(MatrixPlugin::CLEAR);
  319. UpdateMatrix();
  320. }
  321. void MatrixPluginGUI::cb_ClearBtn (Fl_Button* o, void* v)
  322. {
  323. ((MatrixPluginGUI*)(o->parent())) -> cb_ClearBtn_i (o, v);
  324. }
  325. inline void MatrixPluginGUI::cb_TransUpBtn_i (Fl_Button* o, void* v)
  326. {
  327. m_GUICH->SetCommand(MatrixPlugin::TUP);
  328. UpdateMatrix();
  329. }
  330. void MatrixPluginGUI::cb_TransUpBtn (Fl_Button* o, void* v)
  331. {
  332. ((MatrixPluginGUI*)(o->parent())) -> cb_TransUpBtn_i (o, v);
  333. }
  334. inline void MatrixPluginGUI::cb_TransDnBtn_i (Fl_Button* o, void* v)
  335. {
  336. m_GUICH->SetCommand(MatrixPlugin::TDOWN);
  337. UpdateMatrix();
  338. }
  339. void MatrixPluginGUI::cb_TransDnBtn (Fl_Button* o, void* v)
  340. {
  341. ((MatrixPluginGUI*)(o->parent())) -> cb_TransDnBtn_i (o, v);
  342. }