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.

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