annotate ringtools/fc-pwt-comp.c @ 1000:39a6090a052a

doc/How-flash-really-works: article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 09 Dec 2023 09:08:19 +0000
parents 16e259bff02b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }