Commit | Line | Data |
---|---|---|
69695f33 MW |
1 | /* Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2006 |
2 | * by Arkkra Enterprises */ | |
3 | /* All rights reserved */ | |
4 | /* | |
5 | * globals.c | |
6 | * | |
7 | * This files defines all the global variables used in more than one | |
8 | * file, except for ones that are used only by yacc and lex. | |
9 | */ | |
10 | ||
11 | #include "structs.h" | |
12 | #include "rational.h" | |
13 | #include "globals.h" | |
14 | ||
15 | /* | |
16 | * Define the fixed SSV structures, which accumulate attributes of the | |
17 | * score, staffs, and voices. | |
18 | */ | |
19 | struct SSV Score; | |
20 | struct SSV Staff[MAXSTAFFS]; | |
21 | struct SSV Voice[MAXSTAFFS][MAXVOICES]; | |
22 | ||
23 | /* | |
24 | * Define command line requested staff and voice visibilities. Each value is | |
25 | * YES or NO. | |
26 | */ | |
27 | short Staff_vis[MAXSTAFFS + 1]; | |
28 | short Voice_vis[MAXSTAFFS + 1][MAXVOICES + 1]; | |
29 | ||
30 | /* | |
31 | * Define head and tail cells of the main linked list set up by the parser. | |
32 | */ | |
33 | struct MAINLL *Mainllhc_p; | |
34 | struct MAINLL *Mainlltc_p; | |
35 | ||
36 | int Optch = OPTION_MARKER; /* character for command line options */ | |
37 | int Mupmate = NO; /* was Mup called from Mupmate? */ | |
38 | int Errorcount; /* number of errors found so far */ | |
39 | int Maxverses; /* maximum number of verse numbers used in the song */ | |
40 | short Meas_num = 1; /* count measure numbers */ | |
41 | int Preproc = NO; /* was -E specified on command line? */ | |
42 | int Ppcomments = NO; /* was -C specified on command line? */ | |
43 | ||
44 | int Context = C_MUSIC; | |
45 | int Curr_family = BASE_TIMES; | |
46 | int Curr_font = FONT_TR; | |
47 | int Curr_size = DFLT_SIZE; | |
48 | int Got_some_data = NO; | |
49 | int Doing_tab_staff; /* YES while parsing a line for a tab staff, else NO */ | |
50 | int Doing_MIDI = NO; | |
51 | char *Curr_filename; | |
52 | char *Outfilename = ""; | |
53 | int Vflag = NO; | |
54 | int Vcombused = NO; /* was the voicecombine parameter ever used? */ | |
55 | int CSBused = NO; /* was cross staff beaming used in this song? */ | |
56 | int CSSused = NO; /* was cross staff stemming used in this song? */ | |
57 | int CSSpass = NO; /* YES while doing a special pass for cross staff stem*/ | |
58 | ||
59 | /* | |
60 | * Due to read ahead, we may already be on the following line when generating | |
61 | * an error message, so need to know when to compensate by subtracting | |
62 | * 1 from the current line number. | |
63 | */ | |
64 | int Last_was_newline = NO; | |
65 | ||
66 | /* | |
67 | * The following table lets you conveniently find the character name of any | |
68 | * note head type of form GF_NORMAL. It is to be indexed like this: | |
69 | * headchar = Hctab [ basictime > 2 ? 3 : basictime ]; | |
70 | */ | |
71 | unsigned char Hctab [] = { | |
72 | C_DBLWHOLE, C_1N, C_2N, C_4N | |
73 | }; | |
74 | ||
75 | /* | |
76 | * This table is like Hctab, but for X notes. Note that for half notes and | |
77 | * longer, we actually draw the note as a diamond instead of an X. | |
78 | */ | |
79 | unsigned char Xhctab[] = { | |
80 | C_DWHDIAMOND, C_DIAMOND, C_DIAMOND, C_XNOTE | |
81 | }; | |
82 | ||
83 | /* | |
84 | * This table is like Hctab, but for diamond shaped notes. | |
85 | */ | |
86 | unsigned char Dhctab[] = { | |
87 | C_DWHDIAMOND, C_DIAMOND, C_DIAMOND, C_FILLDIAMOND | |
88 | }; | |
89 | ||
90 | /* | |
91 | * The following table lets you conveniently find the character name of any | |
92 | * rest type, whole or shorter. It is to be indexed by log2(basictime). | |
93 | */ | |
94 | unsigned char Resttab[] = { | |
95 | C_LL1REST, C_LL2REST, C_4REST, C_8REST, C_16REST, C_32REST, C_64REST, | |
96 | C_128REST, C_256REST, | |
97 | }; | |
98 | ||
99 | /* | |
100 | * The following table tells how many letters up from C each note is. It is | |
101 | * to be indexed by (noteletter - 'a'). | |
102 | */ | |
103 | int Letshift[] = { 5, 6, 0, 1, 2, 3, 4, }; | |
104 | /* a b c d e f g */ | |
105 | ||
106 | /* the note letters in the order of the circle of fifths */ | |
107 | char Circle[] = "fcgdaeb"; | |
108 | ||
109 | /* internal accidental letters */ | |
110 | char Acclets[] = "B&n#x"; | |
111 | ||
112 | /* external accidental symbols */ | |
113 | char *Acctostr[] = { "&&", "&", "", "#", "x" }; | |
114 | ||
115 | /* | |
116 | * Define strings for pedstyle = pedstar ("Ped." and the star). | |
117 | */ | |
118 | char Ped_start[] = { FONT_ZI, 18, 'P', 'e', 'd', '.', '\0' }; | |
119 | char Ped_stop[] = { FONT_ZD, 14, 'j', '\0' }; | |
120 | ||
121 | /* | |
122 | * Define the string info for standard guitar tuning. Note that the octaves | |
123 | * are for how it should be printed; the actual sound is an octave lower. | |
124 | * When outputting MIDI, we check whether the tablature staff is using this | |
125 | * default array, and if so, automatically transpose down by 12 halfsteps. | |
126 | */ | |
127 | struct STRINGINFO Guitar[DEFTABLINES] = { | |
128 | { 'e', '\0', 0, 5 }, | |
129 | { 'b', '\0', 0, 4 }, | |
130 | { 'g', '\0', 0, 4 }, | |
131 | { 'd', '\0', 0, 4 }, | |
132 | { 'a', '\0', 0, 3 }, | |
133 | { 'e', '\0', 1, 3 }, | |
134 | }; | |
135 | ||
136 | /* | |
137 | * These arrays are used to keep track of things while adjusting the pitches | |
138 | * of notes to account for octave marks. They are indexed by staff number, | |
139 | * so element 0 of each array is unused. Octave mark related transposition | |
140 | * is done both in MIDI code and trantab code. | |
141 | */ | |
142 | int Octave_adjust[MAXSTAFFS+1]; /* how many octaves to adjust due to | |
143 | * user-specified octave marks */ | |
144 | int Octave_bars[MAXSTAFFS+1]; /* how many bar lines to cross with | |
145 | * current Octave_adjust (if Octave_adjust is | |
146 | * zero, this variable is meaningless) */ | |
147 | float Octave_count[MAXSTAFFS+1];/* number of counts into measure that | |
148 | * Octave_adjust applies in measure after | |
149 | * Octave_bars have gone by. (if Octave_adjust | |
150 | * is zero, this variable is meaningless */ | |
151 | /* | |
152 | * Define fixed location variables. For all of these, only the absolute | |
153 | * coordinates are used. | |
154 | */ | |
155 | float _Page [NUMCTYPE]; /* whole page */ | |
156 | float _Win [NUMCTYPE]; /* middle (music) window */ | |
157 | float _Cur [NUMCTYPE]; /* current position */ | |
158 | ||
159 | /* | |
160 | * Define the structures for headers and footers. | |
161 | */ | |
162 | struct BLOCKHEAD Header; /* first page header */ | |
163 | struct BLOCKHEAD Footer; /* first page footer */ | |
164 | struct BLOCKHEAD Header2; /* later page header */ | |
165 | struct BLOCKHEAD Footer2; /* later page footer */ | |
166 | ||
167 | /* | |
168 | * used by print phase to keep track of current staff locations | |
169 | */ | |
170 | float *Score_location_p; /* score coord from FEED struct */ | |
171 | float Staffs_y[MAXSTAFFS + 1]; /* absolute Y of the staffs of a score */ | |
172 | ||
173 | /* | |
174 | * While constructing a GRPSYL list of groups or lyrics, or a list of STUFF, | |
175 | * any of which could be being defining for multiple staffs at once and/or more | |
176 | * than one vno, keep a pointer to the list of staffs and vnos being defined. | |
177 | * Once we gather an entire line of input, the GRPSYL list or STUFF list is | |
178 | * cloned for each staff being defined, and the information is moved to be | |
179 | * associated with the appropriate STAFF structs. | |
180 | */ | |
181 | struct RANGELIST *Staffrange_p; | |
182 | struct RANGELIST *Vnorange_p; | |
183 | ||
184 | /* | |
185 | * During parse phase, this keeps track of the place (PL_ABOVE, PL_BELOW, | |
186 | * or PL_BETWEEN) of the current thing being collected (groups, lyrics, | |
187 | * or stuff). | |
188 | */ | |
189 | short Place; | |
190 | ||
191 | /* | |
192 | * Snapshot of the state of pedals at the beginning of endings. | |
193 | * The zeroth element of the array is used as a flag. If it is YES, | |
194 | * the rest of the array contains the pedal state for each staff, | |
195 | * YES for pedal on, NO for off. If the zeroth element is NO, | |
196 | * the rest of the array is meaningless. | |
197 | */ | |
198 | short Ped_snapshot[MAXSTAFFS + 1]; | |
199 | ||
200 | /* table to give a quick mapping from staff number to STAFF struct */ | |
201 | struct MAINLL *Staffmap_p[MAXSTAFFS + 1]; | |
202 | ||
203 | /* pointer to beginning of all the STAFF structs in current measure */ | |
204 | struct MAINLL *List_of_staffs_p; | |
205 | ||
206 | struct SVRANGELIST *Svrangelist_p; | |
207 | ||
208 | /* beginning of the list of GRPSYL structs currently being built */ | |
209 | struct GRPSYL *Curr_gs_list_p; | |
210 | ||
211 | /* If 0, no multirest in current measure yet. | |
212 | * If 1, got a multirest. | |
213 | * If 2, got both a multirest and music data */ | |
214 | short Got_multirest; | |
215 | ||
216 | /* YES if input contained at least one group in the current measure */ | |
217 | short Got_group; | |
218 | ||
219 | short Pagenum; /* which page we are currently printing */ | |
220 | int Last_pagenum; /* page number of the final page */ | |
221 | ||
222 | /* set to YES if given font is used somewhere */ | |
223 | short Font_used[MAXFONTS]; | |
224 | ||
225 | /* items used when chord grids are to be printed at the end of the song */ | |
226 | struct ATEND_INFO Atend_info; | |
227 | ||
228 | /* | |
229 | * Define a variable for a staff's staffscale, and other variables which are | |
230 | * staffscale times the corresponding macro symbol in all caps. This is to | |
231 | * avoid recalculating these all the time. These variables are for use in | |
232 | * files where a main function loops over staffs, and calls a tree of | |
233 | * subroutines for each staff. The main function should set these variables | |
234 | * for the current staff, and from there on the code can use them. Early in | |
235 | * Mup they are initialized to their default values by doing initstructs() | |
236 | * and set_staffscale(0), so that everywhere before the point where staff | |
237 | * scaling begins (in restsyl.c) they are set to these default values, and | |
238 | * code before there can call utilities that use these symbols and no scaling | |
239 | * will result. | |
240 | */ | |
241 | float Staffscale; /* for this staff */ | |
242 | float Stdpad; /* STDPAD on this staff */ | |
243 | float Stepsize; /* STEPSIZE on this staff */ | |
244 | float Flagsep; /* FLAGSEP on this staff */ | |
245 | float Smflagsep; /* SMFLAGSEP on this staff */ | |
246 | float Tupheight; /* TUPHEIGHT on this staff */ | |
247 | ||
248 | /* define rational number constants that may be useful in multiple files */ | |
249 | RATIONAL Zero = {0,1}; | |
250 | RATIONAL One_fourth = {1,4}; | |
251 | RATIONAL One_third = {1,3}; | |
252 | RATIONAL One_half = {1,2}; | |
253 | RATIONAL Two_thirds = {2,3}; | |
254 | RATIONAL Three_fourths = {3,4}; | |
255 | RATIONAL One = {1,1}; | |
256 | RATIONAL Two = {2,1}; | |
257 | RATIONAL Three = {3,1}; | |
258 | RATIONAL Four = {4,1}; | |
259 | ||
260 | /* | |
261 | * Define something longer than the longest possible measure. See the comment | |
262 | * by the #define for MAXTSLEN. | |
263 | */ | |
264 | RATIONAL Maxtime = {(MAXTSLEN - 3) * 99 + 1, 1}; | |
265 | ||
266 | int Debuglevel; /* bitmap of what message classes to print */ |