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.

500 lines
14KB

  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-2005 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 <FL/fl_draw.H>} {public local
  12. }
  13. decl {\#include <FL/Fl_Box.H>} {public local
  14. }
  15. decl {\#include "../globals.h"} {public local
  16. }
  17. decl {\#include "../Misc/Master.h"} {public local
  18. }
  19. decl {\#include "../Misc/Util.h"} {public local
  20. }
  21. decl {\#include "WidgetPDial.h"} {public local
  22. }
  23. decl {\#include "common.H"} {public local
  24. }
  25. decl {\#ifdef NTK_GUI
  26. \#include "FL/Fl_Shared_Image.H"
  27. \#endif} {public local
  28. }
  29. decl {const int keyspos[12]={0,-1,1,-2,2,3,-4,4,-5,5,-6,6};} {private local
  30. }
  31. decl {const int keysoct1qwerty[]={'q','2','w','3','e','r','5','t','6','y','7','u','i','9','o','0','p','[','=',']','\\\\',FL_Enter,0};} {private local
  32. }
  33. decl {const int keysoct2qwerty[]={'z','s','x','d','c','v','g','b','h','n','j','m',',','l','.',';','/',0};} {private local
  34. }
  35. decl {const int keysoct1dw[]={'\\'','2',',','3','.','p','5','y','6','f','7','g','c','9','r','0','l','/',']','=','\\\\',FL_Enter,0};} {private local
  36. }
  37. decl {const int keysoct2dw[]={';','o','q','e','j','k','i','x','d','b','h','m','w','n','v','s','z',0};} {private local
  38. }
  39. decl {const int keysoct1qwertz[]={'q','2','w','3','e','r','5','t','6','z','7','u','i','9','o','0','p',252,'\\'','+','\\\\',FL_Enter,0};} {private local
  40. }
  41. decl {const int keysoct2qwertz[]={'y','s','x','d','c','v','g','b','h','n','j','m',',','l','.',246,'-',0};} {private local
  42. }
  43. decl {const int keysoct1az[]={'a',233,'z','\\"','e','r','(','t','-','y',232,'u','i',231,'o',224,'p',65106,'=','$',0};} {private local
  44. }
  45. decl {const int keysoct2az[]={'w','s','x','d','c','v','g','b','h','n','j',',',';','l',':','m','!',0};} {private local
  46. }
  47. class VirKeys {: {public Fl_Box}
  48. } {
  49. decl {static const int N_OCT=6;} {private local
  50. }
  51. decl {static const int SIZE_WHITE=14;} {private local
  52. }
  53. decl {static const int SIZE_BLACK=8;} {private local
  54. }
  55. Function {VirKeys(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  56. code {master=NULL;} {}
  57. }
  58. Function {init(Master *master_)} {} {
  59. code {master=master_;
  60. for (int i=0;i<N_OCT*12+1;i++) pressed[i]=0;
  61. midich=0;
  62. midivel=100;
  63. midioct=2;
  64. keyoct1=3;
  65. keyoct2=2;
  66. rndvelocity=0;} {}
  67. }
  68. Function {draw()} {} {
  69. code {int ox=x(),oy=y(),lx=w(),ly=h()-1,i;
  70. \#ifdef NTK_GUI
  71. Fl_Image *white_up = Fl_Shared_Image::get( PIXMAP_PATH "white_key.png" );
  72. Fl_Image *white_down = Fl_Shared_Image::get( PIXMAP_PATH "white_key_pressed.png" );
  73. Fl_Image *black_up = Fl_Shared_Image::get( PIXMAP_PATH "black_key.png" );
  74. Fl_Image *black_down = Fl_Shared_Image::get( PIXMAP_PATH "black_key_pressed.png" );
  75. //On error fetch everything from source directory
  76. if(!(white_up&&white_down&&black_up&&black_down)) {
  77. white_up = Fl_Shared_Image::get(SOURCE_DIR "/../../pixmaps/white_key.png");
  78. white_down = Fl_Shared_Image::get(SOURCE_DIR "/../../pixmaps/white_key_pressed.png");
  79. black_up = Fl_Shared_Image::get(SOURCE_DIR "/../../pixmaps/black_key.png");
  80. black_down = Fl_Shared_Image::get(SOURCE_DIR "/../../pixmaps/black_key_pressed.png");
  81. }
  82. Fl_Image *key;
  83. for (i=0;i<N_OCT*12;i++) {
  84. int noct=i/12;
  85. int kv=keyspos[i%12];
  86. if (kv>=0){//white keys
  87. if (pressed[i]==0)
  88. key = white_up;
  89. else
  90. key = white_down;
  91. key->draw( ox + (kv + 7 * noct ) * white_up->w() + 3, oy );
  92. }
  93. }
  94. for (i=0;i<N_OCT*12;i++){
  95. int noct=i/12;
  96. int kv=keyspos[i%12];
  97. if ( kv < 0 ) {
  98. kv=keyspos[(i+1)%12];
  99. if (pressed[i]==0)
  100. key = black_up;
  101. else
  102. key = black_down;
  103. key->draw( ox + (kv + 7 * noct ) * white_up->w() - black_up->w() / 2 + 2, oy );
  104. }
  105. }
  106. \#else
  107. if (damage()!=1){
  108. fl_color(250,240,230);
  109. fl_rectf(ox,oy,lx,ly);
  110. fl_color(FL_BLACK);
  111. fl_line(ox,oy,ox+lx,oy);
  112. fl_line(ox,oy+ly,ox+lx,oy+ly);
  113. for (i=0;i<N_OCT*7+1;i++){
  114. fl_line(ox+i*SIZE_WHITE,oy,ox+i*SIZE_WHITE,oy+ly);
  115. int ik=i%7;
  116. if ((ik==1)||(ik==2)||(ik==4)||(ik==5)||(ik==6))
  117. fl_rectf(ox+i*SIZE_WHITE-SIZE_BLACK/2,oy,
  118. SIZE_BLACK+1,ly*3/5);
  119. }
  120. }
  121. for (i=0;i<N_OCT*12;i++){
  122. // if (pressed[i]==0) continue;
  123. int noct=i/12;
  124. int kv=keyspos[i%12];
  125. if (kv>=0){//white keys
  126. if (pressed[i]==0) fl_color(250,240,230);
  127. else fl_color(FL_BLUE);
  128. fl_rectf(ox+(kv+7*noct)*SIZE_WHITE+3,oy+ly*3/5+2,
  129. SIZE_WHITE-4,ly*2/5-3);
  130. } else {//black keys
  131. kv=keyspos[(i+1)%12];
  132. if (pressed[i]==0) fl_color(FL_BLACK);
  133. else fl_color(FL_BLUE);
  134. fl_rectf(ox+(kv+7*noct)*SIZE_WHITE-SIZE_BLACK/2+2,oy+2,
  135. SIZE_BLACK-3,ly*3/5-5);
  136. }
  137. }
  138. \#endif
  139. } {}
  140. }
  141. Function {handle(int event)} {return_type int
  142. } {
  143. code {int i;
  144. int ly=h();
  145. int x_=Fl::event_x()-x();
  146. int y_=Fl::event_y()-y();
  147. if ( (x_<0)&&(x_>w()) && (y_<0)&&(y_>h())){
  148. return(0);
  149. };
  150. if ((event==FL_PUSH)||(event==FL_DRAG)||(event==FL_RELEASE)){
  151. int kpos=-1;
  152. if (y_>ly*3/5){//white keys
  153. int pos=x_/SIZE_WHITE;
  154. if (pos<0) return(1);
  155. for (i=0;i<12;i++) {
  156. if (pos%7==keyspos[i]) {
  157. kpos=pos/7*12+i;
  158. break;
  159. };
  160. };
  161. } else {//black keys
  162. int pos=(x_+SIZE_WHITE/2)/SIZE_WHITE;
  163. if (pos<0) return(1);
  164. for (i=1;i<12;i++) {
  165. if (pos%7==-keyspos[i]) {
  166. kpos=pos/7*12+i;
  167. break;
  168. };
  169. };
  170. };
  171. if ((kpos!=-1)&&((event==FL_PUSH)||(event==FL_DRAG))&&
  172. (Fl::event_shift()==0)) {
  173. presskey(kpos,1,1);
  174. };
  175. if ((event==FL_PUSH)&&(Fl::event_shift()!=0)) {
  176. if (pressed[kpos]==0) presskey(kpos,0,1);
  177. else relasekey(kpos,1);
  178. };
  179. if ((event==FL_RELEASE)&&(Fl::event_shift()==0))
  180. relaseallkeys(1);
  181. take_focus();
  182. };
  183. const int *keysoct1=keysoct1qwerty;
  184. const int *keysoct2=keysoct2qwerty;
  185. if (config.cfg.VirKeybLayout==2) {
  186. keysoct1=keysoct1dw;
  187. keysoct2=keysoct2dw;
  188. }else if (config.cfg.VirKeybLayout==3) {
  189. keysoct1=keysoct1qwertz;
  190. keysoct2=keysoct2qwertz;
  191. }else if (config.cfg.VirKeybLayout==4) {
  192. keysoct1=keysoct1az;
  193. keysoct2=keysoct2az;
  194. };
  195. if ((event==FL_KEYDOWN)||(event==FL_KEYUP)){
  196. int key=Fl::event_key();
  197. int kpos=-1;
  198. for (i=0;keysoct1[i]!=0;i++) if (key==keysoct1[i]) kpos=i+12*keyoct1;
  199. for (i=0;keysoct2[i]!=0;i++) if (key==keysoct2[i]) kpos=i+12*keyoct2;
  200. if (kpos==-1) return(0);
  201. if ((event==FL_KEYUP) && (Fl::event_key(key)==0) && (Fl::get_key(key)!=0)) return(0);
  202. if (event==FL_KEYDOWN) presskey(kpos,0,2);
  203. else relasekey(kpos,2);
  204. };
  205. return(1);} {}
  206. }
  207. Function {presskey(int nk,int exclusive,int type)} {} {
  208. code {//Exclusive means that multiple keys can be pressed at once
  209. //when the user uses the shift key
  210. if (nk>=N_OCT*12) return;
  211. if ((nk<0)&&(exclusive==0)) {
  212. relaseallkeys(type);
  213. return;
  214. };
  215. if (nk<0) return;
  216. if (pressed[nk]!=0) return;//the key is already pressed
  217. if (exclusive!=0) relaseallkeys(type);
  218. pressed[nk]=type;
  219. damage(1);
  220. float vel=midivel;
  221. if (rndvelocity!=0){
  222. vel=midivel*(127.0-rndvelocity)/127.0+RND*rndvelocity;
  223. };
  224. pthread_mutex_lock(&master->mutex);
  225. master->noteOn(midich,nk+midioct*12,(int)vel);
  226. pthread_mutex_unlock(&master->mutex);} {}
  227. }
  228. Function {relasekey(int nk,int type)} {} {
  229. code {if ((nk<0)||(nk>=N_OCT*12)) return;
  230. if (pressed[nk]==0) return;//the key is not pressed
  231. if ((type!=0)&&(pressed[nk]!=type)) return;
  232. pressed[nk]=0;
  233. damage(1);
  234. pthread_mutex_lock(&master->mutex);
  235. master->noteOff(midich,nk+12*midioct);
  236. pthread_mutex_unlock(&master->mutex);} {}
  237. }
  238. Function {relaseallkeys(int type)} {} {
  239. code {for (int i=0;i<N_OCT*12;i++) relasekey(i,type);} {}
  240. }
  241. decl {Master *master;} {private local
  242. }
  243. decl {int pressed[N_OCT*12+1];} {private local
  244. }
  245. decl {unsigned char midich;} {public local
  246. }
  247. decl {unsigned char midivel;} {public local
  248. }
  249. decl {char midioct,keyoct1,keyoct2;} {public local
  250. }
  251. decl {unsigned char rndvelocity;} {public local
  252. }
  253. }
  254. class VirKeyboard {open
  255. } {
  256. Function {make_window()} {open
  257. } {
  258. Fl_Window virkeyboardwindow {
  259. label {Virtual Keyboard - ZynAddSubFX}
  260. callback {relaseallkeys();
  261. virkeyboardwindow->hide();} open
  262. xywh {97 574 650 130} type Double visible
  263. } {
  264. Fl_Box virkeys {
  265. label Keyboard
  266. xywh {10 10 590 80} box FLAT_BOX color 17
  267. code0 {o->init(master);}
  268. class VirKeys
  269. }
  270. Fl_Counter {} {
  271. label {"qwer.." Oct}
  272. callback {relaseallkeys();
  273. virkeys->keyoct1=(int) o->value();
  274. virkeys->take_focus();}
  275. tooltip {keys "q2w3er5t6y..." octave} xywh {380 95 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10
  276. code0 {o->value(virkeys->keyoct1);}
  277. }
  278. Fl_Counter {} {
  279. label {"zxcv.." Oct}
  280. callback {relaseallkeys();
  281. virkeys->keyoct2=(int) o->value();
  282. virkeys->take_focus();}
  283. tooltip {keys "zsxdcvgbh..." octave} xywh {380 110 45 15} type Simple labelsize 10 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 10
  284. code0 {o->value(virkeys->keyoct2);}
  285. }
  286. Fl_Value_Slider {} {
  287. label Vel
  288. callback {virkeys->midivel=(int) o->value();
  289. virkeys->take_focus();} selected
  290. tooltip Velocity xywh {95 105 100 15} type {Horz Knob} box NO_BOX labelsize 10 align 5 minimum 1 maximum 127 step 1
  291. code0 {o->value(virkeys->midivel);}
  292. }
  293. Fl_Counter {} {
  294. label {Oct.}
  295. callback {relaseallkeys();
  296. virkeys->midioct=(int) o->value();
  297. virkeys->take_focus();}
  298. tooltip {Midi Octave} xywh {255 100 55 20} type Simple labelsize 11 align 4 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 11
  299. code0 {o->value(virkeys->midioct);}
  300. }
  301. Fl_Button {} {
  302. label Close
  303. callback {relaseallkeys();
  304. virkeyboardwindow->hide();}
  305. xywh {545 105 55 20} box THIN_UP_BOX
  306. }
  307. Fl_Value_Slider {} {
  308. label Cval
  309. callback {int ctl=midictl;
  310. pthread_mutex_lock(&master->mutex);
  311. master->setController(virkeys->midich,ctl,(int) o->value());
  312. pthread_mutex_unlock(&master->mutex);
  313. virkeys->take_focus();}
  314. tooltip {Controller value} xywh {605 10 15 115} type {Vert Fill} box ENGRAVED_BOX selection_color 229 labelsize 8 align 5 minimum 127 maximum 0 step 1 value 64 textsize 7
  315. }
  316. Fl_Choice {} {
  317. label Controller
  318. callback {switch((int) o->value()+1){
  319. case 1: midictl=C_modwheel; break;
  320. case 2: midictl=C_volume; break;
  321. case 3: midictl=C_panning; break;
  322. case 4: midictl=C_expression; break;
  323. case 5: midictl=C_sustain; break;
  324. case 6: midictl=C_portamento; break;
  325. case 7: midictl=C_filterq; break;
  326. case 8: midictl=C_filtercutoff; break;
  327. case 9: midictl=C_bandwidth; break;
  328. case 10: midictl=C_fmamp; break;
  329. case 11: midictl=C_resonance_center; break;
  330. case 12: midictl=C_resonance_bandwidth; break;
  331. default: midictl=C_NULL; break;
  332. };
  333. virkeys->take_focus();}
  334. xywh {435 105 100 15} down_box BORDER_BOX labelsize 10 align 5 when 6 textfont 1 textsize 10
  335. code0 {midictl=C_filtercutoff;o->value(7);}
  336. } {
  337. MenuItem {} {
  338. label {01: Mod.Wheel}
  339. xywh {0 0 100 20} labelfont 1 labelsize 10
  340. }
  341. MenuItem {} {
  342. label {07: Volume}
  343. xywh {10 10 100 20} labelfont 1 labelsize 10
  344. }
  345. MenuItem {} {
  346. label {10: Panning}
  347. xywh {20 20 100 20} labelfont 1 labelsize 10
  348. }
  349. MenuItem {} {
  350. label {11: Expression}
  351. xywh {30 30 100 20} labelfont 1 labelsize 10
  352. }
  353. MenuItem {} {
  354. label {64: Sustain}
  355. xywh {40 40 100 20} labelfont 1 labelsize 10
  356. }
  357. MenuItem {} {
  358. label {65: Portamento}
  359. xywh {50 50 100 20} labelfont 1 labelsize 10
  360. }
  361. MenuItem {} {
  362. label {71: Filter Q}
  363. xywh {60 60 100 20} labelfont 1 labelsize 10
  364. }
  365. MenuItem {} {
  366. label {74: Filter Freq.}
  367. xywh {70 70 100 20} labelfont 1 labelsize 10
  368. }
  369. MenuItem {} {
  370. label {75: Bandwidth}
  371. xywh {80 80 100 20} labelfont 1 labelsize 10
  372. }
  373. MenuItem {} {
  374. label {76: FM Gain}
  375. xywh {90 90 100 20} labelfont 1 labelsize 10
  376. }
  377. MenuItem {} {
  378. label {77: Res. c. freq}
  379. xywh {100 100 100 20} labelfont 1 labelsize 10
  380. }
  381. MenuItem {} {
  382. label {78: Res. bw.}
  383. xywh {110 110 100 20} labelfont 1 labelsize 10
  384. }
  385. }
  386. Fl_Roller pitchwheelroller {
  387. label Pwh
  388. callback {pthread_mutex_lock(&master->mutex);
  389. master->setController(virkeys->midich,C_pitchwheel,-(int) o->value());
  390. pthread_mutex_unlock(&master->mutex);
  391. virkeys->take_focus();}
  392. tooltip {Pitch Wheel} xywh {625 10 20 95} box UP_BOX labelsize 8 align 1 when 3 minimum -8192 maximum 8192 step 64
  393. }
  394. Fl_Button {} {
  395. label R
  396. callback {pitchwheelroller->value(0);
  397. pitchwheelroller->do_callback();}
  398. tooltip {Reset Pitch Bend} xywh {625 110 20 15} box THIN_UP_BOX labelfont 1
  399. }
  400. Fl_Dial {} {
  401. label Vrnd
  402. callback {virkeys->rndvelocity=(int) o->value();}
  403. tooltip {Velocity Randomness} xywh {205 105 20 20} box ROUND_UP_BOX labelsize 10 align 129 maximum 127 step 1
  404. code0 {o->value(virkeys->rndvelocity);}
  405. class WidgetPDial
  406. }
  407. Fl_Choice partrcv {
  408. label {MIDI Ch.}
  409. callback {relaseallkeys();
  410. virkeys->midich=(int) o->value();
  411. virkeys->take_focus();} open
  412. tooltip {Send to Midi Channel} xywh {20 105 65 20} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10
  413. code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Chn%d",i+1);if (i!=9) o->add(nrstr); else o->add("Drum10");};}
  414. code1 {o->value(virkeys->midich);}
  415. } {}
  416. }
  417. }
  418. Function {VirKeyboard(Master *master_)} {} {
  419. code {master=master_;
  420. midictl=75;
  421. make_window();} {}
  422. }
  423. Function {~VirKeyboard()} {} {
  424. code {delete virkeyboardwindow;} {}
  425. }
  426. Function {show()} {} {
  427. code {virkeyboardwindow->show();} {}
  428. }
  429. Function {relaseallkeys()} {} {
  430. code {virkeys->relaseallkeys(0);} {}
  431. }
  432. decl {Master *master;} {private local
  433. }
  434. decl {int midictl;} {private local
  435. }
  436. }