FreeCalypso > hg > freecalypso-tools
annotate ringtools/fc-pwt-comp.c @ 926:6a0aa8d36d06
rvinterf backslash escape: introduce libprint
The new helper function library named libprint is meant to replace
the badly misnamed libg23, and will soon contain functions for
printing all of the same kinds of GPF TST packets that are now handled
in libg23. However, we are also moving safe_print_trace() from libasync
to this new library, and changing it to emit our new backslash escape
format.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 23 May 2023 03:47:46 +0000 |
parents | 16e259bff02b |
children |
rev | line source |
---|---|
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This program compiles a FreeCalypso PWT melody from our ASCII source |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * format into the compact binary format that will be uploaded into |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * FC device FFS for use by our BUZM melody player engine. |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * The binary format going into FFS consists of 4-byte records; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * each record has the following format: |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * 1 byte: PWT note code [0,47] going directly into hw register |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * 1 byte: tone volume in [1,64] range, or 0 means rest period |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * 2 bytes LE: tone or rest duration in TDMA frames |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 #include <stdio.h> |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <stdlib.h> |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include <ctype.h> |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include <string.h> |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #include <strings.h> |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 static struct pwt_note { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 char *name; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 int code; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 } pwt_notes_table[] = { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 {"f4", 47}, /* 349 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 {"fs4", 43}, /* 370 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 {"g4", 39}, /* 392 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 {"gs4", 35}, /* 415 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 {"a4", 31}, /* 440 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 {"as4", 27}, /* 466 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 {"b4", 23}, /* 494 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 {"c5", 19}, /* 523 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 {"cs5", 15}, /* 554 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 {"d5", 11}, /* 587 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 {"ds5", 7}, /* 622 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 {"e5", 3}, /* 659 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 {"f5", 46}, /* 698 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 {"fs5", 42}, /* 740 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 {"g5", 38}, /* 784 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 {"gs5", 34}, /* 831 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 {"a5", 30}, /* 880 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 {"as5", 26}, /* 932 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 {"b5", 22}, /* 988 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 {"c6", 18}, /* 1047 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 {"cs6", 14}, /* 1109 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 {"d6", 10}, /* 1175 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 {"ds6", 6}, /* 1245 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 {"e6", 2}, /* 1319 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 {"f6", 45}, /* 1397 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 {"fs6", 41}, /* 1480 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 {"g6", 37}, /* 1568 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 {"gs6", 33}, /* 1661 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 {"a6", 29}, /* 1760 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 {"as6", 25}, /* 1865 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 {"b6", 21}, /* 1976 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 {"c7", 17}, /* 2093 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 {"cs7", 13}, /* 2217 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 {"d7", 9}, /* 2349 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 {"ds7", 5}, /* 2489 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 {"e7", 1}, /* 2637 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 {"f7", 44}, /* 2794 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 {"fs7", 40}, /* 2960 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 {"g7", 36}, /* 3136 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 {"gs7", 32}, /* 3322 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 {"a7", 28}, /* 3520 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 {"as7", 24}, /* 3729 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 {"b7", 20}, /* 3951 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 {"c8", 16}, /* 4186 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 {"cs8", 12}, /* 4435 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 {"d8", 8}, /* 4699 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 {"ds8", 4}, /* 4978 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 {"e8", 0}, /* 5274 Hz */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 /* table search terminator */ |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 {0, -1} |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 }; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 char *infname, *outfname; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 FILE *inf, *outf; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 char linebuf[256], *fields[3]; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 int lineno, nfields; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 parse_line_into_fields() |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 char *cp; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 cp = index(linebuf, '\n'); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 if (!cp) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 fprintf(stderr, "%s line %d: missing newline\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 cp = linebuf; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 nfields = 0; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 for (;;) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 while (isspace(*cp)) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 cp++; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 if (*cp == '\0' || *cp == '#') |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 break; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 if (nfields >= 3) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 fprintf(stderr, "%s line %d: too many fields\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 fields[nfields++] = cp; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 while (*cp && !isspace(*cp)) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 cp++; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 if (*cp) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 *cp++ = '\0'; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 emit_record(freq, volume, duration) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 unsigned freq, volume, duration; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 putc(freq, outf); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 putc(volume, outf); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 putc(duration & 0xFF, outf); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 putc(duration >> 8, outf); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 process_tone_entry() |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 struct pwt_note *tp; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 unsigned note_vol, duration; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 for (tp = pwt_notes_table; tp->name; tp++) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 if (!strcmp(tp->name, fields[0])) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 break; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 if (tp->code < 0) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 fprintf(stderr, "%s line %d: invalid note name\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 note_vol = strtoul(fields[1], 0, 0); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 if (note_vol < 1 || note_vol > 64) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 fprintf(stderr, "%s line %d: invalid note volume\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 duration = strtoul(fields[2], 0, 0); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 if (duration < 1 || duration > 0xFFFF) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 fprintf(stderr, |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 "%s line %d: the duration number is out of range\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 emit_record(tp->code, note_vol, duration); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 process_rest_entry() |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 unsigned duration; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 duration = strtoul(fields[1], 0, 0); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 if (duration < 1 || duration > 0xFFFF) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 fprintf(stderr, |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 "%s line %d: the duration number is out of range\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 } |
884
8eb1f60f6676
ringtools/fc-pwt-comp.c: rm redundant type cast
Mychaela Falconia <falcon@freecalypso.org>
parents:
867
diff
changeset
|
160 emit_record(0, 0, duration); |
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 main(argc, argv) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 char **argv; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 { |
885
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
166 int nonempty; |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
167 |
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 if (argc != 3) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 fprintf(stderr, "usage: %s src-file bin-file\n", argv[0]); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 if (strcmp(argv[1], "-")) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 infname = argv[1]; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 inf = fopen(infname, "r"); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 if (!inf) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 perror(infname); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 } else { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 infname = "stdin"; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 inf = stdin; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 outfname = argv[2]; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 outf = fopen(outfname, "w"); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 if (!outf) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 perror(outfname); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 } |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 |
885
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
190 nonempty = 0; |
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 parse_line_into_fields(); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 if (!nfields) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 continue; |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 if (nfields == 3) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 process_tone_entry(); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 else if (nfields == 2 && !strcmp(fields[0], "rest")) |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 process_rest_entry(); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 else { |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 fprintf(stderr, "%s line %d: invalid syntax\n", |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 infname, lineno); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 exit(1); |
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 } |
885
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
204 nonempty = 1; |
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 } |
885
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
206 if (nonempty) |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
207 exit(0); |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
208 else { |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
209 fprintf(stderr, "error: %s is empty\n", infname); |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
210 exit(1); |
16e259bff02b
fc-pwt-comp: explicitly reject empty input
Mychaela Falconia <falcon@freecalypso.org>
parents:
884
diff
changeset
|
211 } |
867
dfd98dd46068
ringtools: fc-pwt-comp utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 } |