FreeCalypso > hg > freecalypso-tools
annotate ringtools/imy/convert.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 | 3e398f9c31a0 |
children |
rev | line source |
---|---|
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This module implements the second pass of fc-imy2pwt processing: |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * stepping through the captured melody and converting it to PWT. |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <ctype.h> |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdio.h> |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdlib.h> |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <string.h> |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <strings.h> |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 extern char melody_str_buf[]; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 extern unsigned tdma_durations[6][4]; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 extern FILE *outF; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 static int cur_octave = 4; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 static char *pwt_note_names[12] = {"c", "cs", "d", "ds", "e", "f", "fs", |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 "g", "gs", "a", "as", "b"}; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 static void |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
22 melody_error(cp, msg) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
23 char *cp, *msg; |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 { |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
25 unsigned pos; |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
26 |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
27 pos = cp - melody_str_buf; |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
28 fprintf(stderr, "melody error at offset %u: %s\n", pos, msg); |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
29 exit(1); |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
30 } |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
31 |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
32 static void |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
33 process_octave_cmd(cp) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
34 char *cp; |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
35 { |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
36 if (!isdigit(cp[1])) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
37 melody_error(cp, "'*' octave prefix not followed by digit"); |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
38 cur_octave = cp[1] - '0'; |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 static int |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 process_note(str, type) |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 char *str; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 int note, dur_basic, dur_mod; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 switch (*str) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 case 'c': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 note = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 case 'd': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 note = 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 case 'e': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 note = 4; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 case 'f': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 note = 5; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 case 'g': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 note = 7; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 case 'a': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 note = 9; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 case 'b': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 note = 11; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 default: |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
70 melody_error(str, "note letter expected after '&' or '#'"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 switch (type) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 case 1: |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
74 if (note == 0 || note == 5) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
75 melody_error(str, "invalid flat note"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 note--; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 case 2: |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
79 if (note == 4 || note == 11) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
80 melody_error(str, "invalid sharp note"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 note++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
84 if (str[1] < '0' || str[1] > '5') |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
85 melody_error(str, "missing expected note duration digit"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 dur_basic = str[1] - '0'; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 switch (str[2]) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 case '.': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 dur_mod = 1; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 case ':': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 dur_mod = 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 case ';': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 dur_mod = 3; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 default: |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 dur_mod = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 fprintf(outF, "%s%d\t64\t%u\n", pwt_note_names[note], cur_octave + 1, |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 tdma_durations[dur_basic][dur_mod]); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 if (dur_mod) |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 return 3; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 else |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 return 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 static int |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 process_rest(str) |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 char *str; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 int dur_basic, dur_mod; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
115 if (str[1] < '0' || str[1] > '5') |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
116 melody_error(str, "missing expected rest duration digit"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 dur_basic = str[1] - '0'; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 switch (str[2]) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 case '.': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 dur_mod = 1; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 case ':': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 dur_mod = 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 case ';': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 dur_mod = 3; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 default: |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 dur_mod = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 break; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 fprintf(outF, "rest\t\t%u\n", tdma_durations[dur_basic][dur_mod]); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 if (dur_mod) |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 return 3; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 else |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 return 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 melody_convert_pass() |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 char *cp, *repeat_start_ptr; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 int repeat_start_octave, repeat_count, rpt_set; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 repeat_start_ptr = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 for (cp = melody_str_buf; *cp; ) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 /* skip junk first */ |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 if (!strncmp(cp, "vibeon", 6)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 cp += 6; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 if (!strncmp(cp, "vibeoff", 7)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 cp += 7; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 if (!strncmp(cp, "ledon", 5)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 cp += 5; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 if (!strncmp(cp, "ledoff", 6)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 cp += 6; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 if (!strncmp(cp, "backon", 6)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 cp += 6; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 if (!strncmp(cp, "backoff", 7)) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 cp += 7; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 /* real stuff */ |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 switch (*cp) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 case '*': |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
174 process_octave_cmd(cp); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 cp += 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 case 'c': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 case 'd': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 case 'e': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 case 'f': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 case 'g': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 case 'a': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 case 'b': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 cp += process_note(cp, 0); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 case '&': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 cp += process_note(cp, 1); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 case '#': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 cp += process_note(cp, 2); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 case 'r': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 cp += process_rest(cp); |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 case 'V': |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 /* skip unimplemented volume control */ |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 if (*cp == '+' || *cp == '-') { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 } |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
204 if (!isdigit(*cp)) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
205 melody_error(cp, "invalid character after 'V'"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 if (*cp == '1' && cp[1] >= '0' && cp[1] <= '5') |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 cp += 2; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 else |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 case '(': |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
212 if (repeat_start_ptr) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
213 melody_error(cp, "nested repeat"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 repeat_start_ptr = cp; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 repeat_start_octave = cur_octave; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 repeat_count = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 case '@': |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
220 if (!repeat_start_ptr) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
221 melody_error(cp, "'@' not in repeat block"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 cp++; |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
223 if (!isdigit(*cp)) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
224 melody_error(cp, "'@' not followed by digit"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 rpt_set = *cp - '0'; |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
226 if (!rpt_set) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
227 melody_error(cp, |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
228 "infinite repeat not supported"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 if (!repeat_count) |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 repeat_count = rpt_set; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 case ')': |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
234 if (!repeat_start_ptr) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
235 melody_error(cp, "')' without opening '('"); |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
236 if (!repeat_count) |
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
237 melody_error(cp, "repeat block without count"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 repeat_count--; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 if (repeat_count) { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 cp = repeat_start_ptr; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 cur_octave = repeat_start_octave; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 } else { |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 cp++; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 repeat_start_ptr = 0; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 continue; |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 default: |
887
3e398f9c31a0
fc-imy2pwt: overhaul melody error handling, report position
Mychaela Falconia <falcon@freecalypso.org>
parents:
882
diff
changeset
|
248 melody_error(cp, "non-understood character"); |
882
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 } |
fd4c9bc7835d
fc-imy2pwt program written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 } |