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);
gbt_tsgt(const void * a,const void * b,FmgrInfo * flinfo)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*/
63 static int wrdt_open(char *wrdt_opts)
64 {
65 wrdt.opened = 1;
gbt_tseq(const void * a,const void * b,FmgrInfo * flinfo)66 inkey_flag = 0;
67 return 0;
68 }
69
70 static void wrdt_update_events(void)
71 {
72 }
73
74 static void wrdt_end(void)
75 {
76 inkey_flag = 0;
gbt_tsle(const void * a,const void * b,FmgrInfo * flinfo)77 }
78
79 static void wrdt_close(void)
80 {
81 wrdt.opened = 0;
82 inkey_flag = 0;
83 }
84
85 static char *wrd_event2string(int id)
86 {
87 char *name;
gbt_tslt(const void * a,const void * b,FmgrInfo * flinfo)88
89 name = event2string(id);
90 if(name != NULL)
91 return name + 1;
92 return "";
93 }
94
95 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[])
96 {
97 char *p;
98 char *text;
99 int i, len;
gbt_tskey_cmp(const void * a,const void * b,FmgrInfo * flinfo)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));
gbt_ts_dist(const void * a,const void * b,FmgrInfo * flinfo)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;
ts_dist(PG_FUNCTION_ARGS)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:
tstz_dist(PG_FUNCTION_ARGS)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);
tstz_to_ts_gmt(TimestampTz ts)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);
gbt_ts_compress(PG_FUNCTION_ARGS)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]);
gbt_tstz_compress(PG_FUNCTION_ARGS)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:
gbt_ts_fetch(PG_FUNCTION_ARGS)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:
gbt_ts_consistent(PG_FUNCTION_ARGS)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,
gbt_ts_distance(PG_FUNCTION_ARGS)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;
gbt_tstz_consistent(PG_FUNCTION_ARGS)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;
gbt_tstz_distance(PG_FUNCTION_ARGS)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;
gbt_ts_union(PG_FUNCTION_ARGS)334 }
335 wrd_argc = 0;
336 }
337