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.

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