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.

560 lines
19KB

  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 "SpiralLoopPluginGUI.h"
  19. #include <FL/fl_draw.h>
  20. #include <FL/fl_draw.H>
  21. #include <FL/fl_file_chooser.h>
  22. ////////////////////////////////////////////
  23. SpiralLoopPluginGUI::SpiralLoopPluginGUI(int w, int h,SpiralLoopPlugin *o,ChannelHandler *ch,const HostInfo *Info) :
  24. SpiralPluginGUI(w,h,o,ch)
  25. {
  26. m_LoopGUI = new Fl_Loop(0,15,w,h-15);
  27. m_LoopGUI->SetBGColour (Info->SCOPE_BG_COLOUR);
  28. m_LoopGUI->SetWaveColour (Info->SCOPE_FG_COLOUR);
  29. m_LoopGUI->SetSelColour (Info->SCOPE_SEL_COLOUR);
  30. m_LoopGUI->SetIndColour (Info->SCOPE_IND_COLOUR);
  31. m_LoopGUI->SetMrkColour (Info->SCOPE_MRK_COLOUR);
  32. m_Play = new Fl_LED_Button(255, h-35, 40, 25, "Play");
  33. //m_Play->color(GUIBG2_COLOUR);
  34. m_Play->type(1);
  35. m_Play->value(1);
  36. m_Play->down_box(FL_DOWN_BOX);
  37. m_Play->labelsize(10);
  38. m_Play->callback((Fl_Callback*)cb_Play);
  39. m_LoopGUI->add(m_Play);
  40. m_Volume = new Fl_Knob(95, 100, 45, 45, "Volume");
  41. m_Volume->color(Info->GUI_COLOUR);
  42. m_Volume->type(Fl_Knob::DOTLIN);
  43. m_Volume->labelsize(8);
  44. m_Volume->maximum(2);
  45. m_Volume->step(0.0001);
  46. m_Volume->value(1);
  47. m_Volume->callback((Fl_Callback*)cb_Volume);
  48. m_LoopGUI->add(m_Volume);
  49. m_Speed = new Fl_Knob(60, 150, 45, 45, "Speed");
  50. m_Speed->color(Info->GUI_COLOUR);
  51. m_Speed->type(Fl_Knob::DOTLIN);
  52. m_Speed->labelsize(8);
  53. m_Speed->maximum(2);
  54. m_Speed->step(0.0001);
  55. m_Speed->value(1);
  56. m_Speed->callback((Fl_Callback*)cb_Speed);
  57. m_LoopGUI->add(m_Speed);
  58. m_Length = new Fl_Knob(120, 160, 45, 45, "Length");
  59. m_Length->color(Info->GUI_COLOUR);
  60. m_Length->type(Fl_Knob::DOTLIN);
  61. m_Length->labelsize(8);
  62. m_Length->maximum(1);
  63. m_Length->step(0.0001);
  64. m_Length->value(1);
  65. m_Length->callback((Fl_Callback*)cb_Length);
  66. m_LoopGUI->add(m_Length);
  67. m_WavSize = new Fl_Knob(w-45, 15, 30, 30, "WaveSize");
  68. m_WavSize->color(Info->GUI_COLOUR);
  69. m_WavSize->type(Fl_Knob::DOTLIN);
  70. m_WavSize->labelsize(8);
  71. m_WavSize->maximum(3);
  72. m_WavSize->step(0.0001);
  73. m_WavSize->value(1);
  74. m_WavSize->callback((Fl_Callback*)cb_WavSize);
  75. m_LoopGUI->add(m_WavSize);
  76. m_Ticks = new Fl_Counter(5,h-30,30,14,"Ticks/Loop");
  77. m_Ticks->labelsize(8);
  78. m_Ticks->textsize(8);
  79. m_Ticks->step(1);
  80. m_Ticks->type(FL_SIMPLE_COUNTER);
  81. m_Ticks->value(64);
  82. m_Ticks->callback((Fl_Callback*)cb_Ticks);
  83. m_LoopGUI->add(m_Ticks);
  84. int X=w/2-30,Y=60,WIDTH=60,HEIGHT=12;
  85. int ycount=0;
  86. float phase=0.19f;
  87. float scale=70.0f;
  88. Fl_Boxtype boxtype=FL_THIN_UP_BOX;
  89. m_Rec = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Record");
  90. m_Rec->type(1);
  91. m_Rec->box(boxtype);
  92. m_Rec->labelsize(8);
  93. m_Rec->labelcolor(FL_RED);
  94. m_Rec->callback((Fl_Callback*)cb_Rec);
  95. m_LoopGUI->add(m_Rec);
  96. ycount++;
  97. m_OverDub = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "OverDub");
  98. m_OverDub->type(1);
  99. m_OverDub->box(boxtype);
  100. m_OverDub->labelsize(8);
  101. m_OverDub->labelcolor(FL_RED);
  102. m_OverDub->callback((Fl_Callback*)cb_OverDub);
  103. m_LoopGUI->add(m_OverDub);
  104. ycount++;
  105. m_Hold = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Keep Dub");
  106. m_Hold->box(boxtype);
  107. m_Hold->labelsize(8);
  108. m_Hold->callback((Fl_Callback*)cb_Hold);
  109. m_LoopGUI->add(m_Hold);
  110. ycount++;
  111. m_Undo = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Undo Dub");
  112. m_Undo->box(boxtype);
  113. m_Undo->labelsize(8);
  114. m_Undo->callback((Fl_Callback*)cb_Undo);
  115. m_LoopGUI->add(m_Undo);
  116. ycount++;
  117. m_Load = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Load");
  118. m_Load->box(boxtype);
  119. m_Load->labelsize(8);
  120. m_Load->callback((Fl_Callback*)cb_Load);
  121. m_LoopGUI->add(m_Load);
  122. ycount++;
  123. m_Save = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Save");
  124. m_Save->box(boxtype);
  125. m_Save->labelsize(8);
  126. m_Save->callback((Fl_Callback*)cb_Save);
  127. m_LoopGUI->add(m_Save);
  128. ycount++;
  129. m_Trig = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "New trigger");
  130. m_Trig->box(boxtype);
  131. m_Trig->labelsize(8);
  132. m_Trig->callback((Fl_Callback*)cb_Trig);
  133. m_LoopGUI->add(m_Trig);
  134. ycount++;
  135. m_Cut = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Cut");
  136. m_Cut->box(boxtype);
  137. m_Cut->labelsize(8);
  138. m_Cut->callback((Fl_Callback*)cb_Cut);
  139. m_LoopGUI->add(m_Trig);
  140. ycount++;
  141. m_Copy = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Copy");
  142. m_Copy->box(boxtype);
  143. m_Copy->labelsize(8);
  144. m_Copy->callback((Fl_Callback*)cb_Copy);
  145. m_LoopGUI->add(m_Trig);
  146. ycount++;
  147. m_Paste = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Paste");
  148. m_Paste->box(boxtype);
  149. m_Paste->labelsize(8);
  150. m_Paste->callback((Fl_Callback*)cb_Paste);
  151. m_LoopGUI->add(m_Paste);
  152. ycount++;
  153. m_PasteMix = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "PasteMix");
  154. m_PasteMix->box(boxtype);
  155. m_PasteMix->labelsize(8);
  156. m_PasteMix->callback((Fl_Callback*)cb_PasteMix);
  157. m_LoopGUI->add(m_PasteMix);
  158. ycount++;
  159. m_ZeroR = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Zero Range");
  160. m_ZeroR->box(boxtype);
  161. m_ZeroR->labelsize(8);
  162. m_ZeroR->callback((Fl_Callback*)cb_ZeroR);
  163. m_LoopGUI->add(m_ZeroR);
  164. ycount++;
  165. m_ReverseR = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Rev Range");
  166. m_ReverseR->box(boxtype);
  167. m_ReverseR->labelsize(8);
  168. m_ReverseR->callback((Fl_Callback*)cb_ReverseR);
  169. m_LoopGUI->add(m_ReverseR);
  170. ycount++;
  171. m_SelectAll = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Select all");
  172. m_SelectAll->box(boxtype);
  173. m_SelectAll->labelsize(8);
  174. m_SelectAll->callback((Fl_Callback*)cb_SelectAll);
  175. m_LoopGUI->add(m_SelectAll);
  176. ycount++;
  177. m_Double = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Double");
  178. m_Double->box(boxtype);
  179. m_Double->labelsize(8);
  180. m_Double->callback((Fl_Callback*)cb_Double);
  181. m_LoopGUI->add(m_Double);
  182. ycount++;
  183. m_Half = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Half");
  184. m_Half->box(boxtype);
  185. m_Half->labelsize(8);
  186. m_Half->callback((Fl_Callback*)cb_Half);
  187. m_LoopGUI->add(m_Half);
  188. ycount++;
  189. m_Crop = new Fl_Button(X+(int)(sin(ycount*phase)*scale), Y+ycount*HEIGHT, WIDTH, HEIGHT, "Crop");
  190. m_Crop->box(boxtype);
  191. m_Crop->labelsize(8);
  192. m_Crop->callback((Fl_Callback*)cb_Crop);
  193. m_LoopGUI->add(m_Crop);
  194. ycount++;
  195. }
  196. void SpiralLoopPluginGUI::UpdateValues(SpiralPlugin *o)
  197. {
  198. SpiralLoopPlugin *Plugin=(SpiralLoopPlugin *)o;
  199. m_SampleSize=Plugin->GetStoreBuffer()->GetLength();
  200. m_LoopGUI->SetData((float*)Plugin->GetStoreBuffer()->GetBuffer(),m_SampleSize);
  201. m_Volume->value(Plugin->GetVolume());
  202. m_Speed->value(Plugin->GetSpeed());
  203. if(m_SampleSize!=0)
  204. {
  205. m_Length->value(Plugin->GetLoopLength()/m_SampleSize);
  206. m_LoopGUI->SetLength(Plugin->GetLoopLength());
  207. }
  208. else
  209. {
  210. m_LoopGUI->SetLength(0);
  211. }
  212. vector<SpiralLoopPlugin::TriggerInfo> *TrigVec=Plugin->GetTriggerVec();
  213. int ID=0;
  214. for (vector<SpiralLoopPlugin::TriggerInfo>::iterator i=TrigVec->begin();
  215. i!=TrigVec->end(); i++)
  216. {
  217. Fl_Trigger *NewTrigger = new Fl_Trigger(parent()->x(), parent()->y(), 20, 20);
  218. NewTrigger->SetCentreX(150);
  219. NewTrigger->SetCentreY(150);
  220. NewTrigger->SetCentreRadius(125);
  221. if(m_SampleSize!=0) NewTrigger->SetAngle(i->Time*360.0f);
  222. NewTrigger->SetID(ID);
  223. NewTrigger->SetChannel(i->Channel);
  224. NewTrigger->callback((Fl_Callback*)cb_Trigger);
  225. m_LoopGUI->add(NewTrigger);
  226. m_TriggerVec.push_back(NewTrigger);
  227. NewTrigger->redraw();
  228. m_LoopGUI->redraw();
  229. ID++;
  230. }
  231. }
  232. void SpiralLoopPluginGUI::Update()
  233. {
  234. m_LoopGUI->SetPos(m_GUICH->GetFloat("Pos"));
  235. m_LoopGUI->DrawPosMarker();
  236. }
  237. void SpiralLoopPluginGUI::UpdateSampleDisplay()
  238. {
  239. m_GUICH->Wait();
  240. m_GUICH->SetCommand(SpiralLoopPlugin::GETSAMPLE);
  241. m_GUICH->Wait();
  242. m_GUICH->RequestChannelAndWait("SampleSize");
  243. m_SampleSize=m_GUICH->GetLong("SampleSize");
  244. if (m_SampleSize)
  245. {
  246. char *TempBuf = new char[m_SampleSize*sizeof(float)];
  247. m_GUICH->BulkTransfer("SampleBuffer",(void*)TempBuf,m_SampleSize*sizeof(float));
  248. m_LoopGUI->SetData((float*)TempBuf,m_SampleSize);
  249. delete[] TempBuf;
  250. }
  251. redraw();
  252. }
  253. inline void SpiralLoopPluginGUI::cb_Play_i(Fl_LED_Button* o, void* v)
  254. {
  255. if (o->value()) m_GUICH->SetCommand(SpiralLoopPlugin::START);
  256. else m_GUICH->SetCommand(SpiralLoopPlugin::STOP);
  257. }
  258. void SpiralLoopPluginGUI::cb_Play(Fl_LED_Button* o, void* v)
  259. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Play_i(o,v); }
  260. inline void SpiralLoopPluginGUI::cb_Volume_i(Fl_Knob* o, void* v)
  261. {
  262. m_GUICH->Set("Volume",(float)o->value());
  263. }
  264. void SpiralLoopPluginGUI::cb_Volume(Fl_Knob* o, void* v)
  265. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Volume_i(o,v); }
  266. inline void SpiralLoopPluginGUI::cb_Speed_i(Fl_Knob* o, void* v)
  267. {
  268. m_GUICH->Set("Speed",(float)o->value());
  269. }
  270. void SpiralLoopPluginGUI::cb_Speed(Fl_Knob* o, void* v)
  271. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Speed_i(o,v); }
  272. inline void SpiralLoopPluginGUI::cb_Length_i(Fl_Knob* o, void* v)
  273. {
  274. m_GUICH->SetCommand(SpiralLoopPlugin::CHANGE_LENGTH);
  275. m_GUICH->Set("Length",(float)o->value());
  276. m_LoopGUI->SetLength((int)(m_SampleSize*o->value()));
  277. m_LoopGUI->redraw();
  278. }
  279. void SpiralLoopPluginGUI::cb_Length(Fl_Knob* o, void* v)
  280. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Length_i(o,v); }
  281. inline void SpiralLoopPluginGUI::cb_WavSize_i(Fl_Knob* o, void* v)
  282. {
  283. m_LoopGUI->SetWaveSize(o->value());
  284. redraw();
  285. }
  286. void SpiralLoopPluginGUI::cb_WavSize(Fl_Knob* o, void* v)
  287. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_WavSize_i(o,v); }
  288. inline void SpiralLoopPluginGUI::cb_Rec_i(Fl_Button* o, void* v)
  289. {
  290. if (o->value()) m_GUICH->SetCommand(SpiralLoopPlugin::RECORD);
  291. else m_GUICH->SetCommand(SpiralLoopPlugin::ENDRECORD);
  292. UpdateSampleDisplay();
  293. }
  294. void SpiralLoopPluginGUI::cb_Rec(Fl_Button* o, void* v)
  295. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Rec_i(o,v); }
  296. inline void SpiralLoopPluginGUI::cb_OverDub_i(Fl_Button* o, void* v)
  297. {
  298. if (o->value()) m_GUICH->SetCommand(SpiralLoopPlugin::OVERDUB);
  299. else m_GUICH->SetCommand(SpiralLoopPlugin::ENDRECORD);
  300. }
  301. void SpiralLoopPluginGUI::cb_OverDub(Fl_Button* o, void* v)
  302. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_OverDub_i(o,v); }
  303. inline void SpiralLoopPluginGUI::cb_Load_i(Fl_Button* o, void* v)
  304. {
  305. char *fn=fl_file_chooser("Load a sample", "{*.wav,*.WAV}", NULL);
  306. if (fn && fn!='\0')
  307. {
  308. strcpy(m_TextBuf,fn);
  309. m_GUICH->SetData("Name",m_TextBuf);
  310. m_GUICH->SetCommand(SpiralLoopPlugin::LOAD);
  311. m_GUICH->Wait(); // wait for the sample to load
  312. UpdateSampleDisplay();
  313. }
  314. }
  315. void SpiralLoopPluginGUI::cb_Load(Fl_Button* o, void* v)
  316. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Load_i(o,v); }
  317. inline void SpiralLoopPluginGUI::cb_Save_i(Fl_Button* o, void* v)
  318. {
  319. char *fn=fl_file_chooser("Load a sample", "{*.wav,*.WAV}", NULL);
  320. if (fn && fn!='\0')
  321. {
  322. strcpy(m_TextBuf,fn);
  323. m_GUICH->SetData("Name",m_TextBuf);
  324. m_GUICH->SetCommand(SpiralLoopPlugin::SAVE);
  325. }
  326. }
  327. void SpiralLoopPluginGUI::cb_Save(Fl_Button* o, void* v)
  328. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Save_i(o,v); }
  329. inline void SpiralLoopPluginGUI::cb_Trig_i(Fl_Button* o, void* v)
  330. {
  331. Fl_Trigger *NewTrigger = new Fl_Trigger(parent()->x(), parent()->y(), 20, 20);
  332. NewTrigger->SetCentreX(150);
  333. NewTrigger->SetCentreY(150);
  334. NewTrigger->SetCentreRadius(125);
  335. NewTrigger->SetID(m_TriggerVec.size());
  336. if (m_TriggerVec.size()<8) NewTrigger->SetChannel(m_TriggerVec.size());
  337. else NewTrigger->SetChannel(7);
  338. NewTrigger->callback((Fl_Callback*)cb_Trigger);
  339. m_LoopGUI->add(NewTrigger);
  340. m_TriggerVec.push_back(NewTrigger);
  341. NewTrigger->redraw();
  342. m_LoopGUI->redraw();
  343. m_GUICH->Set("Start",NewTrigger->GetID());
  344. m_GUICH->Set("End",NewTrigger->GetChannel());
  345. m_GUICH->Set("Length",0);
  346. m_GUICH->SetCommand(SpiralLoopPlugin::NEW_TRIGGER);
  347. }
  348. void SpiralLoopPluginGUI::cb_Trig(Fl_Button* o, void* v)
  349. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Trig_i(o,v); }
  350. inline void SpiralLoopPluginGUI::cb_Cut_i(Fl_Button* o, void* v)
  351. {
  352. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  353. m_GUICH->Set("End",m_LoopGUI->GetRangeEnd());
  354. m_GUICH->SetCommand(SpiralLoopPlugin::CUT);
  355. UpdateSampleDisplay();
  356. }
  357. void SpiralLoopPluginGUI::cb_Cut(Fl_Button* o, void* v)
  358. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Cut_i(o,v); }
  359. inline void SpiralLoopPluginGUI::cb_Copy_i(Fl_Button* o, void* v)
  360. {
  361. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  362. m_GUICH->Set("End",m_LoopGUI->GetRangeEnd());
  363. m_GUICH->SetCommand(SpiralLoopPlugin::COPY);
  364. }
  365. void SpiralLoopPluginGUI::cb_Copy(Fl_Button* o, void* v)
  366. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Copy_i(o,v); }
  367. inline void SpiralLoopPluginGUI::cb_Paste_i(Fl_Button* o, void* v)
  368. {
  369. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  370. m_GUICH->SetCommand(SpiralLoopPlugin::PASTE);
  371. UpdateSampleDisplay();
  372. }
  373. void SpiralLoopPluginGUI::cb_Paste(Fl_Button* o, void* v)
  374. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Paste_i(o,v); }
  375. inline void SpiralLoopPluginGUI::cb_PasteMix_i(Fl_Button* o, void* v)
  376. {
  377. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  378. m_GUICH->SetCommand(SpiralLoopPlugin::PASTEMIX);
  379. UpdateSampleDisplay();
  380. }
  381. void SpiralLoopPluginGUI::cb_PasteMix(Fl_Button* o, void* v)
  382. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_PasteMix_i(o,v); }
  383. inline void SpiralLoopPluginGUI::cb_ZeroR_i(Fl_Button* o, void* v)
  384. {
  385. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  386. m_GUICH->Set("End",m_LoopGUI->GetRangeEnd());
  387. m_GUICH->SetCommand(SpiralLoopPlugin::ZERO_RANGE);
  388. UpdateSampleDisplay();
  389. }
  390. void SpiralLoopPluginGUI::cb_ZeroR(Fl_Button* o, void* v)
  391. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_ZeroR_i(o,v); }
  392. inline void SpiralLoopPluginGUI::cb_ReverseR_i(Fl_Button* o, void* v)
  393. {
  394. m_GUICH->Set("Start",m_LoopGUI->GetRangeStart());
  395. m_GUICH->Set("End",m_LoopGUI->GetRangeEnd());
  396. m_GUICH->SetCommand(SpiralLoopPlugin::REVERSE_RANGE);
  397. UpdateSampleDisplay();
  398. }
  399. void SpiralLoopPluginGUI::cb_ReverseR(Fl_Button* o, void* v)
  400. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_ReverseR_i(o,v); }
  401. inline void SpiralLoopPluginGUI::cb_SelectAll_i(Fl_Button* o, void* v)
  402. {
  403. m_LoopGUI->SelectAll();
  404. //m_GUICH->SetCommand(SpiralLoopPlugin::SELECT_ALL);
  405. }
  406. void SpiralLoopPluginGUI::cb_SelectAll(Fl_Button* o, void* v)
  407. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_SelectAll_i(o,v); }
  408. inline void SpiralLoopPluginGUI::cb_Double_i(Fl_Button* o, void* v)
  409. {
  410. m_GUICH->SetCommand(SpiralLoopPlugin::DOUBLE);
  411. UpdateSampleDisplay();
  412. }
  413. void SpiralLoopPluginGUI::cb_Double(Fl_Button* o, void* v)
  414. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Double_i(o,v); }
  415. inline void SpiralLoopPluginGUI::cb_Half_i(Fl_Button* o, void* v)
  416. {
  417. m_GUICH->SetCommand(SpiralLoopPlugin::HALF);
  418. UpdateSampleDisplay();
  419. }
  420. void SpiralLoopPluginGUI::cb_Half(Fl_Button* o, void* v)
  421. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Half_i(o,v); }
  422. inline void SpiralLoopPluginGUI::cb_Crop_i(Fl_Button* o, void* v)
  423. {
  424. m_GUICH->SetCommand(SpiralLoopPlugin::CROP);
  425. }
  426. void SpiralLoopPluginGUI::cb_Crop(Fl_Button* o, void* v)
  427. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Crop_i(o,v); }
  428. inline void SpiralLoopPluginGUI::cb_Hold_i(Fl_Button* o, void* v)
  429. {
  430. m_GUICH->SetCommand(SpiralLoopPlugin::KEEPDUB);
  431. UpdateSampleDisplay();
  432. }
  433. void SpiralLoopPluginGUI::cb_Hold(Fl_Button* o, void* v)
  434. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Hold_i(o,v); }
  435. inline void SpiralLoopPluginGUI::cb_Undo_i(Fl_Button* o, void* v)
  436. {
  437. m_GUICH->SetCommand(SpiralLoopPlugin::UNDODUB);
  438. }
  439. void SpiralLoopPluginGUI::cb_Undo(Fl_Button* o, void* v)
  440. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Undo_i(o,v); }
  441. inline void SpiralLoopPluginGUI::cb_Trigger_i(Fl_Trigger* o, void* v)
  442. {
  443. m_GUICH->Set("Start",o->GetID());
  444. m_GUICH->Set("End",o->GetChannel());
  445. m_GUICH->Set("Length",o->GetAngle()/360.0f);
  446. m_GUICH->SetCommand(SpiralLoopPlugin::UPDATE_TRIGGER);
  447. }
  448. void SpiralLoopPluginGUI::cb_Trigger(Fl_Trigger* o, void* v)
  449. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Trigger_i(o,v); }
  450. inline void SpiralLoopPluginGUI::cb_Ticks_i(Fl_Counter* o, void* v)
  451. {
  452. if (o->value()<1) o->value(1);
  453. m_GUICH->Set("TicksPerLoop",(int)o->value());
  454. }
  455. void SpiralLoopPluginGUI::cb_Ticks(Fl_Counter* o, void* v)
  456. { ((SpiralLoopPluginGUI*)(o->parent()->parent()))->cb_Ticks_i(o,v); }
  457. const string SpiralLoopPluginGUI::GetHelpText(const string &loc){
  458. return string("")
  459. + "The SpiralLoop is designed for live jamming and the creation of freeform\n"
  460. + " loops that you can sync to other loops, or other sequences within ssm.\n"
  461. + "This plugin is based on the old SpiralLoop design with a few improvements.\n"
  462. + "The main differece is the 'dub buffer' - a recording area that enables you to\n"
  463. + "audition recording before deciding whether to write them to the main loop\n"
  464. + "to undo them.\n"
  465. + "\n"
  466. + "Features:\n"
  467. + "Record : Records a new loop, and deletes the old one\n"
  468. + "OverDub : Records input into a the dub buffer\n"
  469. + "KeepDub : Writes the dub buffer into the main loop\n"
  470. + "UndoDub : Clears the dub buffer (erasing previous recordings)\n"
  471. + "Load : Loads a wav into the loop\n"
  472. + "Save : Saves the loop as a wav file\n"
  473. + "New Trigger : Create a new trigger (see below)\n"
  474. + "Cut : Cut highlighted section of the loop\n"
  475. + "Copy : Store highlighted section of the loop\n"
  476. + "Paste : Insert copied/cut loop section\n"
  477. + "PasteMix : Mix in copied/cut loop section\n"
  478. + "Zero Range : Silence highlighted section\n"
  479. + "RevRange : Reverse highlighted section\n"
  480. + "Select all : Select the whole loop\n"
  481. + "Double : Copy the loop to the end (doubling the size)\n"
  482. + "Half : Chop the last half of the loop (halving the size)\n"
  483. + "Crop : Lose the sampledata after the loop point (set with the length control)\n"
  484. + "\n"
  485. + "Ticks/Loop : Sets the number of logic ticks per loop output via the clock port\n"
  486. + " use this to sync matrix sequencers and the like.\n"
  487. + "\n"
  488. + "LoopTriggers\n"
  489. + "\n"
  490. + "Loop triggers are sync points that you can drag around the loop. When the play\n"
  491. + "position crosses one, the corresponding output CV will go high. Multiple triggers\n"
  492. + "can effect the same CV, use the right mouse button to cycle through the outputs";
  493. }