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

📄 ncurs_c.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 5 页
字号:
		       tonebank[0]->tone[pr].instrument == prog->instrument)		    {			b = 0;			bank = tonebank[0];			prog = &bank->tone[pr];		    }		}		else		    type = -1;		wprintw(dftwin, "%d Bank %d/%d=>%d Prog %d",			type,			ChannelStatus[ch].bank_msb,			ChannelStatus[ch].bank_lsb,			b,			ChannelStatus[ch].prog + progbase);		if(type == INST_GUS)		{		    if(prog->name)		    {			waddch(dftwin, ' ');			waddstr(dftwin, prog->name);		    }		    if(prog->comment != NULL)			wprintw(dftwin, "(%s)", prog->comment);		}		else if(type == INST_SF2)		{		    char *name, *fn;		    waddstr(dftwin, " (SF ");		    if(prog->instype == 1)		    {			/* Restore original one */			b = prog->font_bank;			pr = prog->font_preset;		    }		    name = soundfont_preset_name(b, pr, -1, &fn);		    if(name == NULL && b != 0)		    {			if((name = soundfont_preset_name(0, pr, -1, &fn)) != NULL)			    b = 0;		    }		    wprintw(dftwin, "%d,%d", b, pr + progbase);		    if(name != NULL)		    {			char *p;			if((p = pathsep_strrchr(fn)) != NULL)			    p++;			else			    p = fn;			wprintw(dftwin, ",%s", name, p);		    }		    waddch(dftwin, ')');		}	    }	}    }}static void init_chan_status(void){    int ch;    for(ch = 0; ch < MAX_CHANNELS; ch++)    {	ChannelStatus[ch].mute = temper_type_mute & 1;	ChannelStatus[ch].bank = 0;	ChannelStatus[ch].bank_msb = 0;	ChannelStatus[ch].bank_lsb = 0;	ChannelStatus[ch].prog = 0;	ChannelStatus[ch].tt = 0;	ChannelStatus[ch].is_drum = ISDRUMCHANNEL(ch);	ChannelStatus[ch].vol = 0;	ChannelStatus[ch].exp = 0;	ChannelStatus[ch].pan = NO_PANNING;	ChannelStatus[ch].sus = 0;	ChannelStatus[ch].pitch = 0x2000;	ChannelStatus[ch].wheel = 0;	ChannelStatus[ch].bend_mark = ' ';	ChannelStatus[ch].last_note_on = 0.0;	ChannelStatus[ch].comm = NULL;    }}static void display_play_system(int mode){    wmove(dftwin, TIME_LINE, 22);    switch(mode)    {      case GM_SYSTEM_MODE:	waddstr(dftwin, "[GM]");	break;      case GS_SYSTEM_MODE:	waddstr(dftwin, "[GS]");	break;      case XG_SYSTEM_MODE:	waddstr(dftwin, "[XG]");	break;      default:	waddstr(dftwin, "    ");	break;    }    scr_modified_flag = 1;}static void display_intonation(int mode){	wmove(dftwin, TIME_LINE, 28);	waddstr(dftwin, (mode == 1) ? "[PureInt]" : "         ");	scr_modified_flag = 1;}static void ctl_ncurs_mode_init(void){    int i;    display_channels = LINES - 8;    if(display_channels > MAX_CHANNELS)	display_channels = MAX_CHANNELS;    if(current_file_info != NULL && current_file_info->max_channel < 16)	display_channels = 16;    display_play_system(play_system_mode);    display_intonation(opt_pure_intonation);    switch(ctl_ncurs_mode)    {      case NCURS_MODE_MAIN:	touchwin(msgwin);	wrefresh(msgwin);	break;      case NCURS_MODE_TRACE:	touchwin(dftwin);	for(i = 0; i < MAX_CHANNELS; i++)	    init_trace_window_chan(i);	N_ctl_refresh();	break;      case NCURS_MODE_HELP:	break;      case NCURS_MODE_LIST:	touchwin(listwin);	ctl_list_mode(NC_LIST_NOW);	break;      case NCURS_MODE_DIR:	ctl_cmd_L_dir(0);	break;    }}static void display_key_helpmsg(void){    if(ctl_cmdmode || ctl_ncurs_mode == NCURS_MODE_HELP)    {	if(!ctl.trace_playing)	{	    wmove(dftwin, HELP_LINE, 0);	    waddstr(dftwin, "Press 'h' for help with keys, or 'q' to quit.");	    N_ctl_refresh();	}	return;    }    N_ctl_clrtoeol(LINES - 1);    if(!ctl.trace_playing)	wmove(dftwin, HELP_LINE, 0);    waddstr(dftwin, "Press 'h' for help with keys, or 'q' to quit.");    N_ctl_refresh();}static void ctl_help_mode(void){    static WINDOW *helpwin;    if(ctl_ncurs_mode == NCURS_MODE_HELP)    {	ctl_ncurs_mode = ctl_ncurs_back;	touchwin(dftwin);	delwin(helpwin);	N_ctl_refresh();	ctl_ncurs_mode_init();	display_key_helpmsg();    }    else    {	int i;	static char *help_message_list[] =	{"V/Up=Louder    b/Left=Skip back      n/Next=Next file      r/Home=Restart file","v/Down=Softer  f/Right=Skip forward  p/Prev=Previous file  q/End=Quit program","h/?=Help mode  s=Toggle pause        E=ExtMode-Setting","+=Key up       -=Key down            >=Speed up            <=Speed down","O=Voices up    o=Voices down         c/j/C/k=Move channel  d=Toggle drum prt.","J=Jump         L=Load & play (TAB: File completion)        t=Toggle trace mode","%=Display velocity (toggle)          D=Drum change         S=Save as","R=Change rate  Space=Toggle ch. mute .=Solo ch. play       /=Clear ch. mute",#ifdef SUPPORT_SOUNDSPEC"g=Open sound spectrogram window",#else"",#endif /* SUPPORT_SOUNDSPEC */"","l/INS=List mode","k/Up=Cursor up         j/Down=Cursor down Space=Select and play","p=Previous file play   n=Next file play   RollUp=Page up   RollDown=Page down","/=Search file",NULL};	ctl_ncurs_back = ctl_ncurs_mode;	ctl_ncurs_mode = NCURS_MODE_HELP;	helpwin = newwin(LIST_TITLE_LINES, COLS, TITLE_LINE, 0);	N_ctl_werase(helpwin);	wattron(helpwin, A_BOLD);	waddstr(helpwin, "                 ncurses interface Help");	wattroff(helpwin, A_BOLD);	for(i = 0; help_message_list[i]; i++)	{	    wmove(helpwin, i+1,0);	    waddstr(helpwin, help_message_list[i]);	}	wmove(helpwin, i+2,0);	wattron(helpwin, A_BOLD);	waddstr(helpwin,		"                   Type `h' to go to previous screen");	wattroff(helpwin, A_BOLD);	wrefresh(helpwin);	N_ctl_clrtoeol(LINES - 1);	N_ctl_refresh();    }}static MFnode *MFnode_nth_cdr(MFnode *p, int n){    while(p != NULL && n-- > 0)	p = p->next;    return p;}static void ctl_list_MFnode_files(MFnode *mfp, int select_id, int play_id){    int i, mk;#ifdef MIDI_TITLE    char *item, *f, *title;    int tlen, flen, mlen;#ifdef DISPLAY_MID_MODE    char *mname;#endif /* DISPLAY_MID_MODE */#endif /* MIDI_TITLE */    N_ctl_werase(listwin);    mk = 0;    for(i = 0; i < LIST_TITLE_LINES && mfp; i++, mfp = mfp->next)    {	if(i == select_id || i == play_id)	{	    mk = 1;	    wattron(listwin,A_REVERSE);	}	wmove(listwin, i, 0);	wprintw(listwin,"%03d%c",		i + ctl_list_from[ctl_listmode],		i == play_id ? '*' : ' ');#ifdef MIDI_TITLE	if((f = pathsep_strrchr(mfp->file)) != NULL)	    f++;	else	    f = mfp->file;	flen = strlen(f);	title = mfp->title;	if(title != NULL)	{	    while(*title == ' ')		title++;	    tlen = strlen(title) + 1;	}	else	    tlen = 0;#ifdef DISPLAY_MID_MODE	mname = mid2name(mfp->infop->mid);	if(mname != NULL)	    mlen = strlen(mname);	else	    mlen = 0;#else	mlen = 0;#endif /* DISPLAY_MID_MODE */	item = (char *)new_segment(&tmpbuffer, tlen + flen + mlen + 4);	if(title != NULL)	{	    strcpy(item, title);	    strcat(item, " ");	}	else	    item[0] = '\0';	strcat(item, "(");	strcat(item, f);	strcat(item, ")");#ifdef DISPLAY_MID_MODE	if(mlen)	{	    strcat(item, "/");	    strcat(item, mname);	}#endif /* DISPLAY_MID_MODE */	waddnstr(listwin, item, COLS-6);	reuse_mblock(&tmpbuffer);#else	waddnstr(listwin, mfp->file, COLS-6);#endif	if(mk)	{	    mk = 0;	    wattroff(listwin,A_REVERSE);	}    }}static void ctl_list_mode(int type){  for(ctl_listmode_play=1;;ctl_listmode_play++) {    if(ctl_list_from[ctl_listmode_play]<=nc_playfile       &&nc_playfile<=ctl_list_to[ctl_listmode_play])      break;  }  switch(type){  case NC_LIST_PREV:    if(ctl_listmode<=1)      ctl_listmode=ctl_listmode_max;    else      ctl_listmode--;    break;  case NC_LIST_NEXT:    if(ctl_listmode>=ctl_listmode_max)      ctl_listmode=1;    else      ctl_listmode++;    break;  case NC_LIST_UP:    if(ctl_list_select[ctl_listmode]<=ctl_list_from[ctl_listmode]){      if(ctl_listmode<=1)	ctl_listmode=ctl_listmode_max;      else	ctl_listmode--;      ctl_list_select[ctl_listmode]=ctl_list_to[ctl_listmode];    } else      ctl_list_select[ctl_listmode]--;    break;  case NC_LIST_DOWN:    if(ctl_list_select[ctl_listmode]>=ctl_list_to[ctl_listmode]){      if(ctl_listmode>=ctl_listmode_max)	ctl_listmode=1;      else	ctl_listmode++;      ctl_list_select[ctl_listmode]=ctl_list_from[ctl_listmode];    } else	ctl_list_select[ctl_listmode]++;    break;  case NC_LIST_UPPAGE:    if(ctl_listmode<=1)      ctl_listmode=ctl_listmode_max;    else	ctl_listmode--;    ctl_list_select[ctl_listmode]=ctl_list_to[ctl_listmode];    break;  case NC_LIST_DOWNPAGE:    if(ctl_listmode>=ctl_listmode_max)      ctl_listmode=1;    else	ctl_listmode++;    ctl_list_select[ctl_listmode]=ctl_list_from[ctl_listmode];    break;  case NC_LIST_PLAY:    if(ctl_ncurs_mode == NCURS_MODE_LIST)    {	/* leave list mode */	if(ctl.trace_playing)	    ctl_ncurs_mode = NCURS_MODE_TRACE;	else	    ctl_ncurs_mode = NCURS_MODE_MAIN;	ctl_ncurs_mode_init();    }    else    {	/* enter list mode */	ctl_ncurs_mode = NCURS_MODE_LIST;    }    ctl_ncurs_back = ctl_ncurs_mode;    break;  case NC_LIST_NEW:    ctl_listmode=ctl_listmode_play;    ctl_list_select[ctl_listmode]=nc_playfile;    break;  case NC_LIST_NOW:    break;  default:    ;  }  if(ctl_ncurs_mode == NCURS_MODE_LIST)    {	int i;	MFnode *mfp;	i = ctl_list_from[ctl_listmode];	mfp = MFnode_nth_cdr(file_list.MFnode_head, i);	ctl_list_MFnode_files(mfp, ctl_list_select[ctl_listmode] - i,			   nc_playfile - i);	wrefresh(listwin);	N_ctl_refresh();    }}static void redraw_all(void){    N_ctl_scrinit();    ctl_total_time(CTL_STATUS_UPDATE);    ctl_master_volume(CTL_STATUS_UPDATE);    ctl_metronome(CTL_STATUS_UPDATE, CTL_STATUS_UPDATE);    ctl_keysig(CTL_STATUS_UPDATE, CTL_STATUS_UPDATE);    ctl_tempo(CTL_STATUS_UPDATE, CTL_STATUS_UPDATE);    ctl_temper_keysig(CTL_STATUS_UPDATE, CTL_STATUS_UPDATE);    display_key_helpmsg();    ctl_file_name(NULL);    ctl_ncurs_mode_init();}static void ctl_event(CtlEvent *e){    if(midi_trace.flush_flag)	return;    switch(e->type)    {      case CTLE_NOW_LOADING:	ctl_file_name((char *)e->v1);	break;      case CTLE_LOADING_DONE:	redraw_all();	break;      case CTLE_PLAY_START:	init_chan_status();	ctl_ncurs_mode_init();	ctl_total_time((int)e->v1);	break;      case CTLE_PLAY_END:	break;      case CTLE_CURRENT_TIME:	ctl_current_time((int)e->v1, (int)e->v2);	display_aq_ratio();	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_METRONOME:		ctl_metronome((int) e->v1, (int) e->v2);		update_indicator();		break;	case CTLE_KEYSIG:		ctl_keysig((int8) e->v1, CTL_STATUS_UPDATE);		break;	case CTLE_KEY_OFFSET:		ctl_keysig(CTL_STATUS_UPDATE, (int) e->v1);		ctl_temper_keysig(CTL_STATUS_UPDATE, (int) e->v1);		break;	case CTLE_TEMPO:		ctl_tempo((int) e->v1, CTL_STATUS_UPDATE);		break;	case CTLE_TIME_RATIO:		ctl_tempo(CTL_STATUS_UPDATE, (int) e->v1);		break;	case CTLE_TEMPER_KEYSIG:		ctl_temper_keysig((int8) e->v1, CTL_STATUS_UPDATE);		break;	case CTLE_TEMPER_TYPE:		ctl_temper_type((int) e->v1, (int8) e->v2);		break;	case CTLE_MUTE:		ctl_mute((int) e->v1, (int) e->v2);		break;      case CTLE_PROGRAM:	ctl_program((int)e->v1, (int)e->v2, (char *)e->v3, (unsigned int)e->v4);	break;      case CTLE_DRUMPART:	ctl_drumpart((int)e->v1, (int)e->v2);	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_mod_wheel((int)e->v1, (int)e->v2);	break;      case CTLE_CHORUS_EFFECT:	break;      case CTLE_REVERB_EFFECT:	break;      case CTLE_LYRIC:	ctl_lyric((int)e->v1);	break;      case CTLE_GSLCD:	if(is_display_lcd)	    ctl_gslcd((int)e->v1);	break;      case CTLE_REFRESH:	ctl_refresh();	break;      case CTLE_RESET:	ctl_reset();	break;      case CTLE_SPEANA:	break;      case CTLE_PAUSE:	ctl_current_time((int)e->v2, 0);	N_ctl_refresh();	break;    }}static void ctl_total_time(int tt){    static int last_tt = CTL_STATUS_UPDATE;    int mins, secs;    if(tt == CTL_STATUS_UPDATE)	tt = last_tt;    else	last_tt = tt;    secs=tt/play_mode->rate;    mins=secs/60;    secs-=mins*60;    wmove(dftwin, TIME_LINE,6+6+1);    wattron(dftwin, A_BOLD);    wprintw(dftwin, "%3d:%02d  ", mins, secs);    wattroff(dftwin, A_BOLD);    ctl_current_time(CTL_STATUS_INIT, 0); /* Init. */    ctl_current_time(0, 0);    N_ctl_refresh();}static void ctl_master_volume(int mv){    static int lastvol = CTL_STATUS_UPDATE;    if(mv == CTL_STATUS_UPDATE)	mv = lastvol;    else	lastvol = mv;    wmove(dftwin, VOICE_LINE,COLS-5);    wattron(dftwin, A_BOLD);    wprintw(dftwin, "%03d %%", mv);    wattroff(dftwin, A_BOLD);    N_ctl_refresh();}static void ctl_metronome(int meas, int beat){	static int lastmeas = CTL_STATUS_UPDATE;	static int lastbeat = CTL_STATUS_UPDATE;		if (meas == CTL_STATUS_UPDATE)		meas = lastmeas;	else		lastmeas = meas;	if (beat == CTL_STATUS_UPDATE)		beat = lastbeat;	else		lastbeat = beat;	wmove(dftwin, SEPARATE1_LINE, 6);	wattron(dftwin, A_BOLD);	wprintw(dftwin, "%03d.%02d ", meas, beat);	wattroff(dftwin, A_BOLD);	N_ctl_refresh();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -