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 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif /* HAVE_CONFIG_H */
25 #include <stdio.h>
26 #ifndef NO_STRING_H
27 #include <string.h>
28 #else
29 #include <strings.h>
30 #endif
31 #include "timidity.h"
32 #include "common.h"
33 #include "instrum.h"
34 #include "playmidi.h"
35 #include "readmidi.h"
36 #include "controls.h"
37 #include "wrd.h"
38 
39 static int wrdt_open(char *wrdt_opts);
40 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[]);
41 static void wrdt_update_events(void);
42 static void wrdt_end(void);
43 static void wrdt_close(void);
44 
45 #define wrdt dumb_wrdt_mode
46 
47 WRDTracer wrdt =
48 {
49     "dumb WRD tracer", 'd',
50     0,
51     wrdt_open,
52     wrdt_apply,
53     NULL,
54     wrdt_update_events,
55     NULL,
56     wrdt_end,
57     wrdt_close
58 };
59 
60 static int inkey_flag;
61 
62 /*ARGSUSED*/
wrdt_open(char * wrdt_opts)63 static int wrdt_open(char *wrdt_opts)
64 {
65     wrdt.opened = 1;
66     inkey_flag = 0;
67     return 0;
68 }
69 
wrdt_update_events(void)70 static void wrdt_update_events(void)
71 {
72 }
73 
wrdt_end(void)74 static void wrdt_end(void)
75 {
76     inkey_flag = 0;
77 }
78 
wrdt_close(void)79 static void wrdt_close(void)
80 {
81     wrdt.opened = 0;
82     inkey_flag = 0;
83 }
84 
wrd_event2string(int id)85 static char *wrd_event2string(int id)
86 {
87     char *name;
88 
89     name = event2string(id);
90     if(name != NULL)
91 	return name + 1;
92     return "";
93 }
94 
wrdt_apply(int cmd,int wrd_argc,int wrd_args[])95 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[])
96 {
97     char *p;
98     char *text;
99     int i, len;
100 
101     if(cmd == WRD_MAGPRELOAD)
102 	return; /* Load MAG file */
103     if(cmd == WRD_PHOPRELOAD)
104 	return; /* Load PHO file - Not implemented */
105 
106     if(inkey_flag)
107 	printf("* ");
108     switch(cmd)
109     {
110       case WRD_LYRIC:
111 	p = wrd_event2string(wrd_args[0]);
112 	len = strlen(p);
113 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
114 	code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL);
115 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", text);
116 	reuse_mblock(&tmpbuffer);
117 	break;
118       case WRD_NL: /* Newline (Ignored) */
119 	break;
120       case WRD_COLOR:
121 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@COLOR(%d)", wrd_args[0]);
122 	break;
123       case WRD_END: /* Never call */
124 	break;
125       case WRD_ESC:
126 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
127 		  "@ESC(%s)", wrd_event2string(wrd_args[0]));
128 	break;
129       case WRD_EXEC:
130 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
131 		  "@EXEC(%s)", wrd_event2string(wrd_args[0]));
132 	break;
133       case WRD_FADE:
134 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
135 		  "@FADE(%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2]);
136 	break;
137       case WRD_FADESTEP:
138 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
139 		  "@FADESTEP(%d/%d)", wrd_args[0], WRD_MAXFADESTEP);
140 	break;
141       case WRD_GCIRCLE:
142 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
143 		  "@GCIRCLE(%d,%d,%d,%d,%d,%d)",
144 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
145 		  wrd_args[4], wrd_args[5]);
146 	break;
147       case WRD_GCLS:
148 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
149 		  "@GCLS(%d)", wrd_args[0]);
150 	break;
151       case WRD_GINIT:
152 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@GINIT()");
153 	break;
154       case WRD_GLINE:
155 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
156 		  "@GLINE(%d,%d,%d,%d,%d,%d,%d)",
157 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
158 	       wrd_args[5], wrd_args[6]);
159 	break;
160       case WRD_GMODE:
161 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
162 		  "@GMODE(%d)", wrd_args[0]);
163 	break;
164       case WRD_GMOVE:
165 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
166 		  "@GMOVE(%d,%d,%d,%d,%d,%d,%d)",
167 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
168 	       wrd_args[5], wrd_args[6], wrd_args[7], wrd_args[8]);
169 	break;
170       case WRD_GON:
171 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
172 		  "@GON(%d)", wrd_args[0]);
173 	break;
174       case WRD_GSCREEN:
175 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
176 		  "@GSCREEN(%d,%d)", wrd_args[0], wrd_args[1]);
177 	break;
178       case WRD_INKEY:
179 	inkey_flag = 1;
180 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@INKEY - begin");
181 	break;
182       case WRD_OUTKEY:
183 	inkey_flag = 0;
184 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@INKEY - end");
185 	break;
186       case WRD_LOCATE:
187 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
188 		  "@LOCATE(%d,%d)", wrd_args[0], wrd_args[1]);
189 	break;
190       case WRD_LOOP: /* Never call */
191 	break;
192       case WRD_MAG:
193 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
194         snprintf(p, MIN_MBLOCK_SIZE-1, "@MAG(%s", wrd_event2string(wrd_args[0]));
195         p[MIN_MBLOCK_SIZE-1] = '\0'; /* fail safe */
196 	for(i = 1; i < 5; i++)
197 	{
198 	    if(wrd_args[i] == WRD_NOARG)
199 		strncat(p, ",*", MIN_MBLOCK_SIZE - strlen(p) - 1);
200 	    else {
201 		char q[CHAR_BIT*sizeof(int)];
202 		snprintf(q, sizeof(q)-1, ",%d", wrd_args[i]);
203 		strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
204             }
205 	}
206         strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
207 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
208 	reuse_mblock(&tmpbuffer);
209 	break;
210       case WRD_MIDI: /* Never call */
211 	break;
212       case WRD_OFFSET: /* Never call */
213 	break;
214       case WRD_PAL:
215 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
216 	snprintf(p, MIN_MBLOCK_SIZE, "@PAL(%03x", wrd_args[0]);
217 	for(i = 1; i < 17; i++) {
218 	    char q[5];
219 	    snprintf(q, sizeof(q)-1, ",%03x", wrd_args[i]);
220 	    strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
221 	}
222 	strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
223 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
224 	reuse_mblock(&tmpbuffer);
225 	break;
226       case WRD_PALCHG:
227 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
228 		  "@PALCHG(%s)", wrd_event2string(wrd_args[0]));
229 	break;
230       case WRD_PALREV:
231 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
232 		  "@PALREV(%d)", wrd_args[0]);
233 	break;
234       case WRD_PATH:
235 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
236 		  "@PATH(%s)", wrd_event2string(wrd_args[0]));
237 	break;
238       case WRD_PLOAD:
239 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
240 		  "@PLOAD(%s)", wrd_event2string(wrd_args[0]));
241 	break;
242       case WRD_REM:
243 	p = wrd_event2string(wrd_args[0]);
244 	len = strlen(p);
245 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
246 	code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL);
247 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@REM %s", text);
248 	reuse_mblock(&tmpbuffer);
249 	break;
250       case WRD_REMARK:
251 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
252 		  "@REMARK(%s)", wrd_event2string(wrd_args[0]));
253 	break;
254       case WRD_REST: /* Never call */
255 	break;
256       case WRD_SCREEN: /* Not supported */
257 	break;
258       case WRD_SCROLL:
259 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
260 		  "@SCROLL(%d,%d,%d,%d,%d,%d,%d)",
261 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
262 		  wrd_args[4], wrd_args[5], wrd_args[6]);
263 	break;
264       case WRD_STARTUP:
265 	inkey_flag = 0;
266 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
267 		  "@STARTUP(%d)", wrd_args[0]);
268 	break;
269       case WRD_STOP: /* Never call */
270 	break;
271       case WRD_TCLS:
272 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
273 		  "@TCLS(%d,%d,%d,%d,%d,%d,%d)",
274 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
275 		  wrd_args[4], wrd_args[5]);
276 	break;
277       case WRD_TON:
278 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
279 		  "@TON(%d)", wrd_args[0]);
280 	break;
281       case WRD_WAIT: /* Never call */
282 	break;
283       case WRD_WMODE: /* Never call */
284 	break;
285 
286 	/* Ensyutsukun */
287       case WRD_eFONTM:
288 	print_ecmd("FONTM", wrd_args, 1);
289 	break;
290       case WRD_eFONTP:
291 	print_ecmd("FONTP", wrd_args, 4);
292 	break;
293       case WRD_eFONTR:
294 	print_ecmd("FONTR", wrd_args, 17);
295 	break;
296       case WRD_eGSC:
297 	print_ecmd("GSC", wrd_args, 1);
298 	break;
299       case WRD_eLINE:
300 	print_ecmd("LINE", wrd_args, 1);
301 	break;
302       case WRD_ePAL:
303 	print_ecmd("PAL", wrd_args, 2);
304 	break;
305       case WRD_eREGSAVE:
306 	print_ecmd("REGSAVE", wrd_args, 17);
307 	break;
308       case WRD_eSCROLL:
309 	print_ecmd("SCROLL",wrd_args, 2);
310 	break;
311       case WRD_eTEXTDOT:
312 	print_ecmd("TEXTDOT", wrd_args, 1);
313 	break;
314       case WRD_eTMODE:
315 	print_ecmd("TMODE", wrd_args, 1);
316 	break;
317       case WRD_eTSCRL:
318 	print_ecmd("TSCRL", wrd_args, 0);
319 	break;
320       case WRD_eVCOPY:
321 	print_ecmd("VCOPY", wrd_args, 9);
322 	break;
323       case WRD_eVSGET:
324 	print_ecmd("VSGE", wrd_args, 4);
325 	break;
326       case WRD_eVSRES:
327 	print_ecmd("VSRES", wrd_args, 0);
328 	break;
329       case WRD_eXCOPY:
330 	print_ecmd("XCOPY", wrd_args, 14);
331 	break;
332       default:
333 	break;
334     }
335     wrd_argc = 0;
336 }
337