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"
37 #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[]);
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,
61 wrdt_end,
62 wrdt_close
63 };
64
65 static int inkey_flag;
66
wrdt_open(char * dummy)67 static int wrdt_open(char *dummy)
68 {
69
70 wrdt.opened = 1;
71 inkey_flag = 0;
72 return 0;
73 }
74
wrdt_update_events(void)75 static void wrdt_update_events(void)
76 {
77 }
78
wrdt_end(void)79 static void wrdt_end(void)
80 {
81 printf("\033[0m\n");/*Restore Attributes*/
82 inkey_flag = 0;
83 }
84
wrdt_close(void)85 static void wrdt_close(void)
86 {
87 printf("\033[0m");
88 fflush(stdout);
89 wrdt.opened = 0;
90 inkey_flag = 0;
91 }
92
wrd_event2string(int id)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
wrdt_apply(int cmd,int wrd_argc,int wrd_args[])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]));
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