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.

329 lines
8.9KB

  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. MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) :
  27. SpiralPluginGUI(w,h,o,ch)
  28. {
  29. //size_range(10,10);
  30. m_NoteCut = new Fl_Button (5, h-30, 85, 20,"NoteCut");
  31. m_NoteCut->type(1);
  32. m_NoteCut->labelsize(10);
  33. m_NoteCut->value(0);
  34. m_NoteCut->callback((Fl_Callback*)cb_NoteCut);
  35. add(m_NoteCut);
  36. m_Pattern = new Fl_Counter(5, 20, 40, 20, "Pattern");
  37. m_Pattern->labelsize(10);
  38. m_Pattern->type(FL_SIMPLE_COUNTER);
  39. m_Pattern->step(1);
  40. m_Pattern->value(0);
  41. m_Pattern->callback((Fl_Callback*)cb_Pattern);
  42. add(m_Pattern);
  43. m_Length = new Fl_Counter(5, 55, 40, 20, "Length");
  44. m_Length->labelsize(10);
  45. m_Length->type(FL_SIMPLE_COUNTER);
  46. m_Length->step(1);
  47. m_Length->value(64);
  48. m_Length->callback((Fl_Callback*)cb_Length);
  49. add(m_Length);
  50. m_Speed = new Fl_Knob (50, 60, 40, 40, "Speed");
  51. m_Speed->color(GUI_COLOUR);
  52. m_Speed->type(Fl_Knob::DOTLIN);
  53. m_Speed->labelsize(10);
  54. m_Speed->maximum(200);
  55. m_Speed->step(0.01);
  56. m_Speed->value(1.0);
  57. m_Speed->callback((Fl_Callback*)cb_Speed);
  58. add(m_Speed);
  59. m_SpeedVal = new Fl_Counter (5, 125, 85, 20, "");
  60. m_SpeedVal->labelsize(10);
  61. m_SpeedVal->value(10);
  62. m_SpeedVal->type(FL_SIMPLE_COUNTER);
  63. m_SpeedVal->step(1);
  64. m_SpeedVal->callback((Fl_Callback*)cb_Speed);
  65. add(m_SpeedVal);
  66. m_Octave = new Fl_Counter(5, 90, 40, 20, "Octave");
  67. m_Octave->labelsize(10);
  68. m_Octave->type(FL_SIMPLE_COUNTER);
  69. m_Octave->step(1);
  70. m_Octave->value(0);
  71. m_Octave->callback((Fl_Callback*)cb_Octave);
  72. add(m_Octave);
  73. m_CopyBtn = new Fl_Button (5, 150, 40, 20, "Copy");
  74. m_CopyBtn->labelsize (10);
  75. m_CopyBtn->callback ((Fl_Callback*)cb_CopyBtn);
  76. add (m_CopyBtn);
  77. m_PasteBtn = new Fl_Button (50, 150, 40, 20, "Paste");
  78. m_PasteBtn->labelsize (10);
  79. m_PasteBtn->deactivate();
  80. m_PasteBtn->callback ((Fl_Callback*)cb_PasteBtn);
  81. add (m_PasteBtn);
  82. m_ClearBtn = new Fl_Button (5, 175, 85, 20, "Clear");
  83. m_ClearBtn->labelsize (10);
  84. m_ClearBtn->callback ((Fl_Callback*)cb_ClearBtn);
  85. add (m_ClearBtn);
  86. m_TransUpBtn = new Fl_Button (5, 200, 40, 20, "Up");
  87. m_TransUpBtn->labelsize (10);
  88. m_TransUpBtn->callback ((Fl_Callback*)cb_TransUpBtn);
  89. add (m_TransUpBtn);
  90. m_TransDnBtn = new Fl_Button (50, 200, 40, 20, "Down");
  91. m_TransDnBtn->labelsize (10);
  92. m_TransDnBtn->callback ((Fl_Callback*)cb_TransDnBtn);
  93. add (m_TransDnBtn);
  94. m_TransLbl = new Fl_Box (5, 216, 85, 20, "Transpose");
  95. m_TransLbl->labelsize(10);
  96. add (m_TransLbl);
  97. int xoff=95;
  98. int yoff=40;
  99. int butsize=7;
  100. int n=0;
  101. for(int x=0; x<MATX; x++)
  102. for(int y=0; y<MATY; y++)
  103. {
  104. Numbers[n]=n;
  105. m_Matrix[x][y] = new Fl_Button(xoff+x*butsize,yoff+y*butsize,butsize+1,butsize+1,"");
  106. m_Matrix[x][y]->type(1);
  107. m_Matrix[x][y]->box(FL_BORDER_BOX);
  108. if ((x%8)==0) m_Matrix[x][y]->color(FL_WHITE);
  109. else m_Matrix[x][y]->color(FL_GRAY);
  110. m_Matrix[x][y]->selection_color(FL_BLACK);
  111. m_Matrix[x][y]->callback((Fl_Callback*)cb_Matrix,(void*)&Numbers[n]);
  112. add(m_Matrix[x][y]);
  113. n++;
  114. }
  115. xoff=93;
  116. for(int x=0; x<MATX; x++)
  117. {
  118. m_Flash[x] = new Fl_LED_Button(xoff+x*butsize,20,15,15,"");
  119. m_Flash[x]->selection_color(FL_WHITE);
  120. add(m_Flash[x]);
  121. }
  122. end();
  123. }
  124. void MatrixPluginGUI::draw()
  125. {
  126. SpiralPluginGUI::draw();
  127. for(int x=0; x<MATX; x++)
  128. {
  129. m_Flash[x]->value(0);
  130. }
  131. m_Flash[m_GUICH->GetInt("Step")]->value(1);
  132. }
  133. void MatrixPluginGUI::UpdateValues(SpiralPlugin *o)
  134. {
  135. MatrixPlugin *Plugin = (MatrixPlugin*)o;
  136. m_Pattern->value(Plugin->GetCurrent());
  137. m_Length->value(Plugin->GetPattern()->Length);
  138. m_Speed->value(Plugin->GetPattern()->Speed);
  139. m_SpeedVal->value((int)m_Speed->value());
  140. m_Octave->value(Plugin->GetPattern()->Octave);
  141. for(int x=0; x<MATX; x++)
  142. for(int y=0; y<MATY; y++)
  143. {
  144. m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]);
  145. }
  146. //if (Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate();
  147. //if (Plugin->CanTransposeDown()) m_TransDnBtn->activate(); else m_TransDnBtn->deactivate();
  148. }
  149. /*void MatrixPluginGUI::SetLED(int n)
  150. {
  151. for (int i=0; i<MATX; i++)
  152. {
  153. m_Flash[i]->value(false);
  154. }
  155. m_Flash[n]->value(true);
  156. }*/
  157. void MatrixPluginGUI::UpdateMatrix()
  158. {
  159. m_GUICH->RequestChannelAndWait("Matrix");
  160. m_GUICH->GetData("Matrix",(void*)m_GUIMatrix);
  161. for(int x=0; x<MATX; x++)
  162. for(int y=0; y<MATY; y++)
  163. {
  164. m_Matrix[x][y]->value(m_GUIMatrix[(int)m_Pattern->value()].Matrix[x][y]);
  165. }
  166. }
  167. inline void MatrixPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v)
  168. {
  169. m_GUICH->Set("NoteCut",o->value());
  170. }
  171. void MatrixPluginGUI::cb_NoteCut(Fl_Button* o, void* v)
  172. { ((MatrixPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);}
  173. inline void MatrixPluginGUI::cb_Matrix_i(Fl_Button* o, void* v)
  174. {
  175. m_GUICH->Set("X",*(int*)v/MATY);
  176. m_GUICH->Set("Y",*(int*)v%MATY);
  177. if (o->value()) m_GUICH->SetCommand(MatrixPlugin::MAT_ACTIVATE);
  178. else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE);
  179. }
  180. void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v)
  181. { ((MatrixPluginGUI*)(o->parent()))->cb_Matrix_i(o,v);}
  182. inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v)
  183. {
  184. if (o->value()<0) o->value(0);
  185. if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1);
  186. m_GUICH->Set("Current",(int)o->value());
  187. UpdateMatrix();
  188. }
  189. void MatrixPluginGUI::cb_Pattern(Fl_Counter* o, void* v)
  190. { ((MatrixPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);}
  191. inline void MatrixPluginGUI::cb_Length_i(Fl_Counter* o, void* v)
  192. {
  193. if (o->value()<1) o->value(1);
  194. if (o->value()>64) o->value(64);
  195. //m_GUICH->GetPattern()->Length=(int)o->value();
  196. cerr<<(int)o->value()<<endl;
  197. m_GUICH->Set("Length",(int)o->value());
  198. m_GUICH->SetCommand(MatrixPlugin::MAT_LENGTH);
  199. }
  200. void MatrixPluginGUI::cb_Length(Fl_Counter* o, void* v)
  201. { ((MatrixPluginGUI*)(o->parent()))->cb_Length_i(o,v);}
  202. inline void MatrixPluginGUI::cb_Speed_i(Fl_Knob* o, void* v)
  203. {
  204. // Round off value, but it should be a float for tweaking
  205. float value=o->value()+((int)o->value()-o->value());
  206. m_SpeedVal->value(value);
  207. m_GUICH->Set("Speed",(float)value);
  208. m_GUICH->SetCommand(MatrixPlugin::MAT_SPEED);
  209. }
  210. void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v)
  211. { ((MatrixPluginGUI*)(o->parent()))->cb_Speed_i(o,v);}
  212. inline void MatrixPluginGUI::cb_Octave_i(Fl_Counter* o, void* v)
  213. {
  214. if (o->value()<0) o->value(0);
  215. if (o->value()>6) o->value(6);
  216. m_GUICH->Set("Octave",(int)o->value());
  217. m_GUICH->SetCommand(MatrixPlugin::MAT_OCTAVE);
  218. }
  219. void MatrixPluginGUI::cb_Octave(Fl_Counter* o, void* v)
  220. { ((MatrixPluginGUI*)(o->parent()))->cb_Octave_i(o,v);}
  221. inline void MatrixPluginGUI::cb_SpeedVal_i (Fl_Counter* o, void* v)
  222. {
  223. m_Speed->value(o->value());
  224. }
  225. void MatrixPluginGUI::cb_SpeedVal (Fl_Counter* o, void* v)
  226. {
  227. ((MatrixPluginGUI*)(o->parent())) -> cb_SpeedVal_i (o, v);
  228. }
  229. inline void MatrixPluginGUI::cb_CopyBtn_i (Fl_Button* o, void* v)
  230. {
  231. m_PasteBtn->activate();
  232. m_GUICH->SetCommand(MatrixPlugin::COPY);
  233. }
  234. void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v)
  235. {
  236. ((MatrixPluginGUI*)(o->parent())) -> cb_CopyBtn_i (o, v);
  237. }
  238. inline void MatrixPluginGUI::cb_PasteBtn_i (Fl_Button* o, void* v)
  239. {
  240. m_GUICH->SetCommand(MatrixPlugin::PASTE);
  241. UpdateMatrix();
  242. }
  243. void MatrixPluginGUI::cb_PasteBtn (Fl_Button* o, void* v)
  244. {
  245. ((MatrixPluginGUI*)(o->parent())) -> cb_PasteBtn_i (o, v);
  246. }
  247. inline void MatrixPluginGUI::cb_ClearBtn_i (Fl_Button* o, void* v)
  248. {
  249. m_GUICH->SetCommand(MatrixPlugin::CLEAR);
  250. UpdateMatrix();
  251. }
  252. void MatrixPluginGUI::cb_ClearBtn (Fl_Button* o, void* v)
  253. {
  254. ((MatrixPluginGUI*)(o->parent())) -> cb_ClearBtn_i (o, v);
  255. }
  256. inline void MatrixPluginGUI::cb_TransUpBtn_i (Fl_Button* o, void* v)
  257. {
  258. m_GUICH->SetCommand(MatrixPlugin::TUP);
  259. UpdateMatrix();
  260. }
  261. void MatrixPluginGUI::cb_TransUpBtn (Fl_Button* o, void* v)
  262. {
  263. ((MatrixPluginGUI*)(o->parent())) -> cb_TransUpBtn_i (o, v);
  264. }
  265. inline void MatrixPluginGUI::cb_TransDnBtn_i (Fl_Button* o, void* v)
  266. {
  267. m_GUICH->SetCommand(MatrixPlugin::TDOWN);
  268. UpdateMatrix();
  269. }
  270. void MatrixPluginGUI::cb_TransDnBtn (Fl_Button* o, void* v)
  271. {
  272. ((MatrixPluginGUI*)(o->parent())) -> cb_TransDnBtn_i (o, v);
  273. }