27 case(XK_w) : (*midi_key) = 12.0;
29 case(XK_s) : (*midi_key) = 13.0;
31 case(XK_x) : (*midi_key) = 14.0;
33 case(XK_d) : (*midi_key) = 15.0;
35 case(XK_c) : (*midi_key) = 16.0;
37 case(XK_v) : (*midi_key) = 17.0;
39 case(XK_g) : (*midi_key) = 18.0;
41 case(XK_b) : (*midi_key) = 19.0;
43 case(XK_h) : (*midi_key) = 20.0;
45 case(XK_n) : (*midi_key) = 21.0;
47 case(XK_j) : (*midi_key) = 22.0;
49 case(XK_a) : (*midi_key) = 24.0;
51 case(XK_l) : (*midi_key) = 25.0;
53 case(XK_z) : (*midi_key) = 26.0;
55 case(XK_m) : (*midi_key) = 27.0;
57 case(XK_e) : (*midi_key) = 28.0;
59 case(XK_r) : (*midi_key) = 29.0;
61 case(XK_t) : (*midi_key) = 31.0;
63 case(XK_y) : (*midi_key) = 33.0;
65 case(XK_u) : (*midi_key) = 35.0;
67 case(XK_i) : (*midi_key) = 36.0;
69 case(XK_o) : (*midi_key) = 38.0;
71 case(XK_p) : (*midi_key) = 40.0;
79 case(XK_less) : (*midi_key) = 11.0;
81 case(XK_comma) : (*midi_key) = 23.0;
83 case(XK_semicolon) : (*midi_key) = 24.0;
85 case(XK_eacute) : (*midi_key) = 25.0;
87 case(XK_colon) : (*midi_key) = 26.0;
89 case(XK_quotedbl) : (*midi_key) = 27.0;
91 case(XK_exclam) : (*midi_key) = 28.0;
93 case(XK_ugrave) : (*midi_key) = 29.0;
95 case(XK_asterisk) : (*midi_key) = 30.0;
97 case(XK_parenleft) : (*midi_key) = 30.0;
99 case(XK_minus) : (*midi_key) = 32.0;
101 case(XK_egrave) : (*midi_key) = 34.0;
103 case(XK_ccedilla) : (*midi_key) = 37.0;
105 case(XK_agrave) : (*midi_key) = 39.0;
107 case (XK_parenright) : (*midi_key) = 41.0;
109 case (XK_equal) : (*midi_key) = 42.0;
111 case (XK_dollar) : (*midi_key) = 43.0;
120 case(XK_less) : (*midi_key) = 11.0;
122 case(XK_comma) : (*midi_key) = 23.0;
124 case(XK_semicolon) : (*midi_key) = 24.0;
126 case(XK_eacute) : (*midi_key) = 25.0;
128 case(XK_colon) : (*midi_key) = 26.0;
130 case(XK_quotedbl) : (*midi_key) = 27.0;
132 case(XK_equal) : (*midi_key) = 28.0;
134 case(XK_ugrave) : (*midi_key) = 29.0;
136 case(XK_mu) : (*midi_key) = 30.0;
138 case(XK_parenleft) : (*midi_key) = 30.0;
140 case(XK_section) : (*midi_key) = 32.0;
142 case(XK_egrave) : (*midi_key) = 34.0;
144 case(XK_ccedilla) : (*midi_key) = 37.0;
146 case(XK_agrave) : (*midi_key) = 39.0;
148 case (XK_parenright) : (*midi_key) = 41.0;
150 case (XK_minus) : (*midi_key) = 42.0;
152 case (XK_dollar) : (*midi_key) = 43.0;
161 case(XK_less) : (*midi_key) = 11.0;
163 case(XK_KP_Decimal) : (*midi_key) = 23.0;
165 case(XK_semicolon) : (*midi_key) = 24.0;
167 case(XK_eacute) : (*midi_key) = 25.0;
169 case(XK_colon) : (*midi_key) = 26.0;
171 case(XK_quotedbl) : (*midi_key) = 27.0;
173 case(XK_exclam) : (*midi_key) = 28.0;
175 case(XK_ugrave) : (*midi_key) = 29.0;
177 case(XK_asterisk) : (*midi_key) = 30.0;
179 case(XK_parenleft) : (*midi_key) = 30.0;
181 case(XK_minus) : (*midi_key) = 32.0;
183 case(XK_egrave) : (*midi_key) = 34.0;
185 case(XK_ccedilla) : (*midi_key) = 37.0;
187 case(XK_agrave) : (*midi_key) = 39.0;
189 case (XK_parenright) : (*midi_key) = 41.0;
191 case (XK_equal) : (*midi_key) = 42.0;
193 case (XK_dollar) : (*midi_key) = 43.0;
201 case(XK_y) : (*midi_key) = 12.0;
203 case(XK_s) : (*midi_key) = 13.0;
205 case(XK_x) : (*midi_key) = 14.0;
207 case(XK_d) : (*midi_key) = 15.0;
209 case(XK_c) : (*midi_key) = 16.0;
211 case(XK_v) : (*midi_key) = 17.0;
213 case(XK_g) : (*midi_key) = 18.0;
215 case(XK_b) : (*midi_key) = 19.0;
217 case(XK_h) : (*midi_key) = 20.0;
219 case(XK_n) : (*midi_key) = 21.0;
221 case(XK_j) : (*midi_key) = 22.0;
223 case(XK_m) : (*midi_key) = 23.0;
225 case(XK_q) : (*midi_key) = 24.0;
227 case(XK_2) : (*midi_key) = 25.0;
229 case(XK_w) : (*midi_key) = 26.0;
231 case(XK_3) : (*midi_key) = 27.0;
233 case(XK_e) : (*midi_key) = 28.0;
235 case(XK_r) : (*midi_key) = 29.0;
237 case(XK_5) : (*midi_key) = 30.0;
239 case(XK_t) : (*midi_key) = 31.0;
241 case(XK_6) : (*midi_key) = 32.0;
243 case(XK_z) : (*midi_key) = 33.0;
245 case(XK_7) : (*midi_key) = 34.0;
247 case(XK_u) : (*midi_key) = 35.0;
249 case(XK_i) : (*midi_key) = 36.0;
251 case(XK_9) : (*midi_key) = 37.0;
253 case(XK_o) : (*midi_key) = 38.0;
255 case(XK_0) : (*midi_key) = 39.0;
257 case(XK_p) : (*midi_key) = 40.0;
259 case(XK_udiaeresis) : (*midi_key) = 41.0;
261 case(XK_plus) : (*midi_key) = 42.0;
268 if ((*midi_key) == 12) (*midi_key) = 33;
269 else if ((*midi_key) == 33) (*midi_key) = 12;
277 if (inkey == custom_keys[i][j]) {
278 (*midi_key) = (float)i;
286 unsigned long *use_matrix = &key_matrix[0];
289 use_matrix = &key_matrix[3];
292 use_matrix = &key_matrix[2];
295 use_matrix = &key_matrix[1];
299 (*use_matrix) |= (1 << key);
301 (*use_matrix) &= (~(1 << key));
306 unsigned long *use_matrix = &key_matrix[0];
310 use_matrix = &key_matrix[3];
313 use_matrix = &key_matrix[2];
316 use_matrix = &key_matrix[1];
320 if((*use_matrix) & (1<<key)) {
343 if(key_matrix[j] & (1<<i)) {
358 key_matrix[j] &= (~(1 << i));
365 double ci = ((c+1)/100.0)*12.0;
367 cairo_set_source_rgba(w->
crb, ci, 0.2, 0.4, 1.00);
369 cairo_set_source_rgba(w->
crb, 0.6, 0.2+ci-0.48, 0.4, 1.00);
371 cairo_set_source_rgba(w->
crb, 0.6-(ci-0.96), 0.68-(ci-1.08), 0.4, 1.00);
373 cairo_set_source_rgba(w->
crb, 0.12+(ci-1.56), 0.32, 0.4-(ci-1.44), 1.00);
376static void draw_keyboard(
void *w_,
void* user_data) {
379 int width_t, height_t;
391 int octave_ofset = keys->key_size/6;
392 if (keys->key_size<24)
397 for(;i<width_t;i++) {
399 cairo_rectangle(w->
crb,i,0,keys->key_size+1,height_t);
400 if ( k+keys->octave == keys->active_key ||
is_key_in_matrix(keys->key_matrix,k+keys->octave)) {
403 cairo_set_line_width(w->
crb, 1.0);
404 }
else if (ik > -1) {
406 cairo_set_line_width(w->
crb, 2.0);
407 }
else if ( k+keys->octave == keys->prelight_key) {
409 cairo_set_line_width(w->
crb, 2.0);
412 cairo_set_line_width(w->
crb, 1.0);
415 cairo_fill_preserve(w->
crb);
417 cairo_stroke(w->
crb);
419 if(k+keys->octave == 0) {
420 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
422 cairo_show_text(w->
crb,
"C-1");
423 }
else if(k+keys->octave == 12) {
424 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
426 cairo_show_text(w->
crb,
"C0");
427 }
else if(k+keys->octave == 24) {
428 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
430 cairo_show_text(w->
crb,
"C1");
431 }
else if(k+keys->octave == 36) {
432 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
434 cairo_show_text(w->
crb,
"C2");
435 }
else if(k+keys->octave == 48) {
436 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
438 cairo_show_text(w->
crb,
"C3");
439 }
else if(k+keys->octave == 60) {
440 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
442 cairo_show_text(w->
crb,
"C4");
443 }
else if(k+keys->octave == 72) {
444 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
446 cairo_show_text(w->
crb,
"C5");
447 }
else if(k+keys->octave == 84) {
448 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
450 cairo_show_text(w->
crb,
"C6");
451 }
else if(k+keys->octave == 96) {
452 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
454 cairo_show_text(w->
crb,
"C7");
455 }
else if(k+keys->octave == 108) {
456 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
458 cairo_show_text(w->
crb,
"C8");
459 }
else if(k+keys->octave == 120) {
460 cairo_move_to (w->
crb, i+octave_ofset, height_t*0.9);
462 cairo_show_text(w->
crb,
"C9");
471 }
else if (set == 4) {
489 cairo_pattern_t *pat = cairo_pattern_create_linear (0, 0, 0, height_t*0.59);
490 cairo_pattern_add_color_stop_rgba(pat, 0.0, 0.85, 0.85, 0.85, 0.4);
491 cairo_pattern_add_color_stop_rgba(pat, 0.2, 0.0, 0.0, 0.0, 0.0);
492 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.0, 0.0, 0.0, 0.0);
494 for(;i<width_t;i++) {
498 cairo_set_line_width(w->
crb, 1.0);
499 cairo_rectangle(w->
crb,i+keys->key_offset,0,keys->key_size-4,height_t*0.59);
500 if ( k+keys->octave == keys->active_key ||
is_key_in_matrix(keys->key_matrix,k+keys->octave)) {
503 cairo_set_line_width(w->
crb, 1.0);
504 }
else if (ik > -1) {
506 cairo_set_line_width(w->
crb, 2.0);
507 }
else if ( k+keys->octave == keys->prelight_key) {
509 cairo_set_line_width(w->
crb, 2.0);
512 cairo_set_line_width(w->
crb, 1.0);
515 cairo_fill_preserve(w->
crb);
516 cairo_set_source(w->
crb, pat);
517 cairo_fill_preserve(w->
crb);
519 cairo_stroke(w->
crb);
530 }
else if (set == 3) {
541 cairo_pattern_destroy (pat);
542 pat = cairo_pattern_create_linear (0, 0, 0, height_t);
543 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.0, 0.0, 0.0, 0.4);
544 cairo_pattern_add_color_stop_rgba(pat, 0.8, 0.0, 0.0, 0.0, 0.0);
545 cairo_pattern_add_color_stop_rgba(pat, 0.0, 0.0, 0.0, 0.0, 0.0);
546 cairo_set_source(w->
crb, pat);
547 cairo_rectangle(w->
crb,0,0,width_t,height_t);
549 cairo_pattern_destroy (pat);
552static void keyboard_motion(
void *w_,
void* xmotion_,
void* user_data) {
564 bool catchit =
false;
566 if(xmotion->
y < height*0.59) {
574 if(xmotion->
x > i+keys->key_offset && xmotion->
x < i+keys->key_size+keys->key_offset-3) {
575 keys->prelight_key = set_key+keys->octave;
576 if(xmotion->
state & Button1Mask) {
577 if (keys->active_key != keys->prelight_key) {
578 keys->send_key = keys->active_key;
579 if (keys->send_key>=0 && keys->send_key<128) {
582 keys->mk_send_note(p, &keys->send_key,0x80);
584 keys->active_key = keys->prelight_key;
585 keys->send_key = keys->active_key;
586 keys->last_active_key = keys->active_key;
587 if (keys->send_key>=0 && keys->send_key<128)
588 keys->mk_send_note(p, &keys->send_key,0x90);
592 if (keys->prelight_key != keys->new_prelight_key ||
593 keys->active_key != keys->new_active_key ) {
595 keys->new_prelight_key = keys->prelight_key;
596 keys->new_active_key = keys->active_key;
607 }
else if (set == 3) {
624 if(xmotion->
x > i && xmotion->
x < i+keys->key_size) {
625 keys->prelight_key = k+keys->octave;
626 if(xmotion->
state & Button1Mask) {
627 if (keys->active_key != keys->prelight_key) {
628 keys->send_key = keys->active_key;
629 if (keys->send_key>=0 && keys->send_key<128) {
632 keys->mk_send_note(p, &keys->send_key,0x80);
634 keys->active_key = keys->prelight_key;
635 keys->send_key = keys->active_key;
636 keys->last_active_key = keys->active_key;
637 if (keys->send_key>=0 && keys->send_key<128)
638 keys->mk_send_note(p, &keys->send_key,0x90);
641 if (keys->prelight_key != keys->new_prelight_key ||
642 keys->active_key != keys->new_active_key ) {
644 keys->new_prelight_key = keys->prelight_key;
645 keys->new_active_key = keys->active_key;
656 }
else if (set == 4) {
687static void key_press(
void *w_,
void *key_,
void *user_data) {
697 XQueryKeymap(w->
app->
dpy, xkeys);
698 if (!(xkeys[key->
keycode>>3] & (0x1 << (key->
keycode % 8))))
return;
709 KeySym sym = XLookupKeysym (key, 0);
711 get_outkey(keys, sym, &outkey);
720 if (sym == XK_space) {
730static void key_release(
void *w_,
void *key_,
void *user_data) {
740 XQueryKeymap(w->
app->
dpy, xkeys);
741 if ((xkeys[key->
keycode>>3] & (0x1 << (key->
keycode % 8))))
return;
743 KeySym sym = XLookupKeysym (key, 0);
748 get_outkey(keys, sym, &outkey);
758static void leave_keyboard(
void *w_,
void* user_data) {
767static void button_pressed_keyboard(
void *w_,
void* button_,
void* user_data) {
773 if(xbutton->
button == Button1) {
780 }
else if (xbutton->
button == Button3) {
795static void button_released_keyboard(
void *w_,
void* button_,
void* user_data) {
801 if(xbutton->
button == Button1) {
810 }
else if (xbutton->
button == Button2) {
814 if(xbutton->
button == Button1) {
824static void keyboard_mem_free(
void *w_,
void* user_data) {
846static void octave_callback(
void *w_,
void* user_data) {
853static void layout_callback(
void *w_,
void* user_data) {
859static void velocity_changed(
void *w_,
void* user_data) {
865static void grab_callback(
void *w_,
void* user_data) {
871 GrabModeAsync, GrabModeAsync, CurrentTime);
873 XUngrabKeyboard(w->
app->
dpy, CurrentTime);
879 if( access(keymapfile, F_OK ) != -1 ) {
881 if((fp=fopen(keymapfile,
"rb"))==NULL) {
882 fprintf(stderr,
"Cannot open file.\n");
885 if(fread(keys,
sizeof(
long), 128*2, fp) != 128*2) {
887 fprintf(stderr,
"Premature end of file.");
889 fprintf(stderr,
"File read error.");
895static void key_dummy(
Widget_t *w,
const int *key,
const int on_off) {
897 fprintf(stderr,
"Send note on %i\n",(*key));
899 fprintf(stderr,
"Send note off %i\n",(*key));
902static void wheel_dummy(
Widget_t *w,
const int *value) {
903 fprintf(stderr,
"send all sound off\n");
907 int x,
int y,
int width,
int height) {
evfunc button_release_callback
evfunc key_release_callback
evfunc key_press_callback
evfunc double_click_callback
xevfunc value_changed_callback
xevfunc mem_free_callback
evfunc button_press_callback
Metrics_t - struct to receive window size, position & visibility Pass this struct to os_get_window_...
unsigned long in_key_matrix[16][4]
unsigned long key_matrix[4]
midiwheelfunc mk_send_all_sound_off
void adj_set_value(Adjustment_t *adj, float value)
adj_set_value - set the current value to the Adjustment_t
float adj_get_value(Adjustment_t *adj)
adj_get_value - get the current value of the Adjustment_t
void set_adjustment(Adjustment_t *adj, float std_value, float value, float min_value, float max_value, float step, CL_type type)
*set_adjustment - set a new range to a existing Adjustment_t or create if it not exists yet
void use_bg_color_scheme(Widget_t *w, Color_state st)
use_bg_color_scheme - use background Colors to paint on Widget_t
void use_fg_color_scheme(Widget_t *w, Color_state st)
use_fg_color_scheme - use forground Colors to paint on Widget_t
void use_base_color_scheme(Widget_t *w, Color_state st)
use_base_color_scheme - use base Colors to paint on Widget_t
void keysym_qwerty_to_midi_key(unsigned int inkey, float *midi_key)
bool is_key_in_matrix(unsigned long *key_matrix, int key)
void add_keyboard(Widget_t *wid, const char *label)
void clear_key_matrix(unsigned long *key_matrix)
void read_keymap(const char *keymapfile, long keys[128][2])
Widget_t * add_midi_keyboard(Widget_t *parent, const char *label, int x, int y, int width, int height)
void keysym_azerty_to_midi_key(long inkey, float *midi_key)
void keysym_qwertz_to_midi_key(long inkey, float *midi_key)
Widget_t * open_midi_keyboard(Widget_t *w, const char *label)
void set_key_in_matrix(unsigned long *key_matrix, int key, bool set)
void use_matrix_color(Widget_t *w, int c)
int is_key_in_in_matrix(MidiKeyboard *keys, int key)
void custom_to_midi_key(long custom_keys[128][2], long inkey, float *midi_key)
void keysym_azerty_fr_to_midi_key(long inkey, float *midi_key)
bool need_redraw(MidiKeyboard *keys)
void keysym_azerty_be_to_midi_key(long inkey, float *midi_key)
bool have_key_in_matrix(unsigned long *key_matrix)
void keysym_azerty_afnor_to_midi_key(long inkey, float *midi_key)