📄 ncurs_c.c
字号:
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 + -