1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20 */
21 
22 /*
23  * WRD Tracer for vt100 control terminal
24  * Written by Takanori Watanabe <takawata@shidahara1.planet.kobe-u.ac.jp>
25  */
26 
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif /* HAVE_CONFIG_H */
30 #include <stdio.h>
31 #ifndef NO_STRING_H
32 #include <string.h>
33 #else
34 #include <strings.h>
35 #endif
36 #include "timidity.h"
SS37 #include "common.h"
38 #include "instrum.h"
39 #include "playmidi.h"
40 #include "readmidi.h"
41 #include "controls.h"
42 #include "wrd.h"
43 
44 static int wrdt_open(char *dummy);
45 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[]);
tmain()46 static void wrdt_update_events(void);
47 static void wrdt_end(void);
48 static void wrdt_close(void);
49 #define NO_GRAPHIC_SUPPORT
50 #define wrdt tty_wrdt_mode
51 
52 WRDTracer wrdt =
53 {
54     "TTY WRD tracer", 't',
55     0,
56     wrdt_open,
57     wrdt_apply,
58     NULL,
59     wrdt_update_events,
60     NULL,
main()61     wrdt_end,
62     wrdt_close
63 };
64 
65 static int inkey_flag;
66 
67 static int wrdt_open(char *dummy)
68 {
__anon4b1d5fc70102() 69 
70     wrdt.opened = 1;
71     inkey_flag = 0;
72     return 0;
73 }
74 
75 static void wrdt_update_events(void)
76 {
77 }
78 
79 static void wrdt_end(void)
80 {
81     printf("\033[0m\n");/*Restore Attributes*/
82     inkey_flag = 0;
83 }
84 
85 static void wrdt_close(void)
86 {
87     printf("\033[0m");
88     fflush(stdout);
89     wrdt.opened = 0;
90     inkey_flag = 0;
91 }
92 
93 static char *wrd_event2string(int id)
94 {
95     char *name;
96 
97     name = event2string(id);
98     if(name != NULL)
99 	return name + 1;
100     return "";
101 }
102 
103 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[])
104 {
105     char *p;
106     char *text;
107     int i, len;
108     static int txtclr_preserve=0;
109 
110 #if 0
111     if(inkey_flag)
112 	printf("* ");
113 #endif
114     switch(cmd)
115     {
116       case WRD_LYRIC:
117 	p = wrd_event2string(wrd_args[0]);
118 	len = strlen(p);
119 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
120 
121 	/*This must be not good thing,but as far as I know no wrd file
122 	  written in EUC-JP code found*/
123 
124 	code_convert(p, text, SAFE_CONVERT_LENGTH(len), "SJIS", (char *)-1);
125 	printf("%s",text);
126 	fflush(stdout);
127 	reuse_mblock(&tmpbuffer);
128 	break;
129       case WRD_NL: /* Newline (Ignored) */
130 	putchar('\n');
131 	break;
132       case WRD_COLOR:
133 	txtclr_preserve=wrd_args[0];
134 	if(16 <= txtclr_preserve && txtclr_preserve <= 23)
135 	    txtclr_preserve = wrd_color_remap[txtclr_preserve - 16] + 30;
136 	printf("\033[%dm", txtclr_preserve);
137 	break;
138       case WRD_END: /* Never call */
139 	break;
140       case WRD_ESC:
141 	printf("\033[%s", wrd_event2string(wrd_args[0]));
142 	break;
143       case WRD_EXEC:
144 	/*I don't spaun another program*/
145 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
146 		  "@EXEC(%s)", wrd_event2string(wrd_args[0]));
__anon4b1d5fc70202() 147 	break;
148       case WRD_FADE:
149 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
150 		  "@FADE(%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2]);
151 	break;
152       case WRD_FADESTEP:
153 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
154 		  "@FADESTEP(%d/%d)", wrd_args[0], WRD_MAXFADESTEP);
155 	break;
156       case WRD_GCIRCLE:
157 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
158 		  "@GCIRCLE(%d,%d,%d,%d,%d,%d)",
159 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
160 		  wrd_args[4], wrd_args[5]);
161 	break;
162       case WRD_GCLS:
163 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
164 		  "@GCLS(%d)", wrd_args[0]);
165 	break;
166       case WRD_GINIT:
167 	ctl->cmsg(CMSG_INFO, VERB_DEBUG, "@GINIT()");
168 	break;
169       case WRD_GLINE:
170 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
171 		  "@GLINE(%d,%d,%d,%d,%d,%d,%d)",
172 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
173 	       wrd_args[5], wrd_args[6]);
174 	fflush(stdout);
175 	break;
176       case WRD_GMODE:
177 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
178 		  "@GMODE(%d)", wrd_args[0]);
179 	break;
180       case WRD_GMOVE:
181 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
182 		  "@GMOVE(%d,%d,%d,%d,%d,%d,%d)",
183 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
184 	       wrd_args[5], wrd_args[6], wrd_args[7], wrd_args[8]);
185 	break;
186       case WRD_GON:
187 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
188 		  "@GON(%d)", wrd_args[0]);
189 	break;
190       case WRD_GSCREEN:
191 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
192 		  "@GSCREEN(%d,%d)", wrd_args[0], wrd_args[1]);
193 	break;
194       case WRD_INKEY:
195 	inkey_flag = 1;
196 	ctl->cmsg(CMSG_INFO, VERB_DEBUG, "@INKEY - begin");
197 	break;
198       case WRD_OUTKEY:
199 	inkey_flag = 0;
200 	ctl->cmsg(CMSG_INFO, VERB_DEBUG, "@INKEY - end");
201 	break;
202       case WRD_LOCATE:
203 	printf("\033[%d;%dH", wrd_args[1], wrd_args[0]);
204 	break;
205       case WRD_LOOP: /* Never call */
206 	break;
207       case WRD_MAG:
208 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
209         snprintf(p, MIN_MBLOCK_SIZE-1, "@MAG(%s", wrd_event2string(wrd_args[0]));
210         p[MIN_MBLOCK_SIZE-1] = '\0'; /* fail safe */
211 	for(i = 1; i < 5; i++)
212 	{
213 	    if(wrd_args[i] == WRD_NOARG)
214 		strncat(p, ",*", MIN_MBLOCK_SIZE - strlen(p) - 1);
215 	    else {
216 		char q[CHAR_BIT*sizeof(int)];
217 		snprintf(q, sizeof(q)-1, ",%d", wrd_args[i]);
218 		strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
219             }
220 	}
221         strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
222 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
223 	reuse_mblock(&tmpbuffer);
224 	break;
225       case WRD_MIDI: /* Never call */
226 	break;
227       case WRD_OFFSET: /* Never call */
228 	break;
229       case WRD_PAL:
230 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
231 	snprintf(p, MIN_MBLOCK_SIZE, "@PAL(%03x", wrd_args[0]);
232 	for(i = 1; i < 17; i++) {
233 	    char q[5];
234 	    snprintf(q, sizeof(q)-1, ",%03x", wrd_args[i]);
235 	    strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
236 	}
237 	strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
238 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
239 	reuse_mblock(&tmpbuffer);
240 	break;
241       case WRD_PALCHG:
242 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
243 		  "@PALCHG(%s)", wrd_event2string(wrd_args[0]));
244 	break;
245       case WRD_PALREV:
246 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
247 		  "@PALREV(%d)", wrd_args[0]);
248 	break;
249       case WRD_PATH:
250 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
251 		  "@PATH(%s)", wrd_event2string(wrd_args[0]));
252 	break;
253       case WRD_PLOAD:
254 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
255 		  "@PLOAD(%s)", wrd_event2string(wrd_args[0]));
256 	break;
257       case WRD_REM:
258 	p = wrd_event2string(wrd_args[0]);
259 	len = strlen(p);
260 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
261 	code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL);
262 	ctl->cmsg(CMSG_INFO, VERB_DEBUG, "@REM %s", text);
263 	reuse_mblock(&tmpbuffer);
264 	break;
265       case WRD_REMARK:
266 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
267 		  "@REMARK(%s)", wrd_event2string(wrd_args[0]));
268 	break;
269       case WRD_REST: /* Never call */
270 	break;
271       case WRD_SCREEN: /* Not supported */
272 	break;
273       case WRD_SCROLL:
274 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
275 		  "@SCROLL(%d,%d,%d,%d,%d,%d,%d)",
276 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
277 		  wrd_args[4], wrd_args[5], wrd_args[6]);
278 	break;
279       case WRD_STARTUP:
280 	inkey_flag = 0;
281 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
282 		  "@STARTUP(%d)", wrd_args[0]);
283 	printf("\033[0m\033[H\033[J");
284 	fflush(stdout);
285 	break;
286       case WRD_STOP: /* Never call */
287 	break;
288 
289       case WRD_TCLS:
290 	{
291 	  char fillbuf[1024];
292 	  fillbuf[0]=0x1b;
293 	  fillbuf[1]='7';
294 	  fillbuf[2]=0;
295 	  printf("%s", fillbuf);
296 
297 	  /* 0-7: normal, 8-16: reverse */
298 	  if(wrd_args[4] <= 7)
299 	      wrd_args[4] += 30;
300 	  else
301 	      wrd_args[4] += 32;
302 	  printf("\033[%dm",wrd_args[4]);
303 
304 	  memset(fillbuf,wrd_args[5],wrd_args[2]-wrd_args[0]);/*X2-X1*/
305 	  fillbuf[wrd_args[2]-wrd_args[0]]=0;
306 	  for(i=wrd_args[1];i<=wrd_args[3];i++)/*Y1 to Y2*/
307 	    printf("\033[%d;%dH%s",i,wrd_args[0],fillbuf);/*X1to....*/
308 	  fillbuf[0]=0x1b;
309 	  fillbuf[1]='8';
310 	  fillbuf[2]=0;
311 	  printf("%s", fillbuf);
312 	  printf("\033[%dm",txtclr_preserve);
313 	  fflush(stdout);
314 	}
315 #if 0
316 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
317 		  "@TCLS(%d,%d,%d,%d,%d,%d,%d)",
318 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
319 		  wrd_args[4], wrd_args[5]);
320 #endif
321 	break;
322       case WRD_TON:
323 	ctl->cmsg(CMSG_INFO, VERB_DEBUG,
324 		  "@TON(%d)", wrd_args[0]);
325 	break;
326       case WRD_WAIT: /* Never call */
327 	break;
328       case WRD_WMODE: /* Never call */
329 	break;
330 
331 	/* Ensyutsukun */
332       case WRD_eFONTM:
333 	break;
334       case WRD_eFONTP:
335 	break;
336       case WRD_eFONTR:
337 	break;
338       case WRD_eGSC:
339 	break;
340       case WRD_eLINE:
341 	break;
342       case WRD_ePAL:
343 	break;
344       case WRD_eREGSAVE:
345 	break;
346       case WRD_eSCROLL:
347 	break;
348       case WRD_eTEXTDOT:
349 	break;
350       case WRD_eTMODE:
351 	break;
352       case WRD_eTSCRL:
353 	break;
354       case WRD_eVCOPY:
355 	break;
356       case WRD_eVSGET:
357 	break;
358       case WRD_eVSRES:
359 	break;
360       case WRD_eXCOPY:
361 	break;
362       default:
363 	break;
364     }
365     wrd_argc = 0;
366 }
367