📄 wrd_read.c
字号:
{ if(!*args[i]) num = 0; else num = wrd_hexval(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } if(!*args[i]) num = 0; else num = wrd_hexval(args[i]); WRD_ADDEVENT(step_at, WRD_PAL, num) break; case WRD_PALCHG: WRD_ADDSTREVENT(step_at, WRD_PALCHG, arg0); break; case WRD_PALREV: num = atoi(arg0); WRD_ADDEVENT(step_at, WRD_PALREV, num) break; case WRD_PATH: WRD_ADDSTREVENT(step_at, WRD_PATH, arg0); break; case WRD_PLOAD: WRD_ADDSTREVENT(step_at, WRD_PLOAD, arg0); break; case WRD_REM: WRD_ADDSTREVENT(step_at, WRD_REM, arg0); break; case WRD_REMARK: WRD_ADDSTREVENT(step_at, WRD_REMARK, arg0); break; case WRD_REST: argc = wrd_split(arg0, args, 2); num = atoi(args[0]); if(mimpi_bug_emulation_level >= 9 && /* For testing */ num == 5 && wrdstep.wmode0 == 1) { WRD_BUGEMUINFO(901); num--; /* Why??? */ } wrdstep_rest(&wrdstep, num, atoi(args[1])); break; case WRD_SCREEN: /* Not supported */ break; case WRD_SCROLL: argc = wrd_split(arg0, args, 7); /*for(i = 0; i < 6; i++) { num = atoi(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = atoi(args[i]); WRD_ADDEVENT(step_at, WRD_SCROLL, num);*/ WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[0], 1)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[1], 1)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[2], 80)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[3], 25)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[4], 0)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[5], 0)); WRD_ADDEVENT(step_at, WRD_SCROLL,wrd_atoi(args[6], 32)); break; case WRD_STARTUP: version = atoi(arg0); WRD_ADDEVENT(step_at, WRD_STARTUP, version); break; case WRD_STOP: { MidiEvent e; e.time = step_at; e.type = ME_EOT; e.channel = e.a = e.b = 0; readmidi_add_event(&e); } break; case WRD_TCLS: argc = wrd_split(arg0, args, 6); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[0], 1)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[1], 1)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[2], 80)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[3], 25)); WRD_ADDEVENT(step_at, WRD_ARG, wrd_atoi(args[4], 0)); i = wrd_atoi(args[5], ' '); if(i == 0) i = ' '; WRD_ADDEVENT(step_at, WRD_TCLS,i); break; case WRD_TON: num = atoi(arg0); WRD_ADDEVENT(step_at, WRD_TON, num); break; case WRD_WAIT: argc = wrd_split(arg0, args, 2); wrdstep_wait(&wrdstep, atoi(args[0]), atoi(args[1])); break; case WRD_WMODE: argc = wrd_split(arg0, args, 2); wrdstep.wmode0 = wrd_atoi(args[0], wrdstep.wmode0); /* n */ wrdstep.wmode1 = wrd_atoi(args[1], wrdstep.wmode1); /* mode */ if(mimpi_bug_emulation_level >= 1 && (version <= 0 || version == 400)) wrd_wmode_prev_step = wrdstep.step_inc; if(argc == 1 && wrdstep.wmode0 == 0) wrdstep.step_inc = wrdstep.barstep; else { if(wrdstep.wmode0 <= 0 || wrdstep.wmode0 >= 256) { ctl->cmsg(CMSG_WARNING, VERB_NORMAL, "WRD: Out of value range: " "@WMODE(%d,%d) at line %d", wrdstep.wmode0,wrdstep.wmode1,lineno); wrdstep.step_inc = wrdstep.barstep; } else wrdstep.step_inc = (wrdstep.wmode0 + 1) * wrdstep.timebase / 24; }#ifdef DEBUG printf("Step change: wmode=%s, step=%d\n", wrdstep.wmode1 ? "char" : "line", wrdstep.step_inc);#endif /* DEBUG */ break; } break; case WRD_ECOMMAND: arg0 = (char *)wrd_tokval + 1; switch(wrd_tokval[0]) { case WRD_eFONTM: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eFONTM, num); break; case WRD_eFONTP: argc = wrd_split(arg0, args, 4); if(argc != 4) { /* Error: Number of arguments miss match */ break; } for(i = 0; i < 3; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eFONTP, num); break; case WRD_eFONTR: argc = wrd_split(arg0, args, 17); if(argc != 17) { /* Error: Number of arguments miss match */ break; } for(i = 0; i < 16; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eFONTR, num); break; case WRD_eGSC: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eGSC, num); break; case WRD_eLINE: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eLINE, num); break; case WRD_ePAL: argc = wrd_split(arg0, args, 2); if(argc != 2) { /* Error: Number of arguments miss match */ break; } num = wrd_eint(args[0]); WRD_ADDEVENT(step_at, WRD_ARG, num); num = wrd_eint(args[1]); WRD_ADDEVENT(step_at, WRD_ePAL, num); break; case WRD_eREGSAVE: argc = wrd_split(arg0, args, 17); if(argc < 2) { /* Error: Too few arguments */ break; } for(i = 0; i < 16; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eREGSAVE, num); break; case WRD_eSCROLL: argc = wrd_split(arg0, args, 2); if(argc != 2) { /* Error: Number of arguments miss match */ break; } num = wrd_eint(args[0]); WRD_ADDEVENT(step_at, WRD_ARG, num); num = wrd_eint(args[1]); WRD_ADDEVENT(step_at, WRD_eSCROLL, num); break; case WRD_eTEXTDOT: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eTEXTDOT, num); break; case WRD_eTMODE: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eTMODE, num); break; case WRD_eTSCRL: num = wrd_eint(arg0); WRD_ADDEVENT(step_at, WRD_eTSCRL, num); break; case WRD_eVCOPY: argc = wrd_split(arg0, args, 9); if(argc != 9) { /* Error: Number of arguments miss match */ break; } for(i = 0; i < 8; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eVCOPY, num); break; case WRD_eVSGET: argc = wrd_split(arg0, args, 4); if(argc < 1) { /* Error: Too few arguments */ break; } for(i = 0; i < 3; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eVSGET, num); break; case WRD_eVSRES: WRD_ADDEVENT(step_at, WRD_eVSRES, WRD_NOARG); break; case WRD_eXCOPY: argc = wrd_split(arg0, args, 14); if(argc < 9) { /* Error: Too few arguments */ break; } for(i = 0; i < 13; i++) { num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_ARG, num); } num = wrd_eint(args[i]); WRD_ADDEVENT(step_at, WRD_eXCOPY, num); break; default: ctl->cmsg(CMSG_WARNING, VERB_NORMAL, "WRD: Unknown WRD command at line %d (Ignored)", lineno); break; } break; case WRD_STEP: if(wrd_wmode_prev_step == 0 || wrd_wmode_prev_step == wrdstep.barstep || wrdstep.step_inc == wrdstep.barstep) wrdstep_inc(&wrdstep, wrdstep.step_inc); else { if(wrd_wmode_prev_step != wrdstep.step_inc) WRD_BUGEMUINFO(103); wrdstep_inc(&wrdstep, wrd_wmode_prev_step); } wrd_wmode_prev_step = 0; break; case WRD_LYRIC: if(wrdstep.wmode1 == 0) { i = (int32)strlen((char *)wrd_tokval); if(i > 0 && wrd_tokval[i - 1] == ';') wrd_add_lyric(step_at, (char *)wrd_tokval, i - 1); else { wrd_add_lyric(step_at, (char *)wrd_tokval, i); WRD_ADDEVENT(step_at, WRD_NL, WRD_NOARG); wrdstep_inc(&wrdstep, wrdstep.step_inc); } } else { unsigned char *val, *lyric; int barcheck; val = (unsigned char *)wrd_tokval; barcheck = 0; for(;;) { if(*val == ';' && *(val + 1) == '\0') break; if(*val == '\0') { WRD_ADDEVENT(step_at, WRD_NL, WRD_NOARG); wrdstep_inc(&wrdstep, wrdstep.step_inc); break; } if(*val == '\\') { lyric = ++val; wrd_add_lyric(step_at, (char *) lyric, 1); wrdstep_inc(&wrdstep, wrdstep.step_inc); } else if(*val == '|') { lyric = ++val; while(*val && *val != '|') { if( IS_MULTI_BYTE(*val) || *val == '\\') { val++; if(!*val) break; } val++; } i = val - lyric; if(*val == '|') val++; wrd_add_lyric(step_at, (char *) lyric, i); /* Why does /^\|[^\|]+\|$/ takes only one waiting ? */ if(mimpi_bug_emulation_level >= 2 && version == 427 && barcheck == 0 && *val == '\0') { WRD_BUGEMUINFO(204); WRD_ADDEVENT(step_at, WRD_NL, WRD_NOARG); wrdstep_inc(&wrdstep, wrdstep.step_inc); break; } wrdstep_inc(&wrdstep, wrdstep.step_inc); barcheck++; } else { lyric = val; if( IS_MULTI_BYTE(*val) ) val++; if(*val++ == '\0') break; i = val - lyric; if(*lyric != '_') wrd_add_lyric(step_at, (char *) lyric, i); wrdstep_inc(&wrdstep, wrdstep.step_inc); } } } break; case WRD_EOF: goto end_of_wrd; default: break; } } end_of_wrd: while(wrdstep.de) wrdstep_nextbar(&wrdstep); reuse_mblock(&wrdstep.pool); close_file(tf);#ifdef DEBUG fflush(stdout);#endif /* DEBUG */ return WRD_TRACE_MIMPI;#undef step_at}static struct wrd_delayed_event *wrd_delay_cmd(struct wrd_step_tracer *wrdstep, int32 waittime, int cmd, int arg){ struct wrd_delayed_event *p; struct wrd_delayed_event *insp, *prev; if(wrdstep->free_de != NULL) { p = wrdstep->free_de; wrdstep->free_de = wrdstep->free_de->next; } else p = (struct wrd_delayed_event *) new_segment(&wrdstep->pool, sizeof(struct wrd_delayed_event)); p->waittime = waittime; p->cmd = cmd; p->arg = arg; prev = NULL; for(insp = wrdstep->de; insp != NULL && insp->waittime <= waittime; prev = insp, insp = insp->next) ; if(prev == NULL) { p->next = wrdstep->de; wrdstep->de = p; } else { prev->next = p; p->next = insp; }#ifdef DEBUG printf("Delay events:"); for(insp = wrdstep->de; insp != NULL; insp = insp->next) printf(" @%s/%d", wrd_name_string(insp->cmd), insp->waittime); printf("\n");#endif /* DEBUG */ return p;}static void wrdstep_update_forward(struct wrd_step_tracer *wrdstep){ int lastidx; lastidx = wrdstep->timeidx; while(wrdstep->timeidx < wrdstep->ntimesig && wrdstep->timesig[wrdstep->timeidx + 1].time <= wrdstep->at) wrdstep->timeidx++; if(lastidx != wrdstep->timeidx) { wrdstep->barstep = wrdstep->timesig[wrdstep->timeidx].a * wrdstep->timebase * 4 / wrdstep->timesig[wrdstep->timeidx].b;#ifdef DEBUG printf("Time signature is changed: %d/%d barstep=%d\n", wrdstep->timesig[wrdstep->timeidx].a, wrdstep->timesig[wrdstep->timeidx].b, wrdstep->barstep);#endif /* DEBUG */ /* if(wrdstep->barstep < wrdstep->step) { WRD ERROR?? } */ }}static void wrdstep_update_backward(struct wrd_step_tracer *wrdstep){ int lastidx; lastidx = wrdstep->timeidx; while(wrdstep->timeidx > 0 && wrdstep->timesig[wrdstep->timeidx].time > wrdstep->at) wrdstep->timeidx--; if(lastidx != wrdstep->timeidx) { wrdstep->barstep = wrdstep->timesig[wrdstep->timeidx].a * wrdstep->timebase * 4 / wrdstep->timesig[wrdstep->timeidx].b;#ifdef DEBUG printf("Time signature is changed: %d/%d barstep=%d\n", wrdstep->timesig[wrdstep->timeidx].a, wrdstep->timesig[wrdstep->timeidx].b, wrdstep->barstep);#endif /* DEBUG */ /* if(wrdstep->barstep < wrdstep->step) { WRD ERROR?? } */ }}static void wrdstep_nextbar(struct wrd_step_tracer *wrdstep){ wrdstep_inc(wrdstep, wrdstep->barstep - wrdstep->step);}static void wrdstep_prevbar(struct wrd_step_tracer *wrdstep){ if(wrdstep->bar == 0) return; wrdstep_inc(wrdstep, -wrdstep->step); wrdstep_inc(wrdstep, -wrdstep->barstep);}static void wrdstep_setstep(struct wrd_step_tracer *wrdstep, int step){ if(step > wrdstep->barstep) /* Over step! */ step = wrdstep->barstep; wrdstep_inc(wrdstep, step - wrdstep->step);}static void wrdstep_inc(struct wrd_step_tracer *wrdstep, int32 inc){ int inc_save = inc; do { if(wrdstep->de == NULL) { wrdstep->at += inc; break; } else { struct wrd_delayed_event *p, *q, *qtail; int32 w; w = inc; /* Note that: if inc < 0, w always equals inc. */ for(p = wrdstep->de; p; p = p->next) if(w > p->waittime) w = p->waittime; q = qtail = NULL; p = wrdstep->de; while(p) { struct wrd_delayed_event *next; p->waittime -= w;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -