--- cui_midi.c- Sat Apr 5 22:00:00 2014 +++ cui_midi.c Mon Apr 7 00:00:00 2014 @@ -7,6 +7,7 @@ #include "cui/button.h" #include "cui/handler.h" #include "cui/menu.h" +#include "cui/num.h" typedef struct hex_in{ struct cui_base base; @@ -75,6 +76,23 @@ bp = buf; } +void +set_char2_wrt(char c1, char c2) +{ + set_char(c1); + set_char(c2); + wrt(); +} + +void +set_char3_wrt(char c1, char c2, char c3) +{ + set_char(c1); + set_char(c2); + set_char(c3); + wrt(); +} + int btn_hdr(cui obj, int evt, int val, void *prm) { @@ -106,6 +124,62 @@ return FALSE; } +struct test2{ + cui lb_ch, mn_ch; + cui lb_prog, prog, prog_out; + cui lb_vol, vol, vol_out; + cui lb_onoff, mn_note, lb_note_num, note_num, lb_velo, velo, note_out; + cui bs_note_len; + cui lb_note_len, note_len, lb_ms; +}; + +static int +num_get(cui obj) +{ + cui_num p = (cui_num)obj; + return p->v; +} + +int +t2_btn_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + struct test2 *p = (struct test2 *)prm; + int ch = ((cui_menu_popup)p->mn_ch)->val; + + if(obj == p->prog_out){ + set_char2_wrt((0xc<<4) | ch, num_get(p->prog)); + return TRUE; + }else if(obj == p->vol_out){ + set_char3_wrt((0xb<<4) | ch, 7 /* vol msb */, num_get(p->vol)); + return TRUE; + }else if(obj == p->note_out){ + char *s = cui_menu_popup_str_get(p->mn_note); + int note_num = num_get(p->note_num); + int velo = num_get(p->velo); + if(strcmp(s, "on") == 0){ + set_char3_wrt((9<<4) | ch, note_num, velo); + return TRUE; + }else if(strcmp(s, "off") == 0){ + set_char3_wrt((8<<4) | ch, note_num, velo); + return TRUE; + }else if(strcmp(s, "on/off") == 0){ + int msec = num_get(p->note_len); + set_char3_wrt((9<<4) | ch, note_num, velo); + usleep(msec * 1000); + set_char3_wrt((8<<4) | ch, note_num, velo); + return TRUE; + } + }else if(obj == p->mn_note){ + char *s = cui_menu_popup_str_get(p->mn_note); + if(strcmp(s, "on/off") == 0) cui_show(p->bs_note_len); + else cui_hide(p->bs_note_len); + return TRUE; + } + return FALSE; +} + int main(int ac, char **av) { @@ -122,10 +196,35 @@ cui lb = cui_label_new(scp->view, 2, cui_y2(hxi)+1, ""); cui prm_arr[] = { hxi, lb }; + cui bs2 = cui_base_new(scp->view, 2, cui_y2(lb)+1, 0, 0); + char *ch_lst[] = {"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15",NULL}; + char *note_lst[] = {"on", "off", "on/off", NULL}; + struct test2 t2; + char *cmd = "./add_delta | ./prog31 -V0 -q -play"; int div = 96; int i; + t2.lb_ch = cui_label_new(bs2, 0, 0, "midi ch : "); + t2.mn_ch = cui_menu_popup_new(bs2, cui_x2(t2.lb_ch), 0, 4, ch_lst, 0); + t2.lb_prog = cui_label_new(bs2, 2, 2, "prog num : "); + t2.prog = cui_num_new(bs2, cui_x2(t2.lb_prog), 2, 8, 50, 0, 127, 0); + t2.prog_out = cui_button_new(bs2, cui_x2(t2.prog)+2, 2, "Out"); + t2.lb_vol = cui_label_new(bs2, 2, 4, "vol (msb) : "); + t2.vol = cui_num_new(bs2, cui_x2(t2.lb_vol), 4, 8, 64, 0, 127, 0); + t2.vol_out = cui_button_new(bs2, cui_x2(t2.vol)+2, 4, "Out"); + t2.lb_onoff = cui_label_new(bs2, 2, 6, "note : "); + t2.mn_note = cui_menu_popup_new(bs2, cui_x2(t2.lb_onoff), 6, 7, note_lst, 0); + t2.lb_note_num = cui_label_new(bs2, cui_x2(t2.mn_note)+2, 6, "num : "); + t2.note_num = cui_num_new(bs2, cui_x2(t2.lb_note_num), 6, 8, 69, 0, 127, 0); + t2.lb_velo = cui_label_new(bs2, cui_x2(t2.note_num)+2, 6, "velo : "); + t2.velo = cui_num_new(bs2, cui_x2(t2.lb_velo), 6, 8, 64, 0, 127, 0); + t2.note_out = cui_button_new(bs2, cui_x2(t2.velo)+2, 6, "Out"); + t2.bs_note_len = cui_base_new(bs2, t2.mn_note->x, 7, 0, 0); + t2.lb_note_len = cui_label_new(t2.bs_note_len, 0, 0, "note len : "); + t2.note_len = cui_num_new(t2.bs_note_len, cui_x2(t2.lb_note_len), 0, 12, 500, 0, 10*1000, 0); + t2.lb_ms = cui_label_new(t2.bs_note_len, cui_x2(t2.note_len)+2, 0, "msec"); + for(i=1; iview); + cui_wh_set(root, scp->view->w+3, scp->view->h+3); + cui_xy_set(scp->rszbox, root->w-1, root->h-1); + cui_hide(t2.bs_note_len); set_str("MThd"); set_int(4, 6);