chiark / gitweb /
Merge branch 'arkkra' into shiny
[mup] / mup / mup / globals.c
CommitLineData
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 */
19struct SSV Score;
20struct SSV Staff[MAXSTAFFS];
21struct SSV Voice[MAXSTAFFS][MAXVOICES];
22
23/*
24 * Define command line requested staff and voice visibilities. Each value is
25 * YES or NO.
26 */
27short Staff_vis[MAXSTAFFS + 1];
28short 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 */
33struct MAINLL *Mainllhc_p;
34struct MAINLL *Mainlltc_p;
35
36int Optch = OPTION_MARKER; /* character for command line options */
37int Mupmate = NO; /* was Mup called from Mupmate? */
38int Errorcount; /* number of errors found so far */
39int Maxverses; /* maximum number of verse numbers used in the song */
40short Meas_num = 1; /* count measure numbers */
41int Preproc = NO; /* was -E specified on command line? */
42int Ppcomments = NO; /* was -C specified on command line? */
43
44int Context = C_MUSIC;
45int Curr_family = BASE_TIMES;
46int Curr_font = FONT_TR;
47int Curr_size = DFLT_SIZE;
48int Got_some_data = NO;
49int Doing_tab_staff; /* YES while parsing a line for a tab staff, else NO */
50int Doing_MIDI = NO;
51char *Curr_filename;
52char *Outfilename = "";
53int Vflag = NO;
54int Vcombused = NO; /* was the voicecombine parameter ever used? */
55int CSBused = NO; /* was cross staff beaming used in this song? */
56int CSSused = NO; /* was cross staff stemming used in this song? */
57int 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 */
64int 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 */
71unsigned 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 */
79unsigned 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 */
86unsigned 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 */
94unsigned 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 */
103int 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 */
107char Circle[] = "fcgdaeb";
108
109/* internal accidental letters */
110char Acclets[] = "B&n#x";
111
112/* external accidental symbols */
113char *Acctostr[] = { "&&", "&", "", "#", "x" };
114
115/*
116 * Define strings for pedstyle = pedstar ("Ped." and the star).
117 */
118char Ped_start[] = { FONT_ZI, 18, 'P', 'e', 'd', '.', '\0' };
119char 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 */
127struct 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 */
142int Octave_adjust[MAXSTAFFS+1]; /* how many octaves to adjust due to
143 * user-specified octave marks */
144int 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) */
147float 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 */
155float _Page [NUMCTYPE]; /* whole page */
156float _Win [NUMCTYPE]; /* middle (music) window */
157float _Cur [NUMCTYPE]; /* current position */
158
159/*
160 * Define the structures for headers and footers.
161 */
162struct BLOCKHEAD Header; /* first page header */
163struct BLOCKHEAD Footer; /* first page footer */
164struct BLOCKHEAD Header2; /* later page header */
165struct BLOCKHEAD Footer2; /* later page footer */
166
167/*
168 * used by print phase to keep track of current staff locations
169 */
170float *Score_location_p; /* score coord from FEED struct */
171float 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 */
181struct RANGELIST *Staffrange_p;
182struct 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 */
189short 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 */
198short Ped_snapshot[MAXSTAFFS + 1];
199
200/* table to give a quick mapping from staff number to STAFF struct */
201struct MAINLL *Staffmap_p[MAXSTAFFS + 1];
202
203/* pointer to beginning of all the STAFF structs in current measure */
204struct MAINLL *List_of_staffs_p;
205
206struct SVRANGELIST *Svrangelist_p;
207
208/* beginning of the list of GRPSYL structs currently being built */
209struct 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 */
214short Got_multirest;
215
216/* YES if input contained at least one group in the current measure */
217short Got_group;
218
219short Pagenum; /* which page we are currently printing */
220int Last_pagenum; /* page number of the final page */
221
222/* set to YES if given font is used somewhere */
223short Font_used[MAXFONTS];
224
225/* items used when chord grids are to be printed at the end of the song */
226struct 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 */
241float Staffscale; /* for this staff */
242float Stdpad; /* STDPAD on this staff */
243float Stepsize; /* STEPSIZE on this staff */
244float Flagsep; /* FLAGSEP on this staff */
245float Smflagsep; /* SMFLAGSEP on this staff */
246float Tupheight; /* TUPHEIGHT on this staff */
247
248/* define rational number constants that may be useful in multiple files */
249RATIONAL Zero = {0,1};
250RATIONAL One_fourth = {1,4};
251RATIONAL One_third = {1,3};
252RATIONAL One_half = {1,2};
253RATIONAL Two_thirds = {2,3};
254RATIONAL Three_fourths = {3,4};
255RATIONAL One = {1,1};
256RATIONAL Two = {2,1};
257RATIONAL Three = {3,1};
258RATIONAL Four = {4,1};
259
260/*
261 * Define something longer than the longest possible measure. See the comment
262 * by the #define for MAXTSLEN.
263 */
264RATIONAL Maxtime = {(MAXTSLEN - 3) * 99 + 1, 1};
265
266int Debuglevel; /* bitmap of what message classes to print */