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.

784 lines
24KB

  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 "PoshSamplerPluginGUI.h"
  19. #include <FL/fl_draw.H>
  20. #include <FL/fl_draw.H>
  21. #include "../GUI/WaveChooser.h"
  22. #include <FL/Fl_File_Chooser.H>
  23. using namespace std;
  24. ////////////////////////////////////////////
  25. Fl_WaveDisplay::Fl_WaveDisplay(int x,int y,int w,int h, char *Name) :
  26. Fl_Widget(x,y,w,h,Name),
  27. m_Sample(NULL),
  28. m_StartPos(1),
  29. m_EndPos(10),
  30. m_ViewStart(0),
  31. m_ViewEnd(INT_MAX),
  32. m_PlayPos(0),
  33. m_PlayStart(0),
  34. m_LoopStart(0),
  35. m_LoopEnd(INT_MAX),
  36. m_PosMarker(true)
  37. {
  38. }
  39. Fl_WaveDisplay::~Fl_WaveDisplay()
  40. {
  41. }
  42. void Fl_WaveDisplay::SetSample (const float *s, long len) {
  43. if (m_Sample) delete m_Sample;
  44. m_Sample = new Sample (s, len);
  45. }
  46. void Fl_WaveDisplay::ClearSample (void) {
  47. if (m_Sample) delete m_Sample;
  48. m_Sample = NULL;
  49. }
  50. void Fl_WaveDisplay::draw()
  51. {
  52. int ho=h()/2;
  53. fl_color (m_BGColour);
  54. fl_rectf(x(), y(), w(), h());
  55. if (!m_Sample || m_Sample->GetLength()==0) return;
  56. if (m_ViewStart<0) m_ViewStart=0;
  57. if (m_ViewEnd>m_Sample->GetLength()-1) m_ViewEnd=m_Sample->GetLength()-1;
  58. if (m_PlayStart<0) m_PlayStart=0;
  59. if (m_PlayStart>m_Sample->GetLength()-1) m_PlayStart=m_Sample->GetLength()-1;
  60. if (m_LoopStart<0) m_LoopStart=0;
  61. if (m_LoopStart>m_Sample->GetLength()-1) m_LoopStart=m_Sample->GetLength()-1;
  62. if (m_LoopEnd<0) m_LoopEnd=0;
  63. if (m_LoopEnd>m_Sample->GetLength()-1) m_LoopEnd=m_Sample->GetLength()-1;
  64. float Value=0,NextValue=0;
  65. int pos=0;
  66. int Jump=(m_ViewEnd-m_ViewStart)/w();
  67. if (Jump==0) Jump=1;
  68. for(int n=m_ViewStart; n<m_ViewEnd-Jump; n+=Jump)
  69. {
  70. fl_font(fl_font(),10);
  71. if (m_PlayPos>=n && m_PlayPos<n+Jump)
  72. {
  73. fl_color (m_IndColour);
  74. fl_line(x()+pos, y(),
  75. x()+pos, y()+h());
  76. }
  77. if (m_PlayStart>=n && m_PlayStart<n+Jump)
  78. {
  79. fl_color (m_MrkColour);
  80. fl_draw("S",x()+pos+2,y()+h());
  81. fl_line(x()+pos, y(),
  82. x()+pos, y()+h());
  83. }
  84. if (m_LoopStart>=n && m_LoopStart<n+Jump)
  85. {
  86. fl_color (m_MrkColour);
  87. fl_draw("LS",x()+pos+2,y()+h());
  88. fl_line(x()+pos, y(),
  89. x()+pos, y()+h());
  90. }
  91. if (m_LoopEnd>=n && m_LoopEnd<n+Jump)
  92. {
  93. fl_color (m_MrkColour);
  94. fl_draw("LE",x()+pos+2,y()+h());
  95. fl_line(x()+pos, y(),
  96. x()+pos, y()+h());
  97. }
  98. if (n>m_StartPos && n<m_EndPos) fl_color (m_SelColour);
  99. else fl_color (m_FGColour);
  100. Value = NextValue;
  101. // get max
  102. float max=(*m_Sample)[n];
  103. float min=(*m_Sample)[n];
  104. for (int m=n; m<n+Jump; m++)
  105. {
  106. if (max<(*m_Sample)[m]) max=(*m_Sample)[m];
  107. if (min>(*m_Sample)[m]) min=(*m_Sample)[m];
  108. }
  109. min*=ho; max*=ho;
  110. fl_line(x()+pos-1, y()+ho-(int)min,
  111. x()+pos-1, y()+ho-(int)max);
  112. pos++;
  113. }
  114. }
  115. int Fl_WaveDisplay::handle(int event)
  116. {
  117. int xx=Fl::event_x();
  118. int yy=Fl::event_y();
  119. static int DragX,DragY;
  120. static int Mousebutton=0;
  121. static int Holding=0;
  122. static int GrabDist=10;
  123. if (!m_Sample || m_Sample->GetLength()==0) return 1;
  124. if (event==FL_PUSH)
  125. {
  126. GrabDist=(int)((m_ViewEnd-m_ViewStart)*0.03f);
  127. Mousebutton=Fl::event_button();
  128. DragX=xx;
  129. DragY=yy;
  130. if (Mousebutton==1)
  131. {
  132. int MousePos=(xx-x())*((m_ViewEnd-m_ViewStart)/w())+m_ViewStart;
  133. Holding=0;
  134. if (abs(MousePos-m_StartPos)<GrabDist) Holding=1;
  135. else if (abs(MousePos-m_EndPos)<GrabDist) Holding=2;
  136. else if (abs(MousePos-m_PlayStart)<GrabDist) Holding=3;
  137. else if (abs(MousePos-m_LoopStart)<GrabDist) Holding=4;
  138. else if (abs(MousePos-m_LoopEnd)<GrabDist) Holding=5;
  139. else
  140. {
  141. m_StartPos=MousePos;
  142. m_EndPos=MousePos;
  143. }
  144. }
  145. }
  146. if (event==FL_DRAG)
  147. {
  148. if (Mousebutton==1)
  149. {
  150. int MousePos=(xx-x())*((m_ViewEnd-m_ViewStart)/w())+m_ViewStart;
  151. switch (Holding)
  152. {
  153. case 0:
  154. {
  155. if (MousePos>m_EndPos) m_EndPos=MousePos;
  156. else m_StartPos=MousePos;
  157. } break;
  158. case 1:
  159. {
  160. m_StartPos=MousePos;
  161. if (m_StartPos>m_EndPos) Holding=2; // swap
  162. } break;
  163. case 2:
  164. {
  165. m_EndPos=MousePos;
  166. if (m_StartPos>m_EndPos) Holding=1; // swap
  167. } break;
  168. case 3: m_PlayStart=MousePos; break;
  169. case 4: m_LoopStart=MousePos; break;
  170. case 5: m_LoopEnd=MousePos; break;
  171. }
  172. }
  173. if (Mousebutton==2)
  174. {
  175. int Dist=(DragX-xx)*((m_ViewEnd-m_ViewStart)/w());
  176. if (m_ViewStart>0 && m_ViewEnd<m_Sample->GetLength()-1)
  177. {
  178. m_ViewStart+=Dist;
  179. m_ViewEnd+=Dist;
  180. }
  181. else // stop it sticking when at end/beginning
  182. {
  183. if ((Dist>0 && m_ViewStart<=0) ||
  184. (Dist<0 && m_ViewEnd>=m_Sample->GetLength()-1))
  185. {
  186. m_ViewStart+=Dist;
  187. m_ViewEnd+=Dist;
  188. }
  189. }
  190. DragX=xx;
  191. DragY=yy;
  192. }
  193. if (Mousebutton==3)
  194. {
  195. // only draw wave at 1 pixel = 1 sample
  196. if ((m_ViewEnd-m_ViewStart)/w()==1)
  197. {
  198. int MousePos=(xx-x())*((m_ViewEnd-m_ViewStart)/w())+m_ViewStart;
  199. float Value=-(yy-y())/((float)h()/2.0f)+1.0f;
  200. m_Sample->Set(MousePos,Value);
  201. redraw();
  202. }
  203. }
  204. do_callback();
  205. redraw();
  206. }
  207. if (m_EndPos>=m_Sample->GetLength()) m_EndPos=m_Sample->GetLength()-1;
  208. return 1;
  209. }
  210. void Fl_WaveDisplay::ZoomIn()
  211. {
  212. int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f);
  213. if ((m_ViewEnd-m_ViewStart)/w()>1)
  214. {
  215. m_ViewStart+=Zoom;
  216. m_ViewEnd-=Zoom;
  217. }
  218. redraw();
  219. }
  220. void Fl_WaveDisplay::ZoomOut()
  221. {
  222. int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f);
  223. m_ViewStart-=Zoom;
  224. m_ViewEnd+=Zoom;
  225. redraw();
  226. }
  227. ////////////////////////////////////////////
  228. PoshSamplerPluginGUI::PoshSamplerPluginGUI(int w, int h,PoshSamplerPlugin *o,ChannelHandler *ch,const HostInfo *Info) :
  229. SpiralPluginGUI(w,h,o,ch),
  230. m_UpdateMe(false)
  231. {
  232. int n=0;
  233. m_Load = new Fl_Button(5, 20, 50, 20, "Load");
  234. m_Load->labelsize(10);
  235. m_Load->box (FL_PLASTIC_UP_BOX);
  236. m_Load->color (Info->GUI_COLOUR);
  237. m_Load->selection_color (Info->GUI_COLOUR);
  238. m_Load->callback((Fl_Callback*)cb_Load);
  239. add(m_Load);
  240. m_Save = new Fl_Button(55, 20, 50, 20, "Save");
  241. m_Save->labelsize(10);
  242. m_Save->box (FL_PLASTIC_UP_BOX);
  243. m_Save->color (Info->GUI_COLOUR);
  244. m_Save->selection_color (Info->GUI_COLOUR);
  245. m_Save->callback((Fl_Callback*)cb_Save);
  246. add(m_Save);
  247. m_Record = new Fl_Button(105, 20, 50, 20, "Record");
  248. m_Record->type (FL_TOGGLE_BUTTON);
  249. m_Record->box (FL_PLASTIC_UP_BOX);
  250. m_Record->color (FL_RED);
  251. m_Record->selection_color (FL_RED);
  252. m_Record->labelsize (10);
  253. //m_Record->labelcolor (FL_RED);
  254. m_Record->callback((Fl_Callback*)cb_Record);
  255. add(m_Record);
  256. m_Loop = new Fl_Button(5, 40, 75, 20, "Loop");
  257. m_Loop->type (FL_TOGGLE_BUTTON);
  258. m_Loop->labelsize(10);
  259. m_Loop->box (FL_PLASTIC_UP_BOX);
  260. m_Loop->color (Info->GUI_COLOUR);
  261. m_Loop->selection_color (Info->GUI_COLOUR);
  262. m_Loop->callback((Fl_Callback*)cb_Loop);
  263. add(m_Loop);
  264. m_PingPong = new Fl_Button(80, 40, 75, 20, "PingPong");
  265. m_PingPong->type (FL_TOGGLE_BUTTON);
  266. m_PingPong->labelsize(10);
  267. m_PingPong->box (FL_PLASTIC_UP_BOX);
  268. m_PingPong->color (Info->GUI_COLOUR);
  269. m_PingPong->selection_color (Info->GUI_COLOUR);
  270. m_PingPong->callback((Fl_Callback*)cb_PingPong);
  271. add(m_PingPong);
  272. m_PosMarker = new Fl_Button(5, 60, 75, 20, "PosMarker");
  273. m_PosMarker->type (FL_TOGGLE_BUTTON);
  274. m_PosMarker->labelsize(10);
  275. m_PosMarker->box (FL_PLASTIC_UP_BOX);
  276. m_PosMarker->color (Info->GUI_COLOUR);
  277. m_PosMarker->selection_color (Info->GUI_COLOUR);
  278. m_PosMarker->value(1);
  279. m_PosMarker->callback((Fl_Callback*)cb_PosMarker);
  280. add(m_PosMarker);
  281. m_Retrig = new Fl_Button (80, 60, 75, 20, "Re-Trigger");
  282. m_Retrig->type (FL_TOGGLE_BUTTON);
  283. m_Retrig->labelsize (10);
  284. m_Retrig->box (FL_PLASTIC_UP_BOX);
  285. m_Retrig->color (Info->GUI_COLOUR);
  286. m_Retrig->selection_color (Info->GUI_COLOUR);
  287. m_Retrig->value (1);
  288. m_Retrig->callback ((Fl_Callback*)cb_Retrig);
  289. add (m_Retrig);
  290. m_Volume = new Fl_Knob(160, 20, 50, 50, "Volume");
  291. m_Volume->color(Info->GUI_COLOUR);
  292. m_Volume->type(Fl_Knob::LINELIN);
  293. m_Volume->labelsize(10);
  294. m_Volume->maximum(2);
  295. m_Volume->step(0.001);
  296. m_Volume->value(1);
  297. m_Volume->callback((Fl_Callback*)cb_Volume);
  298. add(m_Volume);
  299. m_Pitch = new Fl_Knob(220, 20, 50, 50, "Pitch");
  300. m_Pitch->color(Info->GUI_COLOUR);
  301. m_Pitch->type(Fl_Knob::LINELIN);
  302. m_Pitch->labelsize(10);
  303. m_Pitch->maximum(10);
  304. m_Pitch->step(0.001);
  305. m_Pitch->value(1);
  306. m_Pitch->callback((Fl_Callback*)cb_Pitch);
  307. add(m_Pitch);
  308. m_Octave = new Fl_Knob(280, 20, 50, 50, "Octave");
  309. m_Octave->color(Info->GUI_COLOUR);
  310. m_Octave->type(Fl_Knob::LINELIN);
  311. m_Octave->labelsize(10);
  312. m_Octave->maximum(12);
  313. m_Octave->step(1);
  314. m_Octave->value(6);
  315. m_Octave->callback((Fl_Callback*)cb_Octave);
  316. add(m_Octave);
  317. m_SampleNum = new Fl_Counter (w-60, 15, 45, 20, "Sample");
  318. m_SampleNum->labelsize(10);
  319. m_SampleNum->type(FL_SIMPLE_COUNTER);
  320. m_SampleNum->box (FL_PLASTIC_UP_BOX);
  321. m_SampleNum->color (Info->GUI_COLOUR);
  322. m_SampleNum->selection_color (Info->GUI_COLOUR);
  323. m_SampleNum->step(1);
  324. m_SampleNum->value(n);
  325. m_SampleNum->callback((Fl_Callback*)cb_SampleNum);
  326. add(m_SampleNum);
  327. m_Note = new Fl_Counter (w-60, 50, 45, 20, "Trig Note");
  328. m_Note->labelsize(10);
  329. m_Note->type(FL_SIMPLE_COUNTER);
  330. m_Note->box (FL_PLASTIC_UP_BOX);
  331. m_Note->color (Info->GUI_COLOUR);
  332. m_Note->selection_color (Info->GUI_COLOUR);
  333. m_Note->step(1);
  334. m_Note->value(n);
  335. m_Note->callback((Fl_Callback*)cb_Note);
  336. add(m_Note);
  337. m_Display = new Fl_WaveDisplay(5,85,w-10,100,"");
  338. m_Display->SetColours (Info->SCOPE_BG_COLOUR, Info->SCOPE_FG_COLOUR,
  339. Info->SCOPE_SEL_COLOUR, Info->SCOPE_IND_COLOUR, Info->SCOPE_MRK_COLOUR);
  340. m_Display->callback((Fl_Callback*)cb_WaveDisplay);
  341. int bx=5, by=190, bw=w/9-2, bh=20, bs=w/9-2;
  342. n=0;
  343. m_Cut = new Fl_Button(bx+(n++*bs),by,bw,bh,"Cut");
  344. m_Cut->labelsize(10);
  345. m_Cut->box (FL_PLASTIC_UP_BOX);
  346. m_Cut->color (Info->GUI_COLOUR);
  347. m_Cut->selection_color (Info->GUI_COLOUR);
  348. m_Cut->callback((Fl_Callback*)cb_Cut);
  349. m_Copy = new Fl_Button(bx+(n++*bs),by,bw,bh,"Copy");
  350. m_Copy->labelsize(10);
  351. m_Copy->box (FL_PLASTIC_UP_BOX);
  352. m_Copy->color (Info->GUI_COLOUR);
  353. m_Copy->selection_color (Info->GUI_COLOUR);
  354. m_Copy->callback((Fl_Callback*)cb_Copy);
  355. m_Paste = new Fl_Button(bx+(n++*bs),by,bw,bh,"Paste");
  356. m_Paste->labelsize(10);
  357. m_Paste->box (FL_PLASTIC_UP_BOX);
  358. m_Paste->color (Info->GUI_COLOUR);
  359. m_Paste->selection_color (Info->GUI_COLOUR);
  360. m_Paste->callback((Fl_Callback*)cb_Paste);
  361. m_Mix = new Fl_Button(bx+(n++*bs),by,bw,bh,"Mix");
  362. m_Mix->labelsize(10);
  363. m_Mix->box (FL_PLASTIC_UP_BOX);
  364. m_Mix->color (Info->GUI_COLOUR);
  365. m_Mix->selection_color (Info->GUI_COLOUR);
  366. m_Mix->callback((Fl_Callback*)cb_Mix);
  367. m_Crop = new Fl_Button(bx+(n++*bs),by,bw,bh,"Crop");
  368. m_Crop->labelsize(10);
  369. m_Crop->box (FL_PLASTIC_UP_BOX);
  370. m_Crop->color (Info->GUI_COLOUR);
  371. m_Crop->selection_color (Info->GUI_COLOUR);
  372. m_Crop->callback((Fl_Callback*)cb_Crop);
  373. m_Reverse = new Fl_Button(bx+(n++*bs),by,bw,bh,"Reverse");
  374. m_Reverse->labelsize(10);
  375. m_Reverse->box (FL_PLASTIC_UP_BOX);
  376. m_Reverse->color (Info->GUI_COLOUR);
  377. m_Reverse->selection_color (Info->GUI_COLOUR);
  378. m_Reverse->callback((Fl_Callback*)cb_Reverse);
  379. m_Amp = new Fl_Button(bx+(n++*bs),by,bw,bh,"Amp");
  380. m_Amp->labelsize(10);
  381. m_Amp->box (FL_PLASTIC_UP_BOX);
  382. m_Amp->color (Info->GUI_COLOUR);
  383. m_Amp->selection_color (Info->GUI_COLOUR);
  384. m_Amp->callback((Fl_Callback*)cb_Amp);
  385. m_ZoomIn = new Fl_Button(bx+(n++*bs),by,bw,bh,"Zoom +");
  386. m_ZoomIn->labelsize(10);
  387. m_ZoomIn->box (FL_PLASTIC_UP_BOX);
  388. m_ZoomIn->color (Info->GUI_COLOUR);
  389. m_ZoomIn->selection_color (Info->GUI_COLOUR);
  390. //m_ZoomIn->callback((Fl_Callback*)cb_ZoomIn);
  391. m_ZoomOut = new Fl_Button(bx+(n++*bs),by,bw,bh,"Zoom -");
  392. m_ZoomOut->labelsize(10);
  393. m_ZoomOut->box (FL_PLASTIC_UP_BOX);
  394. m_ZoomOut->color (Info->GUI_COLOUR);
  395. m_ZoomOut->selection_color (Info->GUI_COLOUR);
  396. //m_ZoomOut->callback((Fl_Callback*)cb_ZoomOut);
  397. end();
  398. redraw();
  399. }
  400. void PoshSamplerPluginGUI::UpdateSampleDisplay(int num) {
  401. m_GUICH->SetCommand (PoshSamplerPlugin::GETSAMPLE);
  402. m_GUICH->Wait();
  403. m_GUICH->RequestChannelAndWait ("SampleSize");
  404. long SampleSize = m_GUICH->GetLong ("SampleSize");
  405. if (!SampleSize) m_Display->ClearSample();
  406. else {
  407. char *TempBuf = new char[SampleSize];
  408. m_GUICH->BulkTransfer ("SampleBuffer", (void*)TempBuf, SampleSize);
  409. m_Display->SetSample ((float*)TempBuf, SampleSize / sizeof(float));
  410. delete[] TempBuf;
  411. }
  412. }
  413. void PoshSamplerPluginGUI::Update() {
  414. SetPlayPos (m_GUICH->GetLong ("PlayPos"));
  415. if (m_ZoomIn->value()) m_Display->ZoomIn();
  416. if (m_ZoomOut->value()) m_Display->ZoomOut();
  417. if (m_UpdateMe) {
  418. UpdateSampleDisplay ((int)m_SampleNum->value());
  419. m_Display->redraw();
  420. m_UpdateMe=false;
  421. }
  422. // redraw();
  423. }
  424. void PoshSamplerPluginGUI::UpdateValues (SpiralPlugin *o) {
  425. PoshSamplerPlugin *Plugin = (PoshSamplerPlugin*)o;
  426. m_Volume->value (Plugin->GetVolume ((int)m_SampleNum->value()));
  427. m_Pitch->value (Plugin->GetPitch ((int)m_SampleNum->value()));
  428. m_Note->value (Plugin->GetNote ((int)m_SampleNum->value()));
  429. m_Loop->value (Plugin->GetLoop ((int)m_SampleNum->value()));
  430. m_Retrig->value (Plugin->GetReTrig ((int)m_SampleNum->value()));
  431. m_UpdateMe = true;
  432. m_Display->SetPlayStart (Plugin->GetPlayStart ((int)m_SampleNum->value()));
  433. m_Display->SetLoopStart (Plugin->GetLoopStart ((int)m_SampleNum->value()));
  434. m_Display->SetLoopEnd (Plugin->GetLoopEnd ((int)m_SampleNum->value()));
  435. m_Display->redraw();
  436. }
  437. inline void PoshSamplerPluginGUI::cb_Load_i(Fl_Button* o, void* v)
  438. {
  439. char *fn=WaveFileName ();
  440. if (fn && fn!='\0')
  441. {
  442. strcpy(m_TextBuf,fn);
  443. m_GUICH->SetData("Name",m_TextBuf);
  444. m_GUICH->Set("Num",(int)m_SampleNum->value());
  445. m_GUICH->SetCommand(PoshSamplerPlugin::LOAD);
  446. m_GUICH->Wait(); // wait for the sample to load
  447. UpdateSampleDisplay((int)m_SampleNum->value());
  448. m_Display->redraw();
  449. redraw();
  450. }
  451. }
  452. void PoshSamplerPluginGUI::cb_Load(Fl_Button* o, void* v)
  453. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Load_i(o,v);}
  454. inline void PoshSamplerPluginGUI::cb_Save_i(Fl_Button* o, void* v)
  455. {
  456. char *fn=fl_file_chooser("Save sample", "{*.wav,*.WAV}", NULL);
  457. if (fn && fn!='\0')
  458. {
  459. strcpy(m_TextBuf,fn);
  460. m_GUICH->Set("Name",m_TextBuf);
  461. m_GUICH->Set("Num",(int)m_SampleNum->value());
  462. m_GUICH->SetCommand(PoshSamplerPlugin::SAVE);
  463. }
  464. }
  465. void PoshSamplerPluginGUI::cb_Save(Fl_Button* o, void* v)
  466. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Save_i(o,v);}
  467. inline void PoshSamplerPluginGUI::cb_Volume_i (Fl_Knob *o, void *v) {
  468. m_GUICH->Set ("Value", (float)o->value());
  469. m_GUICH->Set ("Num", (int)m_SampleNum->value());
  470. m_GUICH->SetCommand (PoshSamplerPlugin::SETVOL);
  471. }
  472. void PoshSamplerPluginGUI::cb_Volume (Fl_Knob *o, void *v) {
  473. ((PoshSamplerPluginGUI*)(o->parent()))->cb_Volume_i (o, v);
  474. }
  475. inline void PoshSamplerPluginGUI::cb_Pitch_i(Fl_Knob* o, void* v)
  476. {
  477. m_GUICH->Set("Value",(float)o->value());
  478. m_GUICH->Set("Num",(int)m_SampleNum->value());
  479. m_GUICH->SetCommand(PoshSamplerPlugin::SETPITCH);
  480. }
  481. void PoshSamplerPluginGUI::cb_Pitch(Fl_Knob* o, void* v)
  482. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Pitch_i(o,v);}
  483. inline void PoshSamplerPluginGUI::cb_Octave_i(Fl_Knob* o, void* v)
  484. {
  485. m_GUICH->Set("Int",(int)o->value());
  486. m_GUICH->Set("Num",(int)m_SampleNum->value());
  487. m_GUICH->SetCommand(PoshSamplerPlugin::SETOCT);
  488. }
  489. void PoshSamplerPluginGUI::cb_Octave(Fl_Knob* o, void* v)
  490. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Octave_i(o,v);}
  491. inline void PoshSamplerPluginGUI::cb_Loop_i(Fl_Button* o, void* v)
  492. {
  493. m_GUICH->Set("Bool",(bool)o->value());
  494. m_GUICH->Set("Num",(int)m_SampleNum->value());
  495. m_GUICH->SetCommand(PoshSamplerPlugin::SETLOOP);
  496. }
  497. void PoshSamplerPluginGUI::cb_Loop(Fl_Button* o, void* v)
  498. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Loop_i(o,v);}
  499. inline void PoshSamplerPluginGUI::cb_Retrig_i (Fl_Button *o, void *v) {
  500. m_GUICH->Set("Bool",(bool)o->value());
  501. m_GUICH->Set("Num",(int)m_SampleNum->value());
  502. m_GUICH->SetCommand(PoshSamplerPlugin::SETRETRIG);
  503. }
  504. void PoshSamplerPluginGUI::cb_Retrig (Fl_Button *o, void *v) {
  505. ((PoshSamplerPluginGUI*)(o->parent()))->cb_Retrig_i (o, v);
  506. }
  507. inline void PoshSamplerPluginGUI::cb_PingPong_i(Fl_Button* o, void* v)
  508. {
  509. m_GUICH->Set("Bool",(bool)o->value());
  510. m_GUICH->Set("Num",(int)m_SampleNum->value());
  511. m_GUICH->SetCommand(PoshSamplerPlugin::SETPING);
  512. }
  513. void PoshSamplerPluginGUI::cb_PingPong(Fl_Button* o, void* v)
  514. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_PingPong_i(o,v);}
  515. inline void PoshSamplerPluginGUI::cb_Record_i(Fl_Button* o, void* v)
  516. {
  517. m_GUICH->Set("Bool",(bool)o->value());
  518. m_GUICH->SetCommand(PoshSamplerPlugin::SETREC);
  519. redraw();
  520. }
  521. void PoshSamplerPluginGUI::cb_Record(Fl_Button* o, void* v)
  522. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Record_i(o,v);}
  523. inline void PoshSamplerPluginGUI::cb_PosMarker_i(Fl_Button* o, void* v)
  524. { m_Display->SetPosMarker(o->value()); }
  525. void PoshSamplerPluginGUI::cb_PosMarker(Fl_Button* o, void* v)
  526. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_PosMarker_i(o,v);}
  527. inline void PoshSamplerPluginGUI::cb_Note_i(Fl_Counter* o, void* v)
  528. {
  529. m_GUICH->Set("Int",(int)o->value());
  530. m_GUICH->Set("Num",(int)m_SampleNum->value());
  531. m_GUICH->SetCommand(PoshSamplerPlugin::SETNOTE);
  532. }
  533. void PoshSamplerPluginGUI::cb_Note(Fl_Counter* o, void* v)
  534. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Note_i(o,v);}
  535. inline void PoshSamplerPluginGUI::cb_SampleNum_i (Fl_Counter *o, void *v) {
  536. if (m_SampleNum->value() < 0) m_SampleNum->value (0);
  537. if (m_SampleNum->value() > 7) m_SampleNum->value (7);
  538. m_GUICH->Set ("Num", (int)m_SampleNum->value());
  539. m_GUICH->SetCommand (PoshSamplerPlugin::SETCURRENT);
  540. m_GUICH->Wait();
  541. m_GUICH->SetCommand (PoshSamplerPlugin::GETLOOP);
  542. m_GUICH->Wait();
  543. m_Loop->value (m_GUICH->GetBool ("BoolEcho"));
  544. m_GUICH->SetCommand (PoshSamplerPlugin::GETPING);
  545. m_GUICH->Wait();
  546. m_PingPong->value (m_GUICH->GetBool ("BoolEcho"));
  547. m_GUICH->SetCommand (PoshSamplerPlugin::GETRETRIG);
  548. m_GUICH->Wait();
  549. m_Retrig->value (m_GUICH->GetBool ("BoolEcho"));
  550. m_GUICH->SetCommand (PoshSamplerPlugin::GETVOL);
  551. m_GUICH->Wait();
  552. m_Volume->value (m_GUICH->GetFloat ("ValEcho"));
  553. m_GUICH->SetCommand (PoshSamplerPlugin::GETPITCH);
  554. m_GUICH->Wait();
  555. m_Pitch->value (m_GUICH->GetFloat ("ValEcho"));
  556. m_GUICH->SetCommand (PoshSamplerPlugin::GETOCT);
  557. m_GUICH->Wait();
  558. m_Octave->value (m_GUICH->GetInt ("IntEcho"));
  559. m_GUICH->SetCommand (PoshSamplerPlugin::GETNOTE);
  560. m_GUICH->Wait();
  561. m_Note->value (m_GUICH->GetInt ("IntEcho"));
  562. UpdateSampleDisplay ((int)m_SampleNum->value());
  563. }
  564. void PoshSamplerPluginGUI::cb_SampleNum (Fl_Counter *o, void *v) {
  565. ((PoshSamplerPluginGUI*)(o->parent()))->cb_SampleNum_i (o, v);
  566. }
  567. inline void PoshSamplerPluginGUI::cb_Cut_i(Fl_Button* o, void* v)
  568. {
  569. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  570. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  571. m_GUICH->Set("Num",(int)m_SampleNum->value());
  572. m_GUICH->SetCommand(PoshSamplerPlugin::CUT);
  573. m_GUICH->Wait();
  574. UpdateSampleDisplay((int)m_SampleNum->value());
  575. m_Display->redraw();
  576. }
  577. void PoshSamplerPluginGUI::cb_Cut(Fl_Button* o, void* v)
  578. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Cut_i(o,v);}
  579. inline void PoshSamplerPluginGUI::cb_Copy_i(Fl_Button* o, void* v)
  580. {
  581. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  582. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  583. m_GUICH->Set("Num",(int)m_SampleNum->value());
  584. m_GUICH->SetCommand(PoshSamplerPlugin::COPY);
  585. }
  586. void PoshSamplerPluginGUI::cb_Copy(Fl_Button* o, void* v)
  587. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Copy_i(o,v);}
  588. inline void PoshSamplerPluginGUI::cb_Paste_i(Fl_Button* o, void* v)
  589. {
  590. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  591. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  592. m_GUICH->Set("Num",(int)m_SampleNum->value());
  593. m_GUICH->SetCommand(PoshSamplerPlugin::PASTE);
  594. m_GUICH->Wait();
  595. UpdateSampleDisplay((int)m_SampleNum->value());
  596. m_Display->redraw();
  597. }
  598. void PoshSamplerPluginGUI::cb_Paste(Fl_Button* o, void* v)
  599. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Paste_i(o,v);}
  600. inline void PoshSamplerPluginGUI::cb_Mix_i(Fl_Button* o, void* v)
  601. {
  602. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  603. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  604. m_GUICH->Set("Num",(int)m_SampleNum->value());
  605. m_GUICH->SetCommand(PoshSamplerPlugin::MIX);
  606. m_GUICH->Wait();
  607. UpdateSampleDisplay((int)m_SampleNum->value());
  608. m_Display->redraw();
  609. }
  610. void PoshSamplerPluginGUI::cb_Mix(Fl_Button* o, void* v)
  611. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Mix_i(o,v);}
  612. inline void PoshSamplerPluginGUI::cb_Crop_i(Fl_Button* o, void* v)
  613. {
  614. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  615. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  616. m_GUICH->Set("Num",(int)m_SampleNum->value());
  617. m_GUICH->SetCommand(PoshSamplerPlugin::CROP);
  618. m_GUICH->Wait();
  619. UpdateSampleDisplay((int)m_SampleNum->value());
  620. m_Display->redraw();
  621. }
  622. void PoshSamplerPluginGUI::cb_Crop(Fl_Button* o, void* v)
  623. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Crop_i(o,v);}
  624. inline void PoshSamplerPluginGUI::cb_Reverse_i(Fl_Button* o, void* v)
  625. {
  626. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  627. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  628. m_GUICH->Set("Num",(int)m_SampleNum->value());
  629. m_GUICH->SetCommand(PoshSamplerPlugin::REV);
  630. m_GUICH->Wait();
  631. UpdateSampleDisplay((int)m_SampleNum->value());
  632. m_Display->redraw();
  633. }
  634. void PoshSamplerPluginGUI::cb_Reverse(Fl_Button* o, void* v)
  635. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Reverse_i(o,v);}
  636. inline void PoshSamplerPluginGUI::cb_Amp_i(Fl_Button* o, void* v)
  637. {
  638. m_GUICH->Set("Start",(long)m_Display->GetRangeStart());
  639. m_GUICH->Set("End",(long)m_Display->GetRangeEnd());
  640. m_GUICH->Set("Num",(int)m_SampleNum->value());
  641. m_GUICH->SetCommand(PoshSamplerPlugin::AMP);
  642. m_GUICH->Wait();
  643. UpdateSampleDisplay((int)m_SampleNum->value());
  644. m_Display->redraw();
  645. }
  646. void PoshSamplerPluginGUI::cb_Amp(Fl_Button* o, void* v)
  647. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_Amp_i(o,v);}
  648. inline void PoshSamplerPluginGUI::cb_WaveDisplay_i(Fl_WaveDisplay* o, void* v)
  649. {
  650. m_GUICH->Set("Start",(long)o->GetPlayStart());
  651. m_GUICH->Set("End",(long)o->GetLoopEnd());
  652. m_GUICH->Set("LoopStart",(long)o->GetLoopStart());
  653. m_GUICH->Set("Num",(int)m_SampleNum->value());
  654. m_GUICH->SetCommand(PoshSamplerPlugin::SETPLAYPOINTS);
  655. }
  656. void PoshSamplerPluginGUI::cb_WaveDisplay(Fl_WaveDisplay* o, void* v)
  657. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_WaveDisplay_i(o,v);}
  658. inline void PoshSamplerPluginGUI::cb_ZoomIn_i(Fl_Button* o, void* v)
  659. {
  660. m_Display->ZoomIn();
  661. }
  662. void PoshSamplerPluginGUI::cb_ZoomIn(Fl_Button* o, void* v)
  663. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_ZoomIn_i(o,v);}
  664. inline void PoshSamplerPluginGUI::cb_ZoomOut_i(Fl_Button* o, void* v)
  665. {
  666. m_Display->ZoomOut();
  667. }
  668. void PoshSamplerPluginGUI::cb_ZoomOut(Fl_Button* o, void* v)
  669. { ((PoshSamplerPluginGUI*)(o->parent()))->cb_ZoomOut_i(o,v);}
  670. const string PoshSamplerPluginGUI::GetHelpText(const string &loc){
  671. return string("")
  672. + "A sampler that allows simple sample editing (cut copy paste etc),\n"
  673. + "dirty time stretching (by modulating the start pos + retriggering +\n"
  674. + "modulating pitch) and loop start/end points with ping pong loop mode.\n"
  675. + "Also implementations of controls, such as continuous pitch changing,\n"
  676. + "so you can add portmento to samples, trigger velocity sets sample\n"
  677. + "volume.\n\n"
  678. + "Can records input data too.\n\n"
  679. + "Controls:\n"
  680. + "lmb: Select region\n"
  681. + "mmb: Move view\n"
  682. + "rmb: Draws samples at full zoom.\n\n"
  683. + "Left mouse also drags loop points. The Loop end marker defaults to the\n"
  684. + "end of the sample.\n\n"
  685. + "Note: The loading and saving of samples is not yet realtime safe";
  686. }