Collection of tools useful for audio production
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.

1912 lines
60KB

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0300
  3. header_name {.h}
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2009 Nasca Octavian Paul} {private local
  6. }
  7. decl {//License: GNU GPL version 2 or later} {private local
  8. }
  9. decl {\#include <stdlib.h>} {public local
  10. }
  11. decl {\#include <stdio.h>} {public local
  12. }
  13. decl {\#include <string.h>} {public local
  14. }
  15. decl {\#include "WidgetPDial.h"} {public local
  16. }
  17. decl {\#include "ADnoteUI.h"} {public local
  18. }
  19. decl {\#include "SUBnoteUI.h"} {public local
  20. }
  21. decl {\#include "EffUI.h"} {public local
  22. }
  23. decl {\#include "VirKeyboard.h"} {public local
  24. }
  25. decl {\#include "ConfigUI.h"} {public local
  26. }
  27. decl {\#include "BankUI.h"} {public local
  28. }
  29. decl {\#include "PartUI.h"} {public local
  30. }
  31. decl {\#include "MicrotonalUI.h"} {public local
  32. }
  33. decl {\#include "PresetsUI.h"} {public local
  34. }
  35. decl {\#include "NioUI.h"} {public global
  36. }
  37. decl {\#include "../Misc/Master.h"} {public local
  38. }
  39. decl {\#include "../Misc/Part.h"} {public local
  40. }
  41. decl {\#include "../Misc/Util.h"} {public local
  42. }
  43. decl {\#include "common.H"} {public local
  44. }
  45. decl {\#if USE_NSM
  46. \#include "NSM.H"
  47. extern NSM_Client *nsm;
  48. \#endif} {public local
  49. }
  50. decl {\#include "../globals.h"} {public local
  51. }
  52. class VUMeter {: {public Fl_Box}
  53. } {
  54. Function {VUMeter(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  55. code {master=NULL;
  56. npart=-1;} {}
  57. }
  58. Function {init(Master *master_,int part_)} {} {
  59. code {//the "part_" parameters sets the part (if it is >=0), else it sets the master
  60. master=master_;
  61. label(NULL);
  62. npart=part_;
  63. olddbl=0.0;
  64. olddbr=0.0;
  65. oldrmsdbl=0.0;
  66. oldrmsdbr=0.0;} {}
  67. }
  68. Function {draw_master()} {} {
  69. code {\#define MIN_DB (-48)
  70. int ox=x(); int oy=y(); int lx=w(); int ly=h();
  71. vuData data = master->getVuData();
  72. //pthread_mutex_lock(&master->mutex);
  73. float dbl=rap2dB(data.outpeakl);
  74. float dbr=rap2dB(data.outpeakr);
  75. float rmsdbl=rap2dB(data.rmspeakl);
  76. float rmsdbr=rap2dB(data.rmspeakr);
  77. float maxdbl=rap2dB(data.maxoutpeakl);
  78. float maxdbr=rap2dB(data.maxoutpeakr);
  79. int clipped=data.clipped;
  80. //pthread_mutex_unlock(&master->mutex);
  81. dbl=(MIN_DB-dbl)/MIN_DB;
  82. if (dbl<0.0) dbl=0.0;
  83. else if (dbl>1.0)dbl=1.0;
  84. dbr=(MIN_DB-dbr)/MIN_DB;
  85. if (dbr<0.0) dbr=0.0;
  86. else if (dbr>1.0) dbr=1.0;
  87. dbl=dbl*0.4+olddbl*0.6;
  88. dbr=dbr*0.4+olddbr*0.6;
  89. if ( damage() & FL_DAMAGE_USER1 )
  90. {
  91. if ( olddbl == dbl && olddbr == dbr )
  92. return;
  93. }
  94. olddbl=dbl;
  95. olddbr=dbr;
  96. \#define VULENX (lx-35)
  97. \#define VULENY (ly/2-3)
  98. dbl*=VULENX;dbr*=VULENX;
  99. int idbl=(int) dbl;
  100. int idbr=(int) dbr;
  101. //compute RMS - start
  102. rmsdbl=(MIN_DB-rmsdbl)/MIN_DB;
  103. if (rmsdbl<0.0) rmsdbl=0.0;
  104. else if (rmsdbl>1.0) rmsdbl=1.0;
  105. rmsdbr=(MIN_DB-rmsdbr)/MIN_DB;
  106. if (rmsdbr<0.0) rmsdbr=0.0;
  107. else if (rmsdbr>1.0) rmsdbr=1.0;
  108. rmsdbl=rmsdbl*0.4+oldrmsdbl*0.6;
  109. rmsdbr=rmsdbr*0.4+oldrmsdbr*0.6;
  110. oldrmsdbl=rmsdbl;
  111. oldrmsdbr=rmsdbr;
  112. rmsdbl*=VULENX;rmsdbr*=VULENX;
  113. int irmsdbl=(int) rmsdbl;
  114. int irmsdbr=(int) rmsdbr;
  115. //compute RMS - end
  116. //draw the vu-meter lines
  117. //db
  118. fl_rectf(ox,oy,idbr,VULENY,0,200,255);
  119. fl_rectf(ox,oy+ly/2,idbl,VULENY,0,200,255);
  120. //black
  121. fl_rectf(ox+idbr,oy,VULENX-idbr,VULENY,0,0,0);
  122. fl_rectf(ox+idbl,oy+ly/2,VULENX-idbl,VULENY,0,0,0);
  123. //draw the scales
  124. float tmp=VULENX*1.0/MIN_DB;
  125. for (int i=1;i<1-MIN_DB;i++){
  126. int tx=VULENX+(int) (tmp*i);
  127. fl_rectf(ox+tx,oy,1,VULENY+ly/2,0,160,200);
  128. if (i%5==0) fl_rectf(ox+tx,oy,1,VULENY+ly/2,0,230,240);
  129. if (i%10==0) fl_rectf(ox+tx-1,oy,2,VULENY+ly/2,0,225,255);
  130. };
  131. //rms
  132. if (irmsdbr>2) fl_rectf(ox+irmsdbr-1,oy,3,VULENY,255,255,0);
  133. if (irmsdbl>2) fl_rectf(ox+irmsdbl-1,oy+ly/2,3,VULENY,255,255,0);
  134. //draw the red box if clipping has occured
  135. if (clipped==0) fl_rectf(ox+VULENX+2,oy+1,lx-VULENX-3,ly-4,0,0,10);
  136. else fl_rectf(ox+VULENX+2,oy+1,lx-VULENX-3,ly-4,250,10,10);
  137. //draw the maxdB
  138. fl_font(FL_HELVETICA|FL_BOLD,10);
  139. fl_color(255,255,255);
  140. char tmpstr[10];
  141. if ((maxdbl>MIN_DB-20)){
  142. snprintf((char *)&tmpstr,10,"%ddB",(int)maxdbr);
  143. fl_draw(tmpstr,ox+VULENX+1,oy+1,lx-VULENX-1,VULENY,FL_ALIGN_RIGHT,NULL,0);
  144. };
  145. if ((maxdbr>MIN_DB-20)){
  146. snprintf((char *)&tmpstr,10,"%ddB",(int)maxdbl);
  147. fl_draw(tmpstr,ox+VULENX+1,oy+ly/2+1,lx-VULENX-1,VULENY,FL_ALIGN_RIGHT,NULL,0);
  148. };} {}
  149. }
  150. Function {draw_part()} {} {
  151. code {\#define MIN_DB (-48)
  152. int ox=x(); int oy=y(); int lx=w(); int ly=h();
  153. if (!active_r()){
  154. pthread_mutex_lock(&master->vumutex);
  155. int fakedb=master->fakepeakpart[npart];
  156. pthread_mutex_unlock(&master->vumutex);
  157. fl_rectf(ox,oy,lx,ly,140,140,140);
  158. if (fakedb>0){
  159. fakedb=(int)(fakedb/255.0*ly)+4;
  160. fl_rectf(ox+2,oy+ly-fakedb,lx-4,fakedb,0,0,0);
  161. };
  162. return;
  163. };
  164. //draw the vu lines
  165. pthread_mutex_lock(&master->vumutex);
  166. float db=rap2dB(master->vuoutpeakpart[npart]);
  167. pthread_mutex_unlock(&master->vumutex);
  168. db=(MIN_DB-db)/MIN_DB;
  169. if (db<0.0) db=0.0;
  170. else if (db>1.0) db=1.0;
  171. db*=ly-2;
  172. int idb=(int) db;
  173. fl_rectf(ox,oy+ly-idb,lx,idb,0,200,255);
  174. fl_rectf(ox,oy,lx,ly-idb,0,0,0);
  175. //draw the scales
  176. float tmp=ly*1.0/MIN_DB;
  177. for (int i=1;i<1-MIN_DB;i++){
  178. int ty=ly+(int) (tmp*i);
  179. if (i%5==0) fl_rectf(ox,oy+ly-ty,lx,1,0,160,200);
  180. if (i%10==0) fl_rectf(ox,oy+ly-ty,lx,1,0,230,240);
  181. };} {}
  182. }
  183. Function {draw()} {} {
  184. code {if (npart>=0) draw_part();
  185. else draw_master();} {}
  186. }
  187. Function {tickdraw(VUMeter *o)} {return_type {static void}
  188. } {
  189. code {o->damage(FL_DAMAGE_USER1);} {}
  190. }
  191. Function {tick(void *v)} {return_type {static void}
  192. } {
  193. code {tickdraw((VUMeter *) v);
  194. Fl::repeat_timeout(1.0/18.0,tick,v);//18 fps} {}
  195. }
  196. Function {handle(int event)} {return_type int
  197. } {
  198. code {switch(event){
  199. case FL_SHOW:
  200. Fl::add_timeout(1.0/18.0,tick,this);
  201. break;
  202. case FL_HIDE:
  203. Fl::remove_timeout(tick,this);
  204. break;
  205. case FL_PUSH:
  206. if (npart>=0) break;
  207. pthread_mutex_lock(&master->mutex);
  208. master->vuresetpeaks();
  209. pthread_mutex_unlock(&master->mutex);
  210. break;
  211. };
  212. return(1);} {}
  213. }
  214. decl {Master *master;} {private local
  215. }
  216. decl {int npart;} {private local
  217. }
  218. decl {float olddbl,olddbr;} {private local
  219. }
  220. decl {float oldrmsdbl,oldrmsdbr;} {private local
  221. }
  222. }
  223. class SysEffSend {open : {public WidgetPDial}
  224. } {
  225. Function {SysEffSend(int x,int y, int w, int h, const char *label=0):WidgetPDial(x,y,w,h,label)} {} {
  226. code {master=NULL;
  227. neff1=0;
  228. neff2=0;} {}
  229. }
  230. Function {init(Master *master_,int neff1_,int neff2_)} {} {
  231. code {neff1=neff1_;
  232. neff2=neff2_;
  233. master=master_;
  234. minimum(0);
  235. maximum(127);
  236. step(1);
  237. labelfont(1);
  238. labelsize(10);
  239. align(FL_ALIGN_TOP);
  240. value(master->Psysefxsend[neff1][neff2]);
  241. char tmp[20];snprintf(tmp,20,"%d->%d",neff1+1,neff2+1);
  242. this->copy_label(tmp);} {}
  243. }
  244. Function {~SysEffSend()} {} {
  245. code {hide();} {}
  246. }
  247. Function {handle(int event)} {return_type int
  248. } {
  249. code {if ((event==FL_PUSH) || (event==FL_DRAG)){
  250. master->setPsysefxsend(neff1,neff2,(int) value());
  251. };
  252. return(WidgetPDial::handle(event));} {}
  253. }
  254. decl {Master *master;} {private local
  255. }
  256. decl {int neff1;} {private local
  257. }
  258. decl {int neff2;} {private local
  259. }
  260. }
  261. class Panellistitem {open : {public Fl_Group}
  262. } {
  263. Function {make_window()} {open private
  264. } {
  265. Fl_Window panellistitem {open
  266. private xywh {605 688 100 260} type Double box NO_BOX
  267. class Fl_Group visible
  268. } {
  269. Fl_Group panellistitemgroup {open
  270. private xywh {0 20 70 240} box UP_FRAME
  271. code0 {if (master->part[npart]->Penabled==0) o->deactivate();}
  272. code1 {set_module_parameters( o );}
  273. } {
  274. Fl_Group {} {
  275. xywh {45 65 15 110} box ENGRAVED_FRAME
  276. } {
  277. Fl_Box {} {
  278. label {V U}
  279. xywh {45 65 15 110} box FLAT_BOX color 0 selection_color 75 labelcolor 55 align 128
  280. code0 {o->init(master,npart);}
  281. class VUMeter
  282. }
  283. }
  284. Fl_Button partname {
  285. label { }
  286. callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  287. bankui->cbwig->value(npart+1);
  288. bankui->cbwig->do_callback();
  289. };
  290. bankui->show();}
  291. xywh {5 27 60 30} box THIN_DOWN_BOX down_box FLAT_BOX labelfont 1 labelsize 10 align 208
  292. }
  293. Fl_Slider partvolume {
  294. callback {master->part[npart]->setPvolume((int) o->value());}
  295. xywh {10 65 30 110} type {Vert Knob} box NO_BOX minimum 127 maximum 0 step 1 value 127
  296. code0 {o->value(master->part[npart]->Pvolume);}
  297. }
  298. Fl_Dial partpanning {
  299. callback {master->part[npart]->setPpanning((int) o->value());}
  300. xywh {20 180 30 30} maximum 127 step 1
  301. code0 {o->value(master->part[npart]->Ppanning);}
  302. class WidgetPDial
  303. }
  304. Fl_Button {} {
  305. label edit
  306. callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  307. bankui->cbwig->value(npart+1);
  308. bankui->cbwig->do_callback();
  309. };}
  310. xywh {15 235 40 20} labelsize 10
  311. }
  312. Fl_Choice partrcv {
  313. callback {master->part[npart]->Prcvchn=(int) o->value();}
  314. tooltip {receive from Midi channel} xywh {10 213 50 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10
  315. code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Ch%d",i+1);if (i!=9) o->add(nrstr); else o->add("Dr10");};}
  316. code1 {o->value(master->part[npart]->Prcvchn);}
  317. } {}
  318. }
  319. Fl_Check_Button partenabled {
  320. label 01
  321. callback {pthread_mutex_lock(&master->mutex);
  322. master->partonoff(npart,(int) o->value());
  323. pthread_mutex_unlock(&master->mutex);
  324. if ((int) o->value()==0) panellistitemgroup->deactivate();
  325. else {
  326. panellistitemgroup->activate();
  327. if ((int)bankui->cbwig->value()!=(npart+1)){
  328. bankui->cbwig->value(npart+1);
  329. bankui->cbwig->do_callback();
  330. };
  331. };
  332. o->redraw();}
  333. private xywh {5 0 45 20} down_box DOWN_BOX labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 24
  334. code0 {char tmp[10];snprintf(tmp,10,"%d",npart+1);o->copy_label(tmp);}
  335. code1 {o->value(master->part[npart]->Penabled);}
  336. }
  337. }
  338. }
  339. Function {Panellistitem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} {
  340. code {npart=0;
  341. master=NULL;
  342. bankui=NULL;} {}
  343. }
  344. Function {init(Master *master_, int npart_,BankUI *bankui_)} {} {
  345. code {npart=npart_;
  346. master=master_;
  347. bankui=bankui_;
  348. make_window();
  349. panellistitem->show();
  350. end();} {}
  351. }
  352. Function {refresh()} {} {
  353. code {partenabled->value(master->part[npart]->Penabled);
  354. if (master->part[npart]->Penabled!=0) panellistitemgroup->activate();
  355. else panellistitemgroup->deactivate();
  356. partvolume->value(master->part[npart]->Pvolume);
  357. partpanning->value(master->part[npart]->Ppanning);
  358. partrcv->value(master->part[npart]->Prcvchn);
  359. partname->label((char *)master->part[npart]->Pname);
  360. if ((int)bankui->cbwig->value()!=(npart+1))
  361. panellistitemgroup->color(fl_rgb_color(160,160,160));
  362. else
  363. panellistitemgroup->color(fl_rgb_color(50,190,240));
  364. panellistitemgroup->redraw();} {}
  365. }
  366. Function {~Panellistitem()} {} {
  367. code {panellistitem->hide();
  368. //delete(panellistitem);} {}
  369. }
  370. decl {int npart;} {private local
  371. }
  372. decl {Master *master;} {private local
  373. }
  374. decl {BankUI *bankui;} {private local
  375. }
  376. }
  377. class MasterUI {open
  378. } {
  379. Function {make_window()} {open
  380. } {
  381. Fl_Window masterwindow {
  382. label zynaddsubfx
  383. callback {\#ifdef VSTAUDIOOUT
  384. fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. Please use the host aplication to close it.");
  385. \#else
  386. if ((
  387. \#if USE_NSM
  388. (nsm && nsm->is_active())
  389. \#else
  390. 0
  391. \#endif
  392. || fl_choice("Exit and leave the unsaved data?","No","Yes",NULL))) {
  393. config.save();
  394. *exitprogram=1;
  395. };
  396. \#endif} open
  397. xywh {77 347 390 525} type Double align 80 xclass zynaddsubfx visible
  398. } {
  399. Fl_Menu_Bar mastermenu {
  400. xywh {-5 0 690 25}
  401. } {
  402. Submenu {} {
  403. label {&File}
  404. xywh {0 0 100 20}
  405. } {
  406. MenuItem {} {
  407. label {&New (erase all)...}
  408. callback {do_new_master();}
  409. xywh {20 20 100 20}
  410. }
  411. MenuItem {} {
  412. label {&Open Parameters...}
  413. callback {\#if USE_NSM
  414. if ( nsm && nsm->is_active() )
  415. {
  416. do_load_master();
  417. do_save_master( nsm->project_filename );
  418. }
  419. else
  420. \#endif
  421. {
  422. do_load_master();
  423. }}
  424. xywh {20 20 100 20}
  425. }
  426. MenuItem {} {
  427. label {&Save All Parameters...}
  428. callback {\#if USE_NSM
  429. if ( nsm && nsm->is_active() )
  430. {
  431. do_save_master( nsm->project_filename );
  432. }
  433. else
  434. \#endif
  435. {
  436. do_save_master();
  437. }}
  438. xywh {10 10 100 20} divider
  439. }
  440. MenuItem {} {
  441. label {&Load Scale Settings...}
  442. callback {char *filename;
  443. filename=fl_file_chooser("Open:","({*.xsz})",NULL,0);
  444. if (filename==NULL) return;
  445. pthread_mutex_lock(&master->mutex);
  446. //clear all parameters
  447. master->microtonal.defaults();
  448. //load the data
  449. int result=master->microtonal.loadXML(filename);
  450. pthread_mutex_unlock(&master->mutex);
  451. delete microtonalui;
  452. microtonalui=new MicrotonalUI(&master->microtonal);
  453. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not a scale file.");
  454. else if (result<0) fl_alert("Error: Could not load the file.");}
  455. xywh {35 35 100 20}
  456. }
  457. MenuItem {} {
  458. label {Save Sc&ale Settings ..}
  459. callback {char *filename;
  460. int result=0;
  461. filename=fl_file_chooser("Save:","({*.xsz})",NULL,0);
  462. if (filename==NULL) return;
  463. filename=fl_filename_setext(filename,".xsz");
  464. result=fileexists(filename);
  465. if (result) {
  466. result=0;
  467. if (!fl_choice("The file exists. \\nOverwrite it?","No","Yes",NULL)) return;
  468. };
  469. pthread_mutex_lock(&master->mutex);
  470. result=master->microtonal.saveXML(filename);
  471. pthread_mutex_unlock(&master->mutex);
  472. if (result<0) fl_alert("Error: Could not save the file.");
  473. updatepanel();}
  474. xywh {25 25 100 20}
  475. }
  476. MenuItem {} {
  477. label {Show Scale Settings...}
  478. callback {microtonalui->show();}
  479. xywh {0 0 100 20} divider
  480. }
  481. MenuItem {} {
  482. label {&Settings...}
  483. callback {configui->show();}
  484. xywh {25 25 100 20}
  485. }
  486. MenuItem {} {
  487. label {N&io Settings}
  488. callback {nioui.refresh();
  489. nioui.show();}
  490. xywh {0 0 36 21} divider
  491. }
  492. MenuItem {} {
  493. label {&Copyright...}
  494. callback {aboutwindow->show();}
  495. xywh {15 15 100 20} divider
  496. }
  497. MenuItem {} {
  498. label {E&xit}
  499. callback {masterwindow->do_callback();}
  500. xywh {10 10 100 20}
  501. }
  502. }
  503. Submenu {} {
  504. label {&Instrument}
  505. xywh {10 10 100 20}
  506. } {
  507. MenuItem {} {
  508. label {&Clear Instrument...}
  509. callback {if (fl_choice("Clear instrument's parameters ?","No","Yes",NULL)){
  510. // int npart=(int)npartcounter->value()-1;
  511. pthread_mutex_lock(&master->mutex);
  512. master->part[npart]->defaultsinstrument();
  513. pthread_mutex_unlock(&master->mutex);
  514. npartcounter->do_callback();
  515. };
  516. updatepanel();}
  517. xywh {35 35 100 20}
  518. }
  519. MenuItem {} {
  520. label {&Open Instrument...}
  521. callback {const char *filename;
  522. filename=fl_file_chooser("Load:","({*.xiz})",NULL,0);
  523. if (filename==NULL) return;
  524. pthread_mutex_lock(&master->mutex);
  525. // int npart=(int)npartcounter->value()-1;
  526. //clear all instrument parameters, first
  527. master->part[npart]->defaultsinstrument();
  528. //load the instr. parameters
  529. int result=master->part[npart]->loadXMLinstrument(filename);
  530. pthread_mutex_unlock(&master->mutex);
  531. master->part[npart]->applyparameters();
  532. npartcounter->do_callback();
  533. updatepanel();
  534. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not an instrument file.");
  535. else if (result<0) fl_alert("Error: Could not load the file.");}
  536. xywh {30 30 100 20}
  537. }
  538. MenuItem {} {
  539. label {&Save Instrument ...}
  540. callback {char *filename;
  541. filename=fl_file_chooser("Save:","({*.xiz})",NULL,0);
  542. if (filename==NULL) return;
  543. filename=fl_filename_setext(filename,".xiz");
  544. int result=fileexists(filename);
  545. if (result) {
  546. result=0;
  547. if (!fl_choice("The file exists. \\nOverwrite it?","No","Yes",NULL)) return;
  548. };
  549. pthread_mutex_lock(&master->mutex);
  550. result=master->part[npart]->saveXML(filename);
  551. pthread_mutex_unlock(&master->mutex);
  552. if (result<0) fl_alert("Error: Could not save the file.");
  553. updatepanel();}
  554. xywh {20 20 100 20} divider
  555. }
  556. MenuItem {} {
  557. label {Show Instrument &Bank...}
  558. callback {bankui->show();}
  559. xywh {0 0 100 20} divider
  560. }
  561. MenuItem {} {
  562. label {&Virtual Keyboard...}
  563. callback {virkeyboard->show();}
  564. xywh {10 10 100 20}
  565. }
  566. }
  567. Submenu recordmenu {
  568. label {&Record}
  569. xywh {0 0 100 20}
  570. } {
  571. MenuItem {} {
  572. label {&Choose WAV file...}
  573. callback {char *filename;
  574. recordbutton->deactivate();
  575. pausebutton->deactivate();
  576. pauselabel->deactivate();
  577. stopbutton->deactivate();
  578. filename=fl_file_chooser("Record to audio file:","(*.wav)",NULL,0);
  579. if (filename==NULL) return;
  580. fl_filename_setext(filename,".wav");
  581. int result=master->HDDRecorder.preparefile(filename,0);
  582. if (result==1) {
  583. result=0;
  584. if (fl_choice("The file exists. \\nOverwrite it?","No","Yes",NULL))
  585. master->HDDRecorder.preparefile(filename,1);
  586. };
  587. if (result==0) recordbutton->activate();
  588. if (result!=0) fl_alert("Error: Could not save the file.");}
  589. xywh {0 0 100 20}
  590. }
  591. }
  592. Submenu {} {
  593. label Misc
  594. xywh {10 10 100 20}
  595. } {
  596. MenuItem {} {
  597. label {Switch User Interface Mode}
  598. callback {if (fl_choice("Switch the User Interface to Beginner mode ?","No","Yes",NULL)){
  599. masterwindow->hide();
  600. refresh_master_ui();
  601. simplemasterwindow->show();
  602. config.cfg.UserInterfaceMode=2;
  603. };}
  604. xywh {10 10 100 20}
  605. }
  606. }
  607. }
  608. Fl_Dial mastervolumedial {
  609. label {Master Volume}
  610. callback {master->setPvolume((int) o->value());}
  611. tooltip {Master Volume} xywh {15 32 55 55} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1
  612. code0 {o->value(master->Pvolume);}
  613. class WidgetPDial
  614. }
  615. Fl_Counter masterkeyshiftcounter {
  616. label {Master KeyShift}
  617. callback {master->setPkeyshift((int) o->value()+64);}
  618. xywh {150 97 120 23} type Simple labelsize 9 minimum -64 maximum 64 step 1
  619. code0 {o->lstep(12);}
  620. code1 {o->value(master->Pkeyshift-64);}
  621. }
  622. Fl_Button {} {
  623. label {Panic!}
  624. callback {virkeyboard->relaseallkeys();
  625. pthread_mutex_lock(&master->mutex);
  626. master->shutup=1;
  627. pthread_mutex_unlock(&master->mutex);}
  628. xywh {280 29 105 53} color 90 labelfont 1
  629. }
  630. Fl_Group partuigroup {open
  631. xywh {0 310 390 205}
  632. } {
  633. Fl_Group partui {open selected
  634. xywh {0 310 383 175}
  635. code0 {o->init(master->part[0],master,0,bankui);}
  636. code1 {o->show();}
  637. class PartUI
  638. } {}
  639. }
  640. Fl_Tabs {} {open
  641. xywh {0 145 390 165} box UP_FRAME
  642. } {
  643. Fl_Group {} {
  644. label {System Effects} open
  645. xywh {0 162 390 145} labelsize 15 align 9
  646. } {
  647. Fl_Counter syseffnocounter {
  648. label {Sys.Effect No.}
  649. callback {nsyseff=(int) o->value()-1;
  650. sysefftype->value(master->sysefx[nsyseff]->geteffect());
  651. syseffectui->refresh(master->sysefx[nsyseff]);}
  652. xywh {5 181 80 22} type Simple labelfont 1 labelsize 10 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  653. code0 {o->bounds(1,NUM_SYS_EFX);}
  654. code1 {o->value(nsyseff+1);}
  655. }
  656. Fl_Choice sysefftype {
  657. label EffType
  658. callback {pthread_mutex_lock(&master->mutex);
  659. master->sysefx[nsyseff]->changeeffect((int) o->value());
  660. pthread_mutex_unlock(&master->mutex);
  661. syseffectui->refresh(master->sysefx[nsyseff]);}
  662. xywh {285 176 100 22} down_box BORDER_BOX labelsize 10
  663. code0 {o->value(master->sysefx[nsyseff]->geteffect());}
  664. } {
  665. MenuItem {} {
  666. label {No Effect}
  667. xywh {10 10 100 20} labelfont 1 labelsize 10
  668. }
  669. MenuItem {} {
  670. label Reverb
  671. xywh {20 20 100 20} labelfont 1 labelsize 10
  672. }
  673. MenuItem {} {
  674. label Echo
  675. xywh {30 30 100 20} labelfont 1 labelsize 10
  676. }
  677. MenuItem {} {
  678. label Chorus
  679. xywh {40 40 100 20} labelfont 1 labelsize 10
  680. }
  681. MenuItem {} {
  682. label Phaser
  683. xywh {50 50 100 20} labelfont 1 labelsize 10
  684. }
  685. MenuItem {} {
  686. label AlienWah
  687. xywh {60 60 100 20} labelfont 1 labelsize 10
  688. }
  689. MenuItem {} {
  690. label Distortion
  691. xywh {70 70 100 20} labelfont 1 labelsize 10
  692. }
  693. MenuItem {} {
  694. label EQ
  695. xywh {80 80 100 20} labelfont 1 labelsize 10
  696. }
  697. MenuItem {} {
  698. label DynFilter
  699. xywh {90 90 100 20} labelfont 1 labelsize 10
  700. }
  701. }
  702. Fl_Group syseffectuigroup {open
  703. xywh {5 203 380 95} color 48
  704. } {
  705. Fl_Group syseffectui {
  706. xywh {5 203 380 95}
  707. code0 {o->init(master->sysefx[nsyseff]);}
  708. class EffUI
  709. } {}
  710. }
  711. Fl_Button {} {
  712. label {Send to...}
  713. callback {syseffsendwindow->show();}
  714. xywh {90 181 85 22} box THIN_UP_BOX labelfont 1 labelsize 11
  715. }
  716. Fl_Button {} {
  717. label C
  718. callback {presetsui->copy(master->sysefx[nsyseff]);}
  719. xywh {180 187 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  720. }
  721. Fl_Button {} {
  722. label P
  723. callback {pthread_mutex_lock(&master->mutex);
  724. presetsui->paste(master->sysefx[nsyseff],syseffectui);
  725. pthread_mutex_unlock(&master->mutex);}
  726. xywh {210 187 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  727. }
  728. }
  729. Fl_Group {} {
  730. label {Insertion Effects} open
  731. xywh {0 165 390 145} labelsize 15 align 9 hide
  732. } {
  733. Fl_Counter inseffnocounter {
  734. label {Ins.Effect No.}
  735. callback {ninseff=(int) o->value()-1;
  736. insefftype->value(master->insefx[ninseff]->geteffect());
  737. inseffpart->value(master->Pinsparts[ninseff]+2);
  738. inseffectui->refresh(master->insefx[ninseff]);
  739. if (master->Pinsparts[ninseff]!=-1) {
  740. insefftype->activate();
  741. inseffectui->activate();
  742. inseffectuigroup->activate();
  743. } else {
  744. insefftype->deactivate();
  745. inseffectui->deactivate();
  746. inseffectuigroup->deactivate();
  747. };}
  748. xywh {5 183 80 22} type Simple labelfont 1 labelsize 10 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  749. code0 {o->bounds(1,NUM_INS_EFX);}
  750. code1 {o->value(ninseff+1);}
  751. }
  752. Fl_Choice insefftype {
  753. label EffType
  754. callback {pthread_mutex_lock(&master->mutex);
  755. master->insefx[ninseff]->changeeffect((int) o->value());
  756. pthread_mutex_unlock(&master->mutex);
  757. inseffectui->refresh(master->insefx[ninseff]);
  758. inseffectui->show();}
  759. xywh {285 173 100 22} down_box BORDER_BOX labelsize 10
  760. code0 {o->value(master->insefx[ninseff]->geteffect());}
  761. code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  762. } {
  763. MenuItem {} {
  764. label {No Effect}
  765. xywh {25 25 100 20} labelfont 1 labelsize 10
  766. }
  767. MenuItem {} {
  768. label Reverb
  769. xywh {35 35 100 20} labelfont 1 labelsize 10
  770. }
  771. MenuItem {} {
  772. label Echo
  773. xywh {45 45 100 20} labelfont 1 labelsize 10
  774. }
  775. MenuItem {} {
  776. label Chorus
  777. xywh {55 55 100 20} labelfont 1 labelsize 10
  778. }
  779. MenuItem {} {
  780. label Phaser
  781. xywh {60 60 100 20} labelfont 1 labelsize 10
  782. }
  783. MenuItem {} {
  784. label AlienWah
  785. xywh {70 70 100 20} labelfont 1 labelsize 10
  786. }
  787. MenuItem {} {
  788. label Distortion
  789. xywh {80 80 100 20} labelfont 1 labelsize 10
  790. }
  791. MenuItem {} {
  792. label EQ
  793. xywh {90 90 100 20} labelfont 1 labelsize 10
  794. }
  795. MenuItem {} {
  796. label DynFilter
  797. xywh {100 100 100 20} labelfont 1 labelsize 10
  798. }
  799. }
  800. Fl_Group inseffectuigroup {open
  801. xywh {5 205 380 95} box FLAT_BOX color 48
  802. } {
  803. Fl_Group inseffectui {
  804. xywh {5 205 380 90} box UP_FRAME
  805. code0 {o->init(master->insefx[ninseff]);}
  806. code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  807. class EffUI
  808. } {}
  809. }
  810. Fl_Choice inseffpart {
  811. label {Insert To.}
  812. callback {master->Pinsparts[ninseff]=(int) o->value()-2;
  813. if ((int) o->value()==1){
  814. inseffectuigroup->deactivate();
  815. insefftype->deactivate();
  816. inseffectui->deactivate();
  817. } else {
  818. inseffectuigroup->activate();
  819. insefftype->activate();
  820. inseffectui->activate();
  821. };
  822. master->insefx[ninseff]->cleanup();} open
  823. xywh {95 183 80 22} down_box BORDER_BOX labelfont 1 labelsize 10 align 5 textsize 10
  824. code0 {o->add("Master Out");o->add("Off");}
  825. code1 {char tmp[50]; for (int i=0;i<NUM_MIDI_PARTS;i++) {sprintf(tmp,"Part %2d",i+1);o->add(tmp);};}
  826. code3 {o->value(master->Pinsparts[ninseff]+2);}
  827. } {}
  828. Fl_Button {} {
  829. label C
  830. callback {presetsui->copy(master->insefx[ninseff]);}
  831. xywh {180 185 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  832. }
  833. Fl_Button {} {
  834. label P
  835. callback {pthread_mutex_lock(&master->mutex);
  836. presetsui->paste(master->insefx[ninseff],inseffectui);
  837. pthread_mutex_unlock(&master->mutex);}
  838. xywh {210 185 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  839. }
  840. }
  841. }
  842. Fl_Button {} {
  843. label Scales
  844. callback {microtonalui->show();}
  845. xywh {320 87 65 23} color 51 labelfont 1
  846. }
  847. Fl_Group {} {
  848. xywh {150 40 117 45} box UP_FRAME
  849. } {
  850. Fl_Button recordbutton {
  851. label {Rec.}
  852. callback {o->deactivate();
  853. recordmenu->deactivate();
  854. recordmenu->label("&Record(*)");
  855. stopbutton->activate();
  856. pausebutton->activate();
  857. pauselabel->activate();
  858. master->HDDRecorder.start();
  859. master->vuresetpeaks();
  860. mastermenu->redraw();}
  861. tooltip {Start Recording} xywh {159 46 21 21} box ROUND_UP_BOX color 88 labelfont 1 labelsize 10 align 2 deactivate
  862. }
  863. Fl_Button stopbutton {
  864. label Stop
  865. callback {o->deactivate();
  866. master->HDDRecorder.stop();
  867. recordbutton->deactivate();
  868. pausebutton->deactivate();
  869. pauselabel->deactivate();
  870. recordmenu->activate();
  871. recordmenu->label("&Record");
  872. mastermenu->redraw();}
  873. tooltip {Stop Recording and close the audio file} xywh {237 46 21 21} box THIN_UP_BOX color 4 labelfont 1 labelsize 10 align 2 deactivate
  874. }
  875. Fl_Button pausebutton {
  876. label {@||}
  877. callback {o->deactivate();
  878. master->HDDRecorder.pause();
  879. recordbutton->activate();
  880. mastermenu->redraw();}
  881. tooltip {Pause Recording} xywh {198 46 21 21} box THIN_UP_BOX color 4 selection_color 4 labelfont 1 labelcolor 3 align 16 deactivate
  882. }
  883. Fl_Box pauselabel {
  884. label Pause
  885. xywh {192 66 30 15} labelfont 1 labelsize 10 deactivate
  886. }
  887. }
  888. Fl_Group {} {open
  889. xywh {1 490 389 55}
  890. } {
  891. Fl_Box {} {
  892. label {VU-Meter}
  893. xywh {5 490 380 30} box FLAT_BOX color 48 selection_color 75
  894. code0 {o->init(master,-1);}
  895. class VUMeter
  896. }
  897. }
  898. Fl_Check_Button nrpnbutton {
  899. label NRPN
  900. callback {master->ctl.NRPN.receive=(int) o->value();}
  901. tooltip {Receive NRPNs} xywh {10 115 60 25} down_box DOWN_BOX labelsize 12
  902. code0 {o->value(master->ctl.NRPN.receive);}
  903. }
  904. Fl_Counter npartcounter {
  905. callback {int nval=(int) o->value()-1;
  906. partuigroup->remove(partui);
  907. delete partui;
  908. partui=new PartUI(0,0,765,525);
  909. partuigroup->add(partui);
  910. partui->init(master->part[nval],master,nval,bankui);
  911. partui->redraw();
  912. o->redraw();
  913. npart=nval;
  914. updatepanel();
  915. simplenpartcounter->value(nval+1);
  916. simplenpartcounter->do_callback();}
  917. tooltip {The part number} xywh {5 312 50 18} type Simple labelfont 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  918. code0 {o->bounds(1,NUM_MIDI_PARTS);}
  919. code1 {bankui->init(o);}
  920. }
  921. Fl_Button {} {
  922. label vK
  923. callback {virkeyboard->show();}
  924. tooltip {Virtual Keyboard} xywh {280 87 40 23} color 51 labelfont 1
  925. }
  926. Fl_Group {} {open
  927. xywh {85 32 55 110} box UP_FRAME
  928. } {
  929. Fl_Button {} {
  930. label Reset
  931. callback {globalfinedetuneslider->value(64.0);
  932. globalfinedetuneslider->do_callback();}
  933. tooltip {Master fine detune reset} xywh {90 37 45 23} box THIN_UP_BOX labelsize 10
  934. }
  935. Fl_Dial globalfinedetuneslider {
  936. label {Fine Detune}
  937. callback {master->microtonal.Pglobalfinedetune=(int) o->value();}
  938. tooltip {global fine detune} xywh {90 68 45 45} box ROUND_UP_BOX labelsize 9 align 130 maximum 127 step 1 value 64
  939. code0 {o->value(master->microtonal.Pglobalfinedetune);}
  940. class WidgetPDial
  941. }
  942. }
  943. Fl_Button {} {
  944. label {Panel Window}
  945. callback {updatepanel();
  946. panelwindow->show();}
  947. tooltip {Panel Window} xywh {280 112 105 23} color 51 labelfont 1 labelsize 10
  948. }
  949. Fl_Button sm_indicator1 {
  950. label SM
  951. xywh {350 5 35 15} box ROUNDED_BOX down_box ROUNDED_BOX color 45 selection_color 93 labelfont 3 labelcolor 39 deactivate
  952. }
  953. }
  954. Fl_Window aboutwindow {
  955. label {Copyright...}
  956. xywh {411 344 365 280} type Double hide
  957. } {
  958. Fl_Box {} {
  959. label {Copyright (c) 2002-2009 Nasca O. PAUL and others. Please read AUTHORS.txt}
  960. xywh {15 35 335 55} labeltype EMBOSSED_LABEL labelsize 15 align 208
  961. }
  962. Fl_Box {} {
  963. label {This is free software; you may redistribute it and/or modify it under the terms of the
  964. version 2 (or any later version) of the GNU General Public License as published by the Free Software Fundation.
  965. This program comes with
  966. ABSOLUTELY NO WARRANTY.
  967. See the version 2 (or any later version) of the
  968. GNU General Public License for details.}
  969. xywh {15 90 335 145} labelfont 1 labelsize 11 align 144
  970. }
  971. Fl_Button {} {
  972. label {Close this window}
  973. callback {aboutwindow->hide();}
  974. xywh {80 245 190 25} box THIN_UP_BOX labelsize 11
  975. }
  976. Fl_Box {} {
  977. label ZynAddSubFX
  978. xywh {15 5 335 30} labeltype EMBOSSED_LABEL labelfont 1 labelsize 20 align 16
  979. }
  980. }
  981. Fl_Window syseffsendwindow {
  982. label {System Effects Send}
  983. xywh {171 234 120 250} type Double hide resizable
  984. } {
  985. Fl_Scroll {} {open
  986. xywh {0 45 120 170} box FLAT_BOX resizable
  987. code0 {for (int neff1=0;neff1<NUM_SYS_EFX;neff1++) for (int neff2=neff1+1;neff2<NUM_SYS_EFX;neff2++)}
  988. code1 {{syseffsend[neff1][neff2]=new SysEffSend(o->x()+(neff2-1)*35,o->y()+15+neff1*50,30,30);syseffsend[neff1][neff2]->label("aaa");syseffsend[neff1][neff2]->init(master,neff1,neff2);};}
  989. } {}
  990. Fl_Button {} {
  991. label Close
  992. callback {syseffsendwindow->hide();}
  993. xywh {25 220 80 25} box THIN_UP_BOX
  994. }
  995. Fl_Box {} {
  996. label {Send system effect's output to other system effects}
  997. xywh {5 5 110 35} labelsize 10 align 192
  998. }
  999. }
  1000. Fl_Window panelwindow {
  1001. label {ZynAddSubFX Panel}
  1002. xywh {89 59 630 635} type Double hide
  1003. } {
  1004. Fl_Scroll {} {
  1005. xywh {0 5 570 310} type HORIZONTAL box THIN_UP_BOX
  1006. } {
  1007. Fl_Pack {} {
  1008. xywh {5 10 560 285} type HORIZONTAL
  1009. code0 {for (int i=0;i<NUM_MIDI_PARTS/2;i++){panellistitem[i]=new Panellistitem(0,0,70,260,"");panellistitem[i]->init(master,i,bankui);}}
  1010. } {}
  1011. }
  1012. Fl_Scroll {} {
  1013. xywh {0 320 570 310} type HORIZONTAL box THIN_UP_BOX
  1014. } {
  1015. Fl_Pack {} {
  1016. xywh {5 325 560 285} type HORIZONTAL
  1017. code0 {for (int i=NUM_MIDI_PARTS/2;i<NUM_MIDI_PARTS;i++){panellistitem[i]=new Panellistitem(0,0,70,260,"");panellistitem[i]->init(master,i,bankui);}}
  1018. } {}
  1019. }
  1020. Fl_Button {} {
  1021. label Close
  1022. callback {panelwindow->hide();
  1023. updatepanel();}
  1024. xywh {575 605 50 25} box THIN_UP_BOX labelsize 13
  1025. }
  1026. Fl_Button {} {
  1027. label Refresh
  1028. callback {updatepanel();}
  1029. xywh {575 570 55 25} box THIN_UP_BOX labelsize 13
  1030. }
  1031. }
  1032. Fl_Window simplemasterwindow {
  1033. label ZynAddSubFX
  1034. callback {\#ifdef VSTAUDIOOUT
  1035. fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. Please use the host aplication to close it.");
  1036. \#else
  1037. if (fl_choice("Exit and leave the unsaved data?","No","Yes",NULL)) {
  1038. config.save();
  1039. *exitprogram=1;
  1040. };
  1041. \#endif} open
  1042. xywh {280 239 600 335} type Double align 80 visible
  1043. } {
  1044. Fl_Menu_Bar simplemastermenu {
  1045. xywh {0 0 690 25}
  1046. } {
  1047. Submenu {} {
  1048. label {&File}
  1049. xywh {10 10 100 20}
  1050. } {
  1051. MenuItem {} {
  1052. label {&New (erase all)...}
  1053. callback {do_new_master();}
  1054. xywh {30 30 100 20}
  1055. }
  1056. MenuItem {} {
  1057. label {&Open Parameters...}
  1058. callback {do_load_master();}
  1059. xywh {30 30 100 20}
  1060. }
  1061. MenuItem {} {
  1062. label {&Save All Parameters...}
  1063. callback {\#if USE_NSM
  1064. if ( nsm && nsm->is_active() )
  1065. {
  1066. do_save_master( nsm->project_filename );
  1067. }
  1068. else
  1069. \#endif
  1070. {
  1071. do_save_master();
  1072. }}
  1073. xywh {20 20 100 20} divider
  1074. }
  1075. MenuItem {} {
  1076. label {&Settings...}
  1077. callback {configui->show();}
  1078. xywh {35 35 100 20} divider
  1079. }
  1080. MenuItem {} {
  1081. label {&Copyright...}
  1082. callback {aboutwindow->show();}
  1083. xywh {25 25 100 20} divider
  1084. }
  1085. MenuItem {} {
  1086. label {E&xit}
  1087. callback {masterwindow->do_callback();}
  1088. xywh {20 20 100 20}
  1089. }
  1090. }
  1091. Submenu {} {
  1092. label {&Instrument}
  1093. xywh {20 20 100 20}
  1094. } {
  1095. MenuItem {} {
  1096. label {&Open Instrument...}
  1097. callback {const char *filename;
  1098. filename=fl_file_chooser("Load:","({*.xiz})",NULL,0);
  1099. if (filename==NULL) return;
  1100. pthread_mutex_lock(&master->mutex);
  1101. // int npart=(int)npartcounter->value()-1;
  1102. //clear all instrument parameters, first
  1103. master->part[npart]->defaultsinstrument();
  1104. //load the instr. parameters
  1105. int result=master->part[npart]->loadXMLinstrument(filename);
  1106. pthread_mutex_unlock(&master->mutex);
  1107. master->part[npart]->applyparameters();
  1108. simplenpartcounter->do_callback();
  1109. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not an instrument file.");
  1110. else if (result<0) fl_alert("Error: Could not load the file.");}
  1111. xywh {40 40 100 20}
  1112. }
  1113. MenuItem {} {
  1114. label {Show Instrument &Bank...}
  1115. callback {bankui->show();}
  1116. xywh {10 10 100 20} divider
  1117. }
  1118. }
  1119. Submenu {} {
  1120. label Misc
  1121. xywh {0 0 100 20}
  1122. } {
  1123. MenuItem {} {
  1124. label {Switch User Interface Mode}
  1125. callback {if (fl_choice("Switch the User Interface to Advanced mode ?","No","Yes",NULL)){
  1126. simplemasterwindow->hide();
  1127. refresh_master_ui();
  1128. masterwindow->show();
  1129. config.cfg.UserInterfaceMode=1;
  1130. };}
  1131. xywh {0 0 100 20}
  1132. }
  1133. }
  1134. }
  1135. Fl_Group simplelistitemgroup {open
  1136. private xywh {125 65 215 145} box UP_FRAME
  1137. code0 {if (master->part[npart]->Penabled==0) o->deactivate();}
  1138. } {
  1139. Fl_Button partname {
  1140. callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  1141. bankui->cbwig->value(npart+1);
  1142. bankui->cbwig->do_callback();
  1143. };
  1144. bankui->show();}
  1145. xywh {130 72 205 18} box THIN_DOWN_BOX down_box FLAT_BOX color 50 labelfont 1 labelsize 11 align 208
  1146. }
  1147. Fl_Slider partpanning {
  1148. label Pan
  1149. callback {master->part[npart]->setPpanning((int) o->value());}
  1150. xywh {185 95 145 15} type {Horz Knob} box NO_BOX labelsize 11 maximum 127 step 1 value 64
  1151. code0 {o->value(master->part[npart]->Ppanning);}
  1152. }
  1153. Fl_Choice partrcv {
  1154. label {Midi Channel Receive}
  1155. callback {virkeys->relaseallkeys(0);
  1156. master->part[npart]->Prcvchn=(int) o->value();
  1157. virkeys->midich=(int) o->value();} open
  1158. tooltip {receive from Midi channel} xywh {140 157 65 18} down_box BORDER_BOX labelsize 10 align 130 textfont 1
  1159. code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Ch%d",i+1);if (i!=9) o->add(nrstr); else o->add("Dr10");};}
  1160. code1 {o->value(master->part[npart]->Prcvchn);}
  1161. } {}
  1162. Fl_Dial partvolume {
  1163. callback {master->part[npart]->setPvolume((int) o->value());}
  1164. xywh {135 95 45 40} labelsize 9 maximum 127 step 1
  1165. code0 {o->value(master->part[npart]->Pvolume);}
  1166. class WidgetPDial
  1167. }
  1168. Fl_Box {} {
  1169. label Volume
  1170. xywh {130 130 55 20} labelsize 10
  1171. }
  1172. Fl_Check_Button simplepartportamento {
  1173. label Portamento
  1174. callback {master->part[npart]->ctl.portamento.portamento=(int) o->value();}
  1175. tooltip {Enable/Disable the portamento} xywh {193 127 79 23} down_box DOWN_BOX labelsize 9
  1176. code0 {o->value(master->part[npart]->ctl.portamento.portamento);}
  1177. }
  1178. Fl_Counter simpleminkcounter {
  1179. label {Min.key}
  1180. callback {master->part[npart]->Pminkey=(int) o->value();
  1181. if (master->part[npart]->Pminkey>master->part[npart]->Pmaxkey) o->textcolor(FL_RED);
  1182. else o->textcolor(FL_BLACK);}
  1183. tooltip {Minimum key (that the part receives NoteOn messages)} xywh {210 158 40 15} type Simple labelsize 10 minimum 0 maximum 127 step 1 textsize 10
  1184. code0 {o->value(master->part[npart]->Pminkey);}
  1185. }
  1186. Fl_Counter simplemaxkcounter {
  1187. label {Max.key}
  1188. callback {master->part[npart]->Pmaxkey=(int) o->value();
  1189. if (master->part[npart]->Pminkey>master->part[npart]->Pmaxkey) o->textcolor(FL_RED);
  1190. else o->textcolor(FL_BLACK);}
  1191. tooltip {Maximum key (that the part receives NoteOn messages)} xywh {255 158 40 15} type Simple labelsize 10 minimum 0 maximum 127 step 1 textsize 10
  1192. code0 {o->value(master->part[npart]->Pmaxkey);}
  1193. }
  1194. Fl_Button {} {
  1195. label m
  1196. callback {if (master->part[npart]->lastnote>=0) simpleminkcounter->value(master->part[npart]->lastnote);
  1197. simpleminkcounter->do_callback();
  1198. simplemaxkcounter->do_callback();}
  1199. tooltip {set the minimum key to the last pressed key} xywh {230 188 15 12} box THIN_UP_BOX labelsize 10
  1200. }
  1201. Fl_Button {} {
  1202. label M
  1203. callback {if (master->part[npart]->lastnote>=0) simplemaxkcounter->value(master->part[npart]->lastnote);
  1204. simplemaxkcounter->do_callback();
  1205. simpleminkcounter->do_callback();}
  1206. tooltip {set the maximum key to the last pressed key} xywh {260 188 15 12} box THIN_UP_BOX labelsize 10
  1207. }
  1208. Fl_Button {} {
  1209. label R
  1210. callback {simpleminkcounter->value(0);
  1211. simpleminkcounter->do_callback();
  1212. simplemaxkcounter->value(127);
  1213. simplemaxkcounter->do_callback();}
  1214. tooltip {reset the minimum key to 0 and maximum key to 127} xywh {245 188 15 12} box THIN_UP_BOX labelfont 1 labelsize 10
  1215. }
  1216. Fl_Counter simplepartkeyshiftcounter {
  1217. label KeyShift
  1218. callback {master->part[npart]->Pkeyshift=(int) o->value()+64;}
  1219. xywh {280 120 50 20} type Simple labelsize 11 minimum -64 maximum 64 step 1
  1220. code0 {o->lstep(12);}
  1221. code1 {o->value(master->part[npart]->Pkeyshift-64);}
  1222. }
  1223. Fl_Dial simplesyseffsend {
  1224. callback {master->setPsysefxvol(npart,nsyseff,(int) o->value());}
  1225. xywh {300 160 30 30} maximum 127 step 1
  1226. class WidgetPDial
  1227. }
  1228. Fl_Box {} {
  1229. label Effect
  1230. xywh {295 190 40 15} labelsize 10
  1231. }
  1232. }
  1233. Fl_Check_Button partenabled {
  1234. label Enabled
  1235. callback {pthread_mutex_lock(&master->mutex);
  1236. master->partonoff(npart,(int) o->value());
  1237. pthread_mutex_unlock(&master->mutex);
  1238. if ((int) o->value()==0) simplelistitemgroup->deactivate();
  1239. else {
  1240. simplelistitemgroup->activate();
  1241. if ((int)bankui->cbwig->value()!=(npart+1)){
  1242. bankui->cbwig->value(npart+1);
  1243. bankui->cbwig->do_callback();
  1244. };
  1245. };
  1246. o->redraw();}
  1247. private xywh {250 40 85 20} down_box DOWN_BOX labeltype EMBOSSED_LABEL labelfont 1 labelsize 13 align 24
  1248. code0 {//char tmp[10];snprintf(tmp,10,"%d",npart+1);o->copy_label(tmp);}
  1249. code1 {o->value(master->part[npart]->Penabled);}
  1250. }
  1251. Fl_Box virkeys {
  1252. label Keyboard
  1253. xywh {5 215 590 80} box BORDER_BOX color 17
  1254. code0 {o->init(master);}
  1255. class VirKeys
  1256. }
  1257. Fl_Group {} {open
  1258. xywh {340 30 255 185}
  1259. } {
  1260. Fl_Tabs {} {open
  1261. xywh {345 35 245 175} box UP_FRAME align 18
  1262. } {
  1263. Fl_Group {} {
  1264. label {System Effects} open
  1265. xywh {345 55 245 155} box UP_FRAME labelfont 1 labelsize 12 align 18
  1266. } {
  1267. Fl_Counter simplesyseffnocounter {
  1268. label {Sys.Effect No.}
  1269. callback {nsyseff=(int) o->value()-1;
  1270. simplesysefftype->value(master->sysefx[nsyseff]->geteffect());
  1271. simplesyseffectui->refresh(master->sysefx[nsyseff]);
  1272. simplerefresh();}
  1273. xywh {350 75 80 20} type Simple labelfont 1 labelsize 10 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  1274. code0 {o->bounds(1,NUM_SYS_EFX);}
  1275. code1 {o->value(nsyseff+1);}
  1276. }
  1277. Fl_Choice simplesysefftype {
  1278. label EffType
  1279. callback {pthread_mutex_lock(&master->mutex);
  1280. master->sysefx[nsyseff]->changeeffect((int) o->value());
  1281. pthread_mutex_unlock(&master->mutex);
  1282. simplesyseffectui->refresh(master->sysefx[nsyseff]);}
  1283. xywh {515 80 70 15} down_box BORDER_BOX labelsize 10 align 5
  1284. code0 {o->value(master->sysefx[nsyseff]->geteffect());}
  1285. } {
  1286. MenuItem {} {
  1287. label {No Effect}
  1288. xywh {20 20 100 20} labelfont 1 labelsize 10
  1289. }
  1290. MenuItem {} {
  1291. label Reverb
  1292. xywh {30 30 100 20} labelfont 1 labelsize 10
  1293. }
  1294. MenuItem {} {
  1295. label Echo
  1296. xywh {40 40 100 20} labelfont 1 labelsize 10
  1297. }
  1298. MenuItem {} {
  1299. label Chorus
  1300. xywh {50 50 100 20} labelfont 1 labelsize 10
  1301. }
  1302. MenuItem {} {
  1303. label Phaser
  1304. xywh {60 60 100 20} labelfont 1 labelsize 10
  1305. }
  1306. MenuItem {} {
  1307. label AlienWah
  1308. xywh {70 70 100 20} labelfont 1 labelsize 10
  1309. }
  1310. MenuItem {} {
  1311. label Distortion
  1312. xywh {80 80 100 20} labelfont 1 labelsize 10
  1313. }
  1314. MenuItem {} {
  1315. label EQ
  1316. xywh {90 90 100 20} labelfont 1 labelsize 10
  1317. }
  1318. MenuItem {} {
  1319. label DynFilter
  1320. xywh {100 100 100 20} labelfont 1 labelsize 10
  1321. }
  1322. }
  1323. Fl_Group simplesyseffectuigroup {open
  1324. xywh {350 95 235 95} color 48
  1325. } {
  1326. Fl_Group simplesyseffectui {
  1327. xywh {350 95 234 95}
  1328. code0 {o->init(master->sysefx[nsyseff]);}
  1329. class SimpleEffUI
  1330. } {}
  1331. }
  1332. Fl_Button {} {
  1333. label {Send to...}
  1334. callback {syseffsendwindow->show();}
  1335. xywh {435 75 75 20} box THIN_UP_BOX labelfont 1 labelsize 11
  1336. }
  1337. Fl_Button {} {
  1338. label P
  1339. callback {pthread_mutex_lock(&master->mutex);
  1340. presetsui->paste(master->sysefx[nsyseff],simplesyseffectui);
  1341. pthread_mutex_unlock(&master->mutex);}
  1342. xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  1343. }
  1344. }
  1345. Fl_Group {} {
  1346. label {Insertion Effects}
  1347. xywh {345 55 245 155} box UP_FRAME labelfont 1 labelsize 12 align 18 hide
  1348. } {
  1349. Fl_Counter simpleinseffnocounter {
  1350. label {Ins.Effect No.}
  1351. callback {ninseff=(int) o->value()-1;
  1352. simpleinsefftype->value(master->insefx[ninseff]->geteffect());
  1353. simpleinseffpart->value(master->Pinsparts[ninseff]+2);
  1354. simpleinseffectui->refresh(master->insefx[ninseff]);
  1355. if (master->Pinsparts[ninseff]!=-1) {
  1356. simpleinsefftype->activate();
  1357. simpleinseffectui->activate();
  1358. simpleinseffectuigroup->activate();
  1359. } else {
  1360. simpleinsefftype->deactivate();
  1361. simpleinseffectui->deactivate();
  1362. simpleinseffectuigroup->deactivate();
  1363. };}
  1364. xywh {350 75 80 20} type Simple labelfont 1 labelsize 10 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  1365. code0 {o->bounds(1,NUM_INS_EFX);}
  1366. code1 {o->value(ninseff+1);}
  1367. }
  1368. Fl_Choice simpleinsefftype {
  1369. label EffType
  1370. callback {pthread_mutex_lock(&master->mutex);
  1371. master->insefx[ninseff]->changeeffect((int) o->value());
  1372. pthread_mutex_unlock(&master->mutex);
  1373. simpleinseffectui->refresh(master->insefx[ninseff]);
  1374. simpleinseffectui->show();}
  1375. xywh {515 80 70 15} down_box BORDER_BOX labelsize 10 align 5
  1376. code0 {o->value(master->insefx[ninseff]->geteffect());}
  1377. code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  1378. } {
  1379. MenuItem {} {
  1380. label {No Effect}
  1381. xywh {35 35 100 20} labelfont 1 labelsize 10
  1382. }
  1383. MenuItem {} {
  1384. label Reverb
  1385. xywh {45 45 100 20} labelfont 1 labelsize 10
  1386. }
  1387. MenuItem {} {
  1388. label Echo
  1389. xywh {55 55 100 20} labelfont 1 labelsize 10
  1390. }
  1391. MenuItem {} {
  1392. label Chorus
  1393. xywh {65 65 100 20} labelfont 1 labelsize 10
  1394. }
  1395. MenuItem {} {
  1396. label Phaser
  1397. xywh {70 70 100 20} labelfont 1 labelsize 10
  1398. }
  1399. MenuItem {} {
  1400. label AlienWah
  1401. xywh {80 80 100 20} labelfont 1 labelsize 10
  1402. }
  1403. MenuItem {} {
  1404. label Distortion
  1405. xywh {90 90 100 20} labelfont 1 labelsize 10
  1406. }
  1407. MenuItem {} {
  1408. label EQ
  1409. xywh {100 100 100 20} labelfont 1 labelsize 10
  1410. }
  1411. MenuItem {} {
  1412. label DynFilter
  1413. xywh {110 110 100 20} labelfont 1 labelsize 10
  1414. }
  1415. }
  1416. Fl_Group simpleinseffectuigroup {
  1417. xywh {350 95 234 95} box FLAT_BOX color 48
  1418. } {
  1419. Fl_Group simpleinseffectui {
  1420. xywh {350 95 234 95}
  1421. code0 {o->init(master->insefx[ninseff]);}
  1422. code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  1423. class SimpleEffUI
  1424. } {}
  1425. }
  1426. Fl_Choice simpleinseffpart {
  1427. label {Insert To.}
  1428. callback {master->Pinsparts[ninseff]=(int) o->value()-2;
  1429. if ((int) o->value()==1){
  1430. simpleinseffectuigroup->deactivate();
  1431. simpleinsefftype->deactivate();
  1432. simpleinseffectui->deactivate();
  1433. } else {
  1434. simpleinseffectuigroup->activate();
  1435. simpleinsefftype->activate();
  1436. simpleinseffectui->activate();
  1437. };
  1438. master->insefx[ninseff]->cleanup();} open
  1439. xywh {435 75 80 20} down_box BORDER_BOX labelfont 1 labelsize 10 align 5 textsize 10
  1440. code0 {o->add("Master Out");o->add("Off");}
  1441. code1 {char tmp[50]; for (int i=0;i<NUM_MIDI_PARTS;i++) {sprintf(tmp,"Part %2d",i+1);o->add(tmp);};}
  1442. code3 {o->value(master->Pinsparts[ninseff]+2);}
  1443. } {}
  1444. Fl_Button {} {
  1445. label P
  1446. callback {pthread_mutex_lock(&master->mutex);
  1447. presetsui->paste(master->insefx[ninseff],simpleinseffectui);
  1448. pthread_mutex_unlock(&master->mutex);}
  1449. xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 7
  1450. }
  1451. }
  1452. }
  1453. }
  1454. Fl_Group {} {open
  1455. xywh {5 300 590 30} box ENGRAVED_FRAME
  1456. } {
  1457. Fl_Box {} {
  1458. label {VU-Meter}
  1459. xywh {5 300 590 30} box FLAT_BOX color 41 selection_color 75
  1460. code0 {o->init(master,-1);}
  1461. class VUMeter
  1462. }
  1463. }
  1464. Fl_Dial simplemastervolumedial {
  1465. label {Master Volume}
  1466. callback {master->setPvolume((int) o->value());}
  1467. tooltip {Master Volume} xywh {10 35 40 40} box ROUND_UP_BOX labelfont 1 labelsize 11 align 130 maximum 127 step 1
  1468. code0 {o->value(master->Pvolume);}
  1469. class WidgetPDial
  1470. }
  1471. Fl_Counter simplemasterkeyshiftcounter {
  1472. label {Master KeyShift}
  1473. callback {master->setPkeyshift((int) o->value()+64);}
  1474. xywh {15 110 90 20} labelsize 11 minimum -64 maximum 64 step 1
  1475. code0 {o->lstep(12);}
  1476. code1 {o->value(master->Pkeyshift-64);}
  1477. }
  1478. Fl_Button {} {
  1479. label {Stop ALL sounds!}
  1480. callback {virkeyboard->relaseallkeys();
  1481. pthread_mutex_lock(&master->mutex);
  1482. master->shutup=1;
  1483. pthread_mutex_unlock(&master->mutex);}
  1484. xywh {5 149 115 31} color 90 labelfont 1 labelsize 10
  1485. }
  1486. Fl_Button {} {
  1487. label Reset
  1488. callback {simpleglobalfinedetuneslider->value(64.0);
  1489. simpleglobalfinedetuneslider->do_callback();}
  1490. tooltip {Master fine detune reset} xywh {70 30 50 17} box THIN_UP_BOX labelsize 11 align 128
  1491. }
  1492. Fl_Dial simpleglobalfinedetuneslider {
  1493. label {Fine Detune}
  1494. callback {master->microtonal.Pglobalfinedetune=(int) o->value();}
  1495. tooltip {global fine detune} xywh {80 50 30 30} box ROUND_UP_BOX labelsize 11 align 130 maximum 127 step 1 value 64
  1496. code0 {o->value(master->microtonal.Pglobalfinedetune);}
  1497. class WidgetPDial
  1498. }
  1499. Fl_Counter simplenpartcounter {
  1500. label Part
  1501. callback {virkeys->relaseallkeys(0);
  1502. npartcounter->value(o->value());
  1503. npart=(int) o->value()-1;
  1504. simplerefresh();
  1505. virkeys->midich=master->part[npart]->Prcvchn;}
  1506. tooltip {The part number} xywh {170 40 70 20} type Simple labelfont 1 align 4 minimum 0 maximum 127 step 1 value 1 textfont 1
  1507. code0 {o->bounds(1,NUM_MIDI_PARTS);}
  1508. }
  1509. Fl_Counter {} {
  1510. label {Keyb.Oct.}
  1511. callback {virkeys->relaseallkeys(0);
  1512. virkeys->midioct=(int) o->value();
  1513. virkeys->take_focus();}
  1514. tooltip {Midi Octave} xywh {5 190 55 20} type Simple labelsize 11 align 8 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 11
  1515. code0 {o->value(virkeys->midioct);}
  1516. }
  1517. Fl_Button sm_indicator2 {
  1518. label SM
  1519. xywh {560 5 35 15} box ROUNDED_BOX down_box ROUNDED_BOX color 45 selection_color 93 labelfont 3 labelcolor 39 deactivate
  1520. }
  1521. }
  1522. Fl_Window selectuiwindow {
  1523. label {User Interface mode}
  1524. callback {*exitprogram=1;}
  1525. xywh {342 246 430 250} type Double hide non_modal
  1526. } {
  1527. Fl_Box {} {
  1528. label {Welcome to ZynAddSubFX}
  1529. xywh {5 5 425 40} labeltype SHADOW_LABEL labelfont 1 labelsize 26
  1530. }
  1531. Fl_Box {} {
  1532. label {Please choose the interface mode:}
  1533. xywh {10 50 265 25} labelfont 1 labelsize 13
  1534. }
  1535. Fl_Button {} {
  1536. label Advanced
  1537. callback {config.cfg.UserInterfaceMode=1;
  1538. masterwindow->show();
  1539. selectuiwindow->hide();}
  1540. xywh {10 165 100 35} color 229 labelfont 1 labelsize 16
  1541. }
  1542. Fl_Box {} {
  1543. label {.. if you have used ZynAddSubFX before, or you like to have full controll to all parameters.}
  1544. xywh {110 165 310 35} labelfont 1 labelsize 11 align 144
  1545. }
  1546. Fl_Button {} {
  1547. label Beginner
  1548. callback {simplemasterwindow->show();
  1549. selectuiwindow->hide();
  1550. config.cfg.UserInterfaceMode=2;}
  1551. xywh {10 80 100 65} color 238 labelfont 1 labelsize 16
  1552. }
  1553. Fl_Box {} {
  1554. label {..if you are a beginner, you prefer using presets or you prefer to use simpler user interfaces. Most functionality of ZynAddSubFX will be hidden in this mode to make simple the learning/using it.}
  1555. xywh {110 75 320 75} labelfont 1 labelsize 11 align 144
  1556. }
  1557. Fl_Box {} {
  1558. label {You can switch the interface modes anytime you want.}
  1559. xywh {30 215 360 25} box BORDER_BOX color 51 labelfont 1 labelsize 11 align 144
  1560. }
  1561. }
  1562. }
  1563. Function {updatesendwindow()} {} {
  1564. code {for (int neff1=0;neff1<NUM_SYS_EFX;neff1++)
  1565. for (int neff2=neff1+1;neff2<NUM_SYS_EFX;neff2++)
  1566. syseffsend[neff1][neff2]->value(master->Psysefxsend[neff1][neff2]);} {}
  1567. }
  1568. Function {updatepanel()} {} {
  1569. code {for (int npart=0;npart<NUM_MIDI_PARTS;npart++){
  1570. panellistitem[npart]->refresh();
  1571. };} {}
  1572. }
  1573. Function {setfilelabel(const char *filename)} {} {
  1574. code {if (filename!=NULL) snprintf(&masterwindowlabel[0],100,"%s - ZynAddSubFX",fl_filename_name(filename));
  1575. else snprintf(&masterwindowlabel[0],100,"%s","ZynAddSubFX");
  1576. masterwindowlabel[99]='\\0';
  1577. masterwindow->label(&masterwindowlabel[0]);
  1578. simplemasterwindow->label(&masterwindowlabel[0]);} {}
  1579. }
  1580. Function {MasterUI(Master *master_,int *exitprogram_)} {} {
  1581. code {master=master_;
  1582. exitprogram=exitprogram_;
  1583. ninseff=0;
  1584. nsyseff=0;
  1585. npart=0;
  1586. for (int i=0;i<NUM_SYS_EFX;i++)
  1587. for (int j=0;j<NUM_SYS_EFX;j++)
  1588. syseffsend[i][j]=NULL;
  1589. microtonalui=new MicrotonalUI(&master->microtonal);
  1590. virkeyboard=new VirKeyboard(master);
  1591. bankui=new BankUI(master,&npart);
  1592. configui=new ConfigUI();
  1593. make_window();
  1594. presetsui=new PresetsUI();
  1595. setfilelabel(NULL);
  1596. swapefftype=0;
  1597. simplerefresh();} {}
  1598. }
  1599. Function {~MasterUI()} {} {
  1600. code {masterwindow->hide();
  1601. delete masterwindow;
  1602. simplemasterwindow->hide();
  1603. delete simplemasterwindow;
  1604. aboutwindow->hide();
  1605. delete aboutwindow;
  1606. syseffsendwindow->hide();
  1607. delete syseffsendwindow;
  1608. delete virkeyboard;
  1609. delete microtonalui;
  1610. delete bankui;
  1611. delete configui;
  1612. delete presetsui;
  1613. delete panelwindow;
  1614. delete selectuiwindow;} {}
  1615. }
  1616. Function {showUI()} {} {
  1617. code {switch (config.cfg.UserInterfaceMode){
  1618. case 0:selectuiwindow->show();
  1619. break;
  1620. case 1:masterwindow->show();
  1621. break;
  1622. case 2:simplemasterwindow->show();
  1623. break;
  1624. };} {}
  1625. }
  1626. Function {simplerefresh()} {} {
  1627. code {partenabled->value(master->part[npart]->Penabled);
  1628. if (master->part[npart]->Penabled!=0) simplelistitemgroup->activate();
  1629. else simplelistitemgroup->deactivate();
  1630. partvolume->value(master->part[npart]->Pvolume);
  1631. partpanning->value(master->part[npart]->Ppanning);
  1632. partrcv->value(master->part[npart]->Prcvchn);
  1633. if (master->part[npart]->Pname[0]!=0) partname->label((char *)master->part[npart]->Pname);
  1634. else partname->label("Click here to load a instrument");
  1635. simplelistitemgroup->redraw();
  1636. simplepartportamento->value(master->part[npart]->ctl.portamento.portamento);
  1637. simpleminkcounter->value(master->part[npart]->Pminkey);
  1638. simplemaxkcounter->value(master->part[npart]->Pmaxkey);
  1639. simplepartkeyshiftcounter->value(master->part[npart]->Pkeyshift-64);
  1640. simplesyseffsend->value(master->Psysefxvol[nsyseff][npart]);} {}
  1641. }
  1642. Function {do_new_master_unconditional()} {} {
  1643. code {delete microtonalui;
  1644. pthread_mutex_lock(&master->mutex);
  1645. master->defaults();
  1646. pthread_mutex_unlock(&master->mutex);
  1647. npartcounter->value(1);
  1648. refresh_master_ui();
  1649. updatepanel();} {}
  1650. }
  1651. Function {do_new_master()} {} {
  1652. code {if (fl_choice("Clear *ALL* the parameters ?","No","Yes",NULL)){
  1653. do_new_master_unconditional();
  1654. }} {}
  1655. }
  1656. Function {do_load_master_unconditional(const char *filename, const char *display_name)} {return_type int
  1657. } {
  1658. code {pthread_mutex_lock(&master->mutex);
  1659. //clear all parameters
  1660. master->defaults();
  1661. //load the data
  1662. int result=master->loadXML(filename);
  1663. master->applyparameters(false);
  1664. pthread_mutex_unlock(&master->mutex);
  1665. npartcounter->value(1);
  1666. refresh_master_ui();
  1667. updatepanel();
  1668. if (result>=0) setfilelabel(display_name);
  1669. return result;} {}
  1670. }
  1671. Function {do_load_master(const char* file = NULL)} {} {
  1672. code {const char *filename;
  1673. if (file == NULL) {
  1674. filename=fl_file_chooser("Open:","({*.xmz})",NULL,0);
  1675. if (filename==NULL) return;
  1676. }
  1677. else {
  1678. filename = file;
  1679. }
  1680. int result = do_load_master_unconditional( filename, filename );
  1681. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not a zynaddsubfx parameters file.");
  1682. else if (result<0) fl_alert("Error: Could not load the file.");} {}
  1683. }
  1684. Function {do_save_master(const char* file = NULL)} {} {
  1685. code {const char *filename;
  1686. char *tmp;
  1687. int result=0;
  1688. if (file == NULL) {
  1689. tmp=fl_file_chooser("Save:","({*.xmz})",NULL,0);
  1690. if (tmp==NULL) return;
  1691. tmp=fl_filename_setext(tmp,".xmz");
  1692. filename=tmp;
  1693. result=fileexists(tmp);
  1694. if (result) {
  1695. result=0;
  1696. if (!fl_choice("The file exists. Overwrite it?","No","Yes",NULL)) return;
  1697. }
  1698. }
  1699. else {
  1700. filename = file;
  1701. }
  1702. pthread_mutex_lock(&master->mutex);
  1703. result=master->saveXML(filename);
  1704. pthread_mutex_unlock(&master->mutex);
  1705. if (result<0) fl_alert("Error: Could not save the file.");
  1706. else
  1707. {
  1708. \#if USE_NSM
  1709. if ( nsm && nsm->is_active() )
  1710. setfilelabel( nsm->display_name );
  1711. else
  1712. \#endif
  1713. setfilelabel(filename);
  1714. }
  1715. updatepanel();} {}
  1716. }
  1717. Function {refresh_master_ui()} {} {
  1718. code {ninseff=0;
  1719. nsyseff=0;
  1720. npart=0;
  1721. //the Master UI
  1722. npartcounter->do_callback();
  1723. syseffnocounter->do_callback();
  1724. inseffnocounter->do_callback();
  1725. masterkeyshiftcounter->value(master->Pkeyshift-64);
  1726. mastervolumedial->value(master->Pvolume);
  1727. globalfinedetuneslider->value(master->microtonal.Pglobalfinedetune);
  1728. microtonalui=new MicrotonalUI(&master->microtonal);
  1729. nrpnbutton->value(master->ctl.NRPN.receive);
  1730. updatesendwindow();
  1731. updatepanel();
  1732. //the simle MasterUI
  1733. simplenpartcounter->value(1);
  1734. simplesyseffnocounter->value(1);
  1735. simpleinseffnocounter->value(1);
  1736. simplenpartcounter->do_callback();
  1737. simplesyseffnocounter->do_callback();
  1738. simpleinseffnocounter->do_callback();
  1739. simplemasterkeyshiftcounter->value(master->Pkeyshift-64);
  1740. simplemastervolumedial->value(master->Pvolume);
  1741. simpleglobalfinedetuneslider->value(master->microtonal.Pglobalfinedetune);
  1742. virkeys->midich=master->part[npart]->Prcvchn;
  1743. simplerefresh();
  1744. bankui->hide();} {}
  1745. }
  1746. decl {Master *master;} {private local
  1747. }
  1748. decl {MicrotonalUI *microtonalui;} {private local
  1749. }
  1750. decl {BankUI *bankui;} {private local
  1751. }
  1752. decl {int ninseff,npart;} {private local
  1753. }
  1754. decl {int nsyseff;} {private local
  1755. }
  1756. decl {int *exitprogram;} {private local
  1757. }
  1758. decl {SysEffSend *syseffsend[NUM_SYS_EFX][NUM_SYS_EFX];} {private local
  1759. }
  1760. decl {VirKeyboard *virkeyboard;} {private local
  1761. }
  1762. decl {ConfigUI *configui;} {private local
  1763. }
  1764. decl {int swapefftype;} {private local
  1765. }
  1766. decl {char masterwindowlabel[100];} {private local
  1767. }
  1768. decl {Panellistitem *panellistitem[NUM_MIDI_PARTS];} {private local
  1769. }
  1770. decl {NioUI nioui;} {private local
  1771. }
  1772. }