--- cui_midi.c- 2014-04-23 23:00:00.000000000 +0900 +++ cui_midi.c 2014-04-24 00:00:00.000000000 +0900 @@ -82,22 +82,41 @@ cui pmode, on, msec, play, repeat; }; +static void +note_onoff(int note, int onoff, void *prm) +{ + struct test4 *p = (struct test4 *)prm; + struct test4_ch *ch = &p->ch[ p->midi_ch ]; + int hi = onoff ? 9 : 8; + int low = p->midi_ch; + set_char3_wrt((hi<<4) | low, note, ch->velo); +} + +static void +arpe_note_off(void *prm) +{ + struct test4 *p = (struct test4 *)prm; + struct test4_ch *ch = &p->ch[ p->midi_ch ]; + if(ch->arpe_note < 0) return; + note_onoff(ch->arpe_note, FALSE, prm); + ch->arpe_note = -1; +} + static int repeat_hdr(cui obj, int evt, int val, void *prm) { struct test4 *p = (struct test4 *)prm; struct test4_ch *ch = &p->ch[ p->midi_ch ]; int i, note, prev = ch->arpe_note; - - if(prev >= 0) set_char3_wrt((8<<4) | p->midi_ch, prev, ch->velo); + arpe_note_off(prm); for(note=0; note<128; note++) if(cui_kbd_get(ch->kbd, note)) break; if(note < 128){ for(i=0; i<128; i++){ note = (prev + 1 + i) % 128; if(cui_kbd_get(ch->kbd, note)) break; } - set_char3_wrt((9<<4) | p->midi_ch, note, ch->velo); + note_onoff(note, TRUE, prm); ch->arpe_note = note; } return TRUE; @@ -127,8 +146,9 @@ }else if(obj == ch->kbd){ char *s = cui_menu_popup_str_get(p->pmode); if(strcmp(s, "Immediate") == 0){ - if(val & 0x100) set_char3_wrt((9<<4) | p->midi_ch, val & ~0x100, ch->velo); - else set_char3_wrt((8<<4) | p->midi_ch, val & ~0x100, ch->velo); + int onoff = val & 0x100; + int note = val & ~0x100; + note_onoff(note, onoff, prm); } }else if(obj == p->pmode){ char *s = cui_menu_popup_str_get(p->pmode); @@ -138,24 +158,24 @@ cui_show_hide(p->repeat, strcmp(s, "Arpeggio") == 0); }else if(obj == p->on){ int note; - int hi = val ? (9<<4) : (8<<4); for(note=0; note<128; note++){ if(!cui_kbd_get(ch->kbd, note)) continue; - set_char3_wrt(hi | p->midi_ch, note, ch->velo); + note_onoff(note, val, prm); } }else if(obj == p->play){ int note, prev; prev = -1; for(note=0; note<128; note++){ if(!cui_kbd_get(ch->kbd, note)) continue; - if(prev >= 0) set_char3_wrt((8<<4) | p->midi_ch, prev, ch->velo); - set_char3_wrt((9<<4) | p->midi_ch, note, ch->velo); + if(prev >= 0) note_onoff(prev, FALSE, prm); + note_onoff(note, TRUE, prm); usleep(ch->msec * 1000); prev = note; } - set_char3_wrt((8<<4) | p->midi_ch, prev, ch->velo); + note_onoff(prev, FALSE, prm); }else if(obj == p->repeat){ cui_timer_set(obj, val ? ch->msec : -1, FALSE); + arpe_note_off(prm); }else return FALSE; return TRUE; }