⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vt100_c.c

📁 linux上播放midi音乐,但是要一些设置.可网上查找. 软件名称: TiMidity++-2.13.0.tar
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -