📄 vt100_c.c
字号:
if(instr_comment[selected_channel].comm != NULL) { if(indicator_mode != INDICATOR_DEFAULT) reset_indicator(); next_indicator_chan = selected_channel; } }}static int ctl_read(int32 *valp){ char *cmd; if((cmd = vt100_getline()) == NULL) return RC_NONE; switch(cmd[0]) { case 'q': trace_flush(); return RC_QUIT; case 'V': *valp = 10 * char_count(cmd, cmd[0]); return RC_CHANGE_VOLUME; case 'v': *valp =- 10 * char_count(cmd, cmd[0]); return RC_CHANGE_VOLUME;#if 0 case '1': case '2': case '3': *valp=cmd[0] - '2'; return RC_CHANGE_REV_EFFB; case '4': case '5': case '6': *valp = cmd[0] - '5'; return RC_CHANGE_REV_TIME;#endif case 's': return RC_TOGGLE_PAUSE; case 'n': return RC_NEXT; case 'p': return RC_REALLY_PREVIOUS; case 'r': return RC_RESTART; case 'f': *valp=play_mode->rate * char_count(cmd, cmd[0]); return RC_FORWARD; case 'b': *valp=play_mode->rate * char_count(cmd, cmd[0]); return RC_BACK; case '+': *valp = char_count(cmd, cmd[0]); return RC_KEYUP; case '-': *valp = -char_count(cmd, cmd[0]); return RC_KEYDOWN; case '>': *valp = char_count(cmd, cmd[0]); return RC_SPEEDUP; case '<': *valp = char_count(cmd, cmd[0]); return RC_SPEEDDOWN; case 'O': *valp = char_count(cmd, cmd[0]); return RC_VOICEINCR; case 'o': *valp = char_count(cmd, cmd[0]); return RC_VOICEDECR; case 'c': *valp = char_count(cmd, cmd[0]); move_select_channel(*valp); break; case 'C': *valp = char_count(cmd, cmd[0]); move_select_channel(-*valp); break; case 'd': if(selected_channel != -1) { *valp = selected_channel; return RC_TOGGLE_DRUMCHAN; } break; case 'g': return RC_TOGGLE_SNDSPEC; } if(cmd[0] == '\033' && cmd[1] == '[') { switch(cmd[2]) { case 'A': *valp=10; return RC_CHANGE_VOLUME; case 'B': *valp=-10; return RC_CHANGE_VOLUME; case 'C': *valp=play_mode->rate; return RC_FORWARD; case 'D': *valp=play_mode->rate; return RC_BACK; } return RC_NONE; } return RC_NONE;}static int cmsg(int type, int verbosity_level, char *fmt, ...){ va_list ap; if ((type==CMSG_TEXT || type==CMSG_INFO || type==CMSG_WARNING) && ctl.verbosity<verbosity_level) return 0; va_start(ap, fmt); if (!ctl.opened) { vfprintf(stderr, fmt, ap); fputs(NLS, stderr); } else { char *buff; int i; MBlockList pool; init_mblock(&pool); buff = (char *)new_segment(&pool, MIN_MBLOCK_SIZE); vsnprintf(buff, MIN_MBLOCK_SIZE, fmt, ap); for(i = 0; i < VT100_COLS - 1 && buff[i]; i++) if(buff[i] == '\n' || buff[i] == '\r' || buff[i] == '\t') buff[i] = ' '; buff[i] = '\0'; if(!ctl.trace_playing){ msg_row++; if(msg_row == VT100_ROWS) { int i; msg_row = 6; for(i = 6; i <= VT100_ROWS; i++) { vt100_move(i, 0); vt100_clrtoeol(); } } } vt100_move(msg_row,0); vt100_clrtoeol(); switch(type) { case CMSG_WARNING: case CMSG_ERROR: case CMSG_FATAL: vt100_set_attr(VT100_ATTR_REVERSE); fputs(buff, stdout); vt100_reset_attr(); break; default: fputs(buff, stdout); break; } ctl_refresh(); if(type == CMSG_ERROR || type == CMSG_FATAL) sleep(2); reuse_mblock(&pool); } va_end(ap); return 0;}#if !defined(__W32__) || defined(__CYGWIN32__)/* UNIX */static char *vt100_getline(void){ static char cmd[VT100_COLS]; fd_set fds; int cnt; struct timeval timeout; FD_ZERO(&fds); FD_SET(0, &fds); timeout.tv_sec = timeout.tv_usec = 0; if((cnt = select(1, &fds, NULL, NULL, &timeout)) < 0) { perror("select"); return NULL; } if(cnt > 0 && FD_ISSET(0, &fds) != 0) { if(fgets(cmd, sizeof(cmd), stdin) == NULL) { rewind(stdin); return NULL; } return cmd; } return NULL;}#else/* Windows *//* Define VT100_CBREAK_MODE if you want to emulate like ncurses mode *//* #define VT100_CBREAK_MODE */#include <conio.h>static char *vt100_getline(void){ static char cmd[VT100_COLS]; static int cmdlen = 0; int c; if(kbhit()) { c = getch(); if(c == 'q' || c == 3 || c == 4) return "q"; if(c == '\r') c = '\n';#ifdef VT100_CBREAK_MODE cmd[0] = c; cmd[1] = '\0'; return cmd;#else if(cmdlen < sizeof(cmd) - 1) cmd[cmdlen++] = (char)c; if(c == '\n') { cmd[cmdlen] = '\0'; cmdlen = 0; return cmd; }#endif /* VT100_CBREAK_MODE */ } return NULL;}#endif/* Indicator */static void reset_indicator(void){ int i; memset(comment_indicator_buffer, ' ', indicator_width - 1); comment_indicator_buffer[indicator_width - 1] = '\0'; next_indicator_chan = -1; indicator_last_update = get_current_calender_time(); indicator_mode = INDICATOR_DEFAULT; indicator_msgptr = NULL; for(i = 0; i < MAX_CHANNELS; i++) { instr_comment[i].last_note_on = 0.0; instr_comment[i].comm = channel_instrum_name(i); }}static void update_indicator(void){ double t; int i; char c; t = get_current_calender_time(); if(indicator_mode != INDICATOR_DEFAULT) { int save_chan; if(indicator_last_update + SCRMODE_OUT_THRESHOLD > t) return; save_chan = next_indicator_chan; reset_indicator(); next_indicator_chan = save_chan; } else { if(indicator_last_update + INDICATOR_UPDATE_TIME > t) return; } indicator_last_update = t; if(indicator_msgptr != NULL && *indicator_msgptr == '\0') indicator_msgptr = NULL; if(indicator_msgptr == NULL) { if(next_indicator_chan >= 0 && instr_comment[next_indicator_chan].comm != NULL && *instr_comment[next_indicator_chan].comm) { current_indicator_chan = next_indicator_chan; } else { int prog; prog = instr_comment[current_indicator_chan].prog; for(i = 0; i < MAX_CHANNELS; i++) { current_indicator_chan++; if(current_indicator_chan == MAX_CHANNELS) current_indicator_chan = 0; if(instr_comment[current_indicator_chan].comm != NULL && *instr_comment[current_indicator_chan].comm && instr_comment[current_indicator_chan].prog != prog && (instr_comment[current_indicator_chan].last_note_on + CHECK_NOTE_SLEEP_TIME > t || instr_comment[current_indicator_chan].disp_cnt == 0)) break; } if(i == MAX_CHANNELS) return; } next_indicator_chan = -1; if(instr_comment[current_indicator_chan].comm == NULL || *instr_comment[current_indicator_chan].comm == '\0') return; snprintf(current_indicator_message, indicator_width, "%03d:%s ", instr_comment[current_indicator_chan].prog, instr_comment[current_indicator_chan].comm); instr_comment[current_indicator_chan].disp_cnt++; indicator_msgptr = current_indicator_message; } c = *indicator_msgptr++; for(i = 0; i < indicator_width - 2; i++) comment_indicator_buffer[i] = comment_indicator_buffer[i + 1]; comment_indicator_buffer[indicator_width - 2] = c; vt100_move(msg_row, 0); fputs(comment_indicator_buffer, stdout); ctl_refresh();}static void indicator_chan_update(int ch){ double t; t = get_current_calender_time(); if(next_indicator_chan == -1 && instr_comment[ch].last_note_on + CHECK_NOTE_SLEEP_TIME < t) next_indicator_chan = ch; instr_comment[ch].last_note_on = t; instr_comment[ch].disp_cnt = 0; if(instr_comment[ch].comm == NULL) { if((instr_comment[ch].comm = default_instrument_name) == NULL) { if(!ISDRUMCHANNEL(ch)) instr_comment[ch].comm = "<GrandPiano>"; else instr_comment[ch].comm = "<Drum>"; } }}static void indicator_set_prog(int ch, int val, char *comm){ instr_comment[ch].comm = comm; instr_comment[ch].prog = val; instr_comment[ch].last_note_on = 0.0;}static void display_lyric(char *lyric, int sep){ char *p; int len, idlen, sepoffset; static int crflag = 0; if(lyric == NULL) { indicator_last_update = get_current_calender_time(); crflag = 0; return; } if(indicator_mode != INDICATOR_LYRIC || crflag) { memset(comment_indicator_buffer, 0, indicator_width); vt100_move(lyric_row, 0); vt100_clrtoeol(); ctl_refresh(); indicator_mode = INDICATOR_LYRIC; crflag = 0; } if(*lyric == '\0') { indicator_last_update = get_current_calender_time(); return; } else if(*lyric == '\n') { if(!ctl.trace_playing) { crflag = 1; lyric_row++; vt100_move(lyric_row, 0); return; } else lyric = " / "; } if(strchr(lyric, '\r') != NULL) { crflag = 1; if(!ctl.trace_playing) { int i; for(i = title_row+1; i <= lyric_row; i++) { vt100_move(i, 0); vt100_clrtoeol(); } lyric_row = title_row+1; } if(lyric[0] == '\r' && lyric[1] == '\0') { indicator_last_update = get_current_calender_time(); return; } } idlen = strlen(comment_indicator_buffer); len = strlen(lyric); if(sep) { while(idlen > 0 && comment_indicator_buffer[idlen - 1] == ' ') comment_indicator_buffer[--idlen] = '\0'; while(len > 0 && lyric[len - 1] == ' ') len--; } if(len == 0) { /* update time stamp */ indicator_last_update = get_current_calender_time(); reuse_mblock(&tmpbuffer); return; } sepoffset = (sep != 0); if(len >= indicator_width - 2) { memcpy(comment_indicator_buffer, lyric, indicator_width - 1); comment_indicator_buffer[indicator_width - 1] = '\0'; } else if(idlen == 0) { memcpy(comment_indicator_buffer, lyric, len); comment_indicator_buffer[len] = '\0'; } else if(len + idlen + 2 < indicator_width) { if(sep) comment_indicator_buffer[idlen] = sep; memcpy(comment_indicator_buffer + idlen + sepoffset, lyric, len); comment_indicator_buffer[idlen + sepoffset + len] = '\0'; } else { int spaces; p = comment_indicator_buffer; spaces = indicator_width - idlen - 2; while(spaces < len) { char *q; /* skip one word */ if((q = strchr(p, ' ')) == NULL) { p = NULL; break; } do q++; while(*q == ' '); spaces += (q - p); p = q; } if(p == NULL) { vt100_move(lyric_row, 0); vt100_clrtoeol(); memcpy(comment_indicator_buffer, lyric, len); comment_indicator_buffer[len] = '\0'; } else { int d, l, r, i, j; d = (p - comment_indicator_buffer); l = strlen(p); r = len - (indicator_width - 2 - l - d); j = d - r; for(i = 0; i < j; i++) comment_indicator_buffer[i] = ' '; for(i = 0; i < l; i++) comment_indicator_buffer[j + i] = comment_indicator_buffer[d + i]; if(sep) comment_indicator_buffer[j + i] = sep; memcpy(comment_indicator_buffer + j + i + sepoffset, lyric, len); comment_indicator_buffer[j + i + sepoffset + len] = '\0'; } } vt100_move(lyric_row, 0); fputs(comment_indicator_buffer, stdout); ctl_refresh(); reuse_mblock(&tmpbuffer); indicator_last_update = get_current_calender_time();}static void display_title(char *title){ vt100_move(title_row, 0); printf("Title:"); vt100_move(title_row++, 7); vt100_set_attr(VT100_ATTR_BOLD); printf("%s", title); vt100_reset_attr(); lyric_row = title_row + 1;}static void init_lyric(char *lang){ int i; if(ctl.trace_playing) return; msg_row = 6; for(i = 6; i <= VT100_ROWS; i++) { vt100_move(i, 0); vt100_clrtoeol(); }}static void ctl_event(CtlEvent *e){ switch(e->type) { case CTLE_NOW_LOADING: ctl_file_name((char *)e->v1); break; case CTLE_LOADING_DONE: break; case CTLE_PLAY_START: ctl_total_time((int)e->v1); break; case CTLE_PLAY_END: break; case CTLE_TEMPO: break; case CTLE_METRONOME: update_indicator(); break; case CTLE_CURRENT_TIME: ctl_current_time((int)e->v1, (int)e->v2); break; case CTLE_NOTE: ctl_note((int)e->v1, (int)e->v2, (int)e->v3, (int)e->v4); break; case CTLE_MASTER_VOLUME: ctl_master_volume((int)e->v1); break; case CTLE_PROGRAM: ctl_program((int)e->v1, (int)e->v2, (char *)e->v3); break; case CTLE_VOLUME: ctl_volume((int)e->v1, (int)e->v2); break; case CTLE_EXPRESSION: ctl_expression((int)e->v1, (int)e->v2); break; case CTLE_PANNING: ctl_panning((int)e->v1, (int)e->v2); break; case CTLE_SUSTAIN: ctl_sustain((int)e->v1, (int)e->v2); break; case CTLE_PITCH_BEND: ctl_pitch_bend((int)e->v1, (int)e->v2); break; case CTLE_MOD_WHEEL: ctl_pitch_bend((int)e->v1, e->v2 ? -1 : 0x2000); break; case CTLE_CHORUS_EFFECT: break; case CTLE_REVERB_EFFECT: break; case CTLE_LYRIC: ctl_lyric((int)e->v1); break; case CTLE_REFRESH: ctl_refresh(); break; case CTLE_RESET: ctl_reset(); break; }}/* * interface_<id>_loader(); */ControlMode *interface_T_loader(void){ return &ctl;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -