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

📄 wrd_read.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 4 页
字号:
		{		    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 + -