chiark / gitweb /
Import upstream version 5.3.
[mup] / mup / mup / defines.h
CommitLineData
69695f33
MW
1/* Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2 * 2006 by Arkkra Enterprises */
3/* All rights reserved */
4/*
5 * defines.h
6 *
7 * This file defines the constants needed for the music publication
8 * program.
9 */
10
11#include <math.h>
12#ifndef _DEFINES
13#define _DEFINES
14#include "muschar.h"
15
16/*
17 * Define the environment =============================================
18 */
19
20/* for all forms of DOS we've tried, make sure __DOS__ is defined */
21#if defined(__TURBOC__) || defined(__WATCOMC__) || defined(__MINGW32__)
22#ifndef __DOS__
23#define __DOS__
24#endif
25#endif
26
27/* if you are short on memory or know you'll never use the extended character
28 * set (with accented characters, etc) you can undefine EXTCHAR
29 */
30#ifndef __TURBOC__
31#define EXTCHAR
32#endif
33#include "extchar.h"
34
35/* the following is needed for the DOS port of the GNU C compiler */
36#ifdef __DJGPP__
37#define __DOS__
38#undef unix
39#endif
40
41/*
42 * Based on system type, #define or don't #define various symbols, as follows:
43 *
44 * UNIX_LIKE_FILES If defined, files can be simultaneously read from and
45 * written to and invisibly unlinked.
46 * UNIX_LIKE_PATH_RULES If defined, use these rules for MUPPATH.
47 * DOS_LIKE_PATH_RULES If defined, use these rules for MUPPATH.
48 * CORE_MESSAGE If defined, then a creating core error message will be
49 * printed in debug mode.
50 * NEED_GETOPT If defined, the getopt suite is not available,
51 * therefore use the limited one in main.c.
52 * MAGIC_FILE_HOME If defined, check for magic file in $HOME.
53 * MAGIC_FILE_NAME Name of magic file.
54 * OPTION_MARKER The char which preceeds command line options.
55 */
56#ifdef unix
57#define UNIX_LIKE_FILES
58#define UNIX_LIKE_PATH_RULES
59#define CORE_MESSAGE
60#define MAGIC_FILE_HOME
61#define MAGIC_FILE_NAME ".mup"
62#define OPTION_MARKER '-'
63#endif
64
65#ifdef VMS
66#define MAGIC_FILE_HOME
67#define MAGIC_FILE_NAME ".mup"
68#define OPTION_MARKER '-'
69#endif
70
71#ifdef AMIGA
72#undef UNIX_LIKE_FILES
73#define NEED_GETOPT
74#define MAGIC_FILE_HOME
75#define MAGIC_FILE_NAME ".mup"
76#define OPTION_MARKER '-'
77#endif
78
79#ifdef __DOS__
80#define DOS_LIKE_PATH_RULES
81#define NEED_GETOPT
82#define MAGIC_FILE_NAME "mup.ok"
83#define OPTION_MARKER '/'
84#endif
85
86#ifdef Mac_BBEdit
87#undef UNIX_LIKE_FILES
88#define NEED_GETOPT
89/* skip length byte of Pascal string literal */
90#define MAGIC_FILE_NAME (char *)(MupRegFileName + 1);
91#define OPTION_MARKER '-'
92#endif
93
94#ifdef __EMX__
95#undef UNIX_LIKE_FILES
96#define DOS_LIKE_PATH_RULES
97#define MAGIC_FILE_HOME
98#define MAGIC_FILE_NAME ".mup"
99#define OPTION_MARKER '-'
100#endif
101
102#ifndef OPTION_MARKER
103/* use - as default if nothing has been defined for it */
104#define OPTION_MARKER '-'
105#endif
106
107/*
108 * Define ranges for variables =============================================
109 */
110
111/*
112 * Define maximum value for exit code from Mup. Must be less than 128
113 * to be able to distinguish from WAIT_ABANDONED value on Windows.
114 */
115#define MAX_ERRORS (127)
116
117/* text point sizes */
118#define MINSIZE (1)
119#define MAXSIZE (100)
120
121/* key signatures */
122#define MINSHARPS (-7)
123#define MAXSHARPS (7)
124#define DEFSHARPS (0)
125
126/* octave */
127#define MINOCTAVE (0)
128#define MAXOCTAVE (9)
129#define DEFOCTAVE (4)
130
131/* staves */
132#define MINSTAFFS (1)
133#define MAXSTAFFS (40)
134#define DEFSTAFFS (1)
135
136/* voices */
137#define MINVOICES (1)
138#define NORMVOICES (2)
139#define MAXVOICES (3)
140
141/* number of lines in a tablature staff */
142#define MINTABLINES (1)
143#define DEFTABLINES (6) /* see Guitar[] in globals.c */
144#define MAXTABLINES (9)
145
146/* number of ticks on a string designation for tablature */
147#define MINTICKS (0)
148#define MAXTICKS (MAXTABLINES - 1)
149
150#define TABDEFOCT (4)
151
152/* tablature fret numbers, including pseudo fret numbers */
153#define MINFRET (0)
154#define MAXFRET (99)
155#define DEFFRET (0)
156#define NOFRET (MAXFRET + 1)
157#define IN_UPWARD (MAXFRET + 2) /* slur from nowhere, going up */
158#define IN_DOWNWARD (MAXFRET + 3) /* slur from nowhere, going down */
159#define OUT_UPWARD (MAXFRET + 4) /* slur to nowhere, going up */
160#define OUT_DOWNWARD (MAXFRET + 5) /* slur to nowhere, going down */
161#define IS_NOWHERE(fret) ((fret) >= IN_UPWARD && (fret) <= OUT_DOWNWARD)
162
163/* range of frets that can be printed by a chord grid */
164#define MINGRIDFRET (2)
165#define MAXGRIDFRET (MAXFRET)
166#define DEFGRIDFRET (4)
167#define NOGRIDFRET (-1) /* must be negative so user can't enter it */
168
169/* USE_DFLT_OCTAVE has to be number that is not a valid octave, nor a */
170/* valid fret number. But it has to be positive and small enough to be */
171/* able to add MAX_OCTAVE to it */
172#define USE_DFLT_OCTAVE (MAXFRET + 6)
173
174/* min and max numbers for bend integers, numerators, and denominators */
175#define BENDINTBITS (4)
176#define MINBENDINT (0)
177#define MAXBENDINT ((1 << BENDINTBITS) - 1)
178#define BENDNUMBITS (6)
179#define MINBENDNUM (0)
180#define MAXBENDNUM ((1 << BENDNUMBITS) - 1)
181#define BENDDENBITS (6)
182#define MINBENDDEN (1)
183#define MAXBENDDEN ((1 << BENDDENBITS) - 1)
184
185/* time unit */
186/* -1 means quadruple whole and 0 means double whole. Actually, less than -1 */
187/* is allowed, and it's minus the number of measures in a multirest */
188#define MINBASICTIME (-1)
189#define MAXBASICTIME (256)
190
191/* the biggest number that is allowed on a multirest */
192#define MAXMULTINUM (1000)
193
194/* limits for scaling the output */
195#define MINSCALE (0.1)
196#define MAXSCALE (10.0)
197#define DEFSCALE (1.0)
198
199/* limits for scaling a staff relative to the output as a whole */
200#define MINSTFSCALE (0.1)
201#define MAXSTFSCALE (10.0)
202#define DEFSTFSCALE (1.0)
203
204#define MINGRIDSCALE (0.1)
205#define MAXGRIDSCALE (10.0)
206#define DEFGRIDSCALE (1.0)
207
208/* limits on min distance required between a chord and its staff (stepsizes) */
209#define MINCHORDDIST (0)
210#define MAXCHORDDIST (50)
211#define DEFCHORDDIST (3)
212
213/* limits on min dist required between other stuff and its staff (stepsizes) */
214#define MINDIST (0)
215#define MAXDIST (50)
216#define DEFDIST (2)
217
218/* limits on min distance required between a cresc and its staff (stepsizes) */
219#define MINDYNDIST (0)
220#define MAXDYNDIST (50)
221#define DEFDYNDIST (0)
222
223/* vertical space between staffs and scores, in units of stepsize */
224#define MINMINSTSEP (6) /* min user-specified min between staffs */
225#define DEFMINSTSEP (10) /* default min between staffs */
226#define MINMINSCSEP (6) /* min user-specified min between scores */
227#define DEFMINSCSEP (12) /* default min between scores */
228#define MINMAXSCSEP MINMINSCSEP /* min user-specified max between scores */
229#define DEFMAXSCSEP (20) /* default max between scores */
230#define MAXSEPVAL ((int)(PGHEIGHT / STEPSIZE)) /* max for either one */
231#define MINSTPAD (-MAXSEPVAL) /* min user-spec. white between staffs */
232#define MAXSTPAD (MAXSEPVAL) /* max user white between staffs */
233#define DEFSTPAD (0) /* default white between staffs */
234#define MINMINSCPAD (-MAXSEPVAL) /* min user-spec. white between scores */
235#define DEFMINSCPAD (2) /* default white between scores */
236#define MINMAXSCPAD (-MAXSEPVAL) /* min user-spec. white between scores */
237#define DEFMAXSCPAD (2) /* default white between scores */
238#define MAXPADVAL (MAXSEPVAL) /* max user white between scores */
239
240/* distance from center line a rest should be forced to be */
241#define MINRESTDIST (-50)
242#define MAXRESTDIST (50)
243#define NORESTDIST (11111) /* this means it is not set */
244
245/* number of mr needed to combine into a multirest (like -c option) */
246#define MINRESTCOMBINE (2)
247#define MAXRESTCOMBINE (1000)
248#define NORESTCOMBINE (-1) /* must be negative so user can't enter it */
249
250/* page number to be put on the first page (like -p option) */
251#define MINFIRSTPAGE (1)
252#define MAXFIRSTPAGE (5000)
253#define NOFIRSTPAGE (0) /* this means it is not set */
254
255/* number to multiply linear regression slope by to get beam's slope */
256#define MINBEAMFACT (0.0)
257#define MAXBEAMFACT (1.0)
258#define DEFBEAMFACT (1.0)
259
260/* maximum beam angle allowed, in degrees */
261#define MINBEAMMAX (0.0)
262#define MAXBEAMMAX (45.0)
263#define DEFBEAMMAX (20.0)
264
265/* angle of beam specified by the "slope" interchord attribute */
266#define MINBEAMANGLE (-MAXBEAMMAX)
267#define MAXBEAMANGLE (MAXBEAMMAX)
268#define NOBEAMANGLE (2 * MAXBEAMANGLE) /* something out of range */
269
270/* padding to be applied on the left of every group (and the right of the */
271/* last group in the measure), in stepsizes */
272#define MINPAD (-5.0)
273#define MAXPAD (50.0)
274#define DEFPAD (0.0)
275
276/* for setting and testing unknown stem length */
277#define STEMLEN_UNKNOWN (-1.0)
278#define IS_STEMLEN_KNOWN(x) ((x) >= 0.0) /* avoid using "==" on floats */
279#define IS_STEMLEN_UNKNOWN(x) ((x) < 0.0) /* avoid using "==" on floats */
280
281/* other stem length definitions */
282#define MINSTEMLEN (0.0)
283#define DEFSTEMLEN (7.0)
284#define MAXSTEMLEN (100.0)
285#define SM_STEMFACTOR (5.0 / 7.0) /* grace/cue factor */
286
287/* number of stepsizes by which a beamed stem can be shortened */
288#define MINSTEMSHORTEN (0.0)
289#define MAXSTEMSHORTEN (2.0)
290#define DEFSTEMSHORTEN (1.0)
291
292/* what fraction of each lyrics syllable goes left of the center of chord */
293#define MINLYRICSALIGN (0.0)
294#define MAXLYRICSALIGN (1.0)
295#define DEFLYRICSALIGN (0.25)
296
297/* size of the paper */
298#define MINPAGEHEIGHT (2.0)
299#define MAXPAGEHEIGHT (24.0)
300#define DEFPAGEHEIGHT (11.0)
301#define MINPAGEWIDTH (2.0)
302#define MAXPAGEWIDTH (24.0)
303#define DEFPAGEWIDTH (8.5)
304
305/* top and bottom margins */
306#define MINVMARGIN (0.0)
307#define MAXVMARGIN (3.0)
308#define DEFVMARGIN (0.5)
309
310/* left and right margins */
311#define MINHMARGIN (0.0)
312#define MAXHMARGIN (3.0)
313#define DEFHMARGIN (0.5)
314
315/* panels per page */
316#define MINPANELSPERPAGE (1)
317#define MAXPANELSPERPAGE (2)
318#define DEFPANELSPERPAGE (1)
319
320/* how tightly to pack the stuff horizontally (default value) */
321#define MINPACKFACT (0.0)
322#define DFLTPACKFACT (1.0)
323#define MAXPACKFACT (10.0)
324
325/* how much to expand long notes relative to short ones */
326#define MINPACKEXP (0.0)
327#define DFLTPACKEXP (0.8)
328#define MAXPACKEXP (1.0)
329
330/* time signature */
331#define MINNUMERATOR (1)
332#define MAXNUMERATOR (99)
333
334#define MINDENOMINATOR (1)
335#define MAXDENOMINATOR (64)
336
337#define MINDIVISION (1)
338#define DEFDIVISION (192)
339#define MAXDIVISION (3 * 512)
340
341/* define values for the "release" parameter, in milliseconds */
342#define MINRELEASE (0)
343#define DEFRELEASE (20)
344#define MAXRELEASE (500)
345
346/* define values for the "sylposition" parameter, in points */
347#define MINSYLPOSITION (-100)
348#define MAXSYLPOSITION (100)
349#define DEFSYLPOSITION (-5)
350#define NOSYLPOSITION (11111) /* this means it is not set */
351
352
353/*
354 * Define sets of symbols which probably should have been done as enums,
355 * but in ANSI C enums aren't much good anyhow. =============================
356 * Also define some macros for testing these enums.
357 */
358
359/*
360 * To limit the number of terminal symbols so that yacc won't blow up,
361 * several tokens map to the same terminal symbol, and we set a variable
362 * (yylval) to say which particular one was actually seen.
363 */
364#define F_STAFFS (1)
365#define F_OCTAVE (2)
366#define F_LYRSIZE (3)
367#define F_VERTSPACE (4)
368#define F_SIZE (5)
369
370#define F_TOPMARGIN (6)
371#define F_BOTMARGIN (7)
372#define F_LEFTMARGIN (8)
373#define F_RIGHTMARGIN (9)
374
375#define F_TIMEUNIT (10)
376#define F_VSCHEME (11)
377
378#define F_BRACKET (12)
379#define F_BRACE (13)
380#define F_BARSTYLE (14)
381
382#define F_LABEL (15)
383#define F_LABEL2 (16)
384
385#define F_FONT (17)
386#define F_LYRFONT (18)
387
388#define F_VISIBLE (19)
389#define F_VERSES (20)
390
391/*
392 * Define all the types of context in the input. Make each one a bit, so that
393 * we can also define a couple groupings of them.
394 */
395#define C_HEADER (0x1) /* first page header */
396#define C_FOOTER (0x2) /* first page footer */
397#define C_HEAD2 (0x4) /* later page header */
398#define C_FOOT2 (0x8) /* later page footer */
399#define C_TOP (0x10) /* initial block at top */
400#define C_BOT (0x20) /* initial block at bottom */
401#define C_TOP2 (0x40) /* later block at top */
402#define C_BOT2 (0x80) /* later block at bottom */
403#define C_BLOCK (0x100) /* other block */
404#define C_SCORE (0x200) /* the whole score */
405#define C_STAFF (0x400) /* a staff */
406#define C_VOICE (0x800) /* a voice */
407#define C_MUSIC (0x1000) /* notes, etc. */
408#define C_GRIDS (0x2000) /* chord grids */
409#define C_HEADSHAPES (0x4000) /* head shapes for notehead characters */
410
411/* context classes--combining things that mostly have the same rules */
412#define C_BLOCKHEAD (C_HEADER | C_FOOTER | C_HEAD2 | C_FOOT2 | \
413 C_TOP | C_BOT | C_TOP2 | C_BOT2 | C_BLOCK)
414#define C_SSV (C_SCORE | C_STAFF | C_VOICE)
415
416/* define whether things are measured in inches or centimeters */
417#define INCHES (0)
418#define CM (1)
419
420/*
421 * Define the voice schemes. V_1 means just one voice is on the staff;
422 * the program will decide the stem direction of each group. V_2OPSTEM
423 * means there are two voices with opposing stems: the first voice always
424 * points up, and the second one always points down. V_2FREESTEM means there
425 * are two voices. If, at any time, one has a space, the other one's stems
426 * can point either way (as with one voice). Otherwise, the first voice
427 * points up and the second one down.
428 * V_3OPSTEM and V_3FREESTEM are just like the "2" ones, except that a third
429 * voice is allowed to exist. Its stem direction is determined elsewhere.
430 */
431#define V_1 (0)
432#define V_2OPSTEM (1)
433#define V_2FREESTEM (2)
434#define V_3OPSTEM (3)
435#define V_3FREESTEM (4)
436
437/*
438 * Define the modes of the voicecombine parameter.
439 */
440/* bottom note of high voice must be higher than top note of low voice */
441#define VC_NOOVERLAP (0)
442/* bottom note of high voice must be no lower than top note of low voice */
443#define VC_SHAREONE (1)
444/* no restrictions */
445#define VC_OVERLAP (2)
446
447/*
448 * Define the staff style vis-a-vis printing of clefs, accidentals (in key
449 * signatures and otherwise), and tranposing. WARNING: SS_NOTHING must be
450 * defined to be 0 so that calloc inits the field to this.
451 */
452#define SS_NOTHING (0) /* no transpose; print no clef, no accidentals*/
453#define SS_NORMAL (1) /* normal printing */
454#define SS_DRUM (2) /* like SS_NOTHING, but print a "drum clef" */
455
456/*
457 * Define the time signature types. NUMERIC is the usual two-number
458 * signature. INVISNUM is the same, except that it will not be printed.
459 * Common and cut time are noted here separately. But for all other
460 * purposes they are treated as 4/4 and 2/2 respectively.
461 */
462#define TS_NUMERIC (0)
463#define TS_INVISNUM (1)
464#define TS_COMMON (2)
465#define TS_CUT (3)
466
467/*
468 * Special bytes used inside time signature representation.
469 * These values need to be outside the range of time signature numerators
470 * and denominators, but small enough to fit in a byte.
471 * Probably safer to keep them under 128 as well, to avoid any possible
472 * issues with negative chars.
473 *
474 * Here's how the encoding works:
475 * cut and common get stored as TSR_CUT and TSR_COMMON respectively.
476 * If a + is used between a denominator of one fraction
477 * and numerator of another, it is encoded as TSR_ADD.
478 * When a + is used inside a numerator, nothing is stored at all,
479 * since it is clear all numbers up to the slash
480 * must be components of the numerator.
481 * White space rather than + after a denominator
482 * means alternating time signatures, marked internally by TSR_ALTERNATING.
483 * Numbers are stored as their binary values.
484 * A TSR_END is placed at the end of everything to mark the end.
485 * A null is used for that, so one could use things like strlen or strcpy
486 * on a representation.
487 */
488#define TSR_CUT (MAXNUMERATOR + 1)
489#define TSR_COMMON (MAXNUMERATOR + 2)
490#define TSR_SLASH (MAXNUMERATOR + 3)
491#define TSR_ADD (MAXNUMERATOR + 4)
492#define TSR_ALTERNATING (MAXNUMERATOR + 5)
493#define TSR_END (0)
494
495/*
496 * This is the maximum length of an internal time signature representation.
497 * Note that the internal form is more compact than the input form,
498 * so even something so ridiculously complicated that it's doubtful any
499 * human could keep it straight, like
500 * 3+1+4/16 + cut + 7+11+41/2 9+2/64 + 5+7+31+29/1 + com
501 * would only take 28 bytes, so 40 should be plenty!
502 * The maximum number of numerator components 40 bytes could accomodate
503 * would be 37, so maximum theoretical effective time signature
504 * would be thirty-seven 99's or 3663 counts.
505 */
506#define MAXTSLEN 40
507
508/*
509 * Define when time signatures should be printed. "Once" means when it
510 * changes. "Always" makes sense only when there is an alternating time sig,
511 * and it means print it at each measure.
512 */
513#define PTS_NEVER (0) /* user input "n" */
514#define PTS_ONCE (1) /* user input nothing */
515#define PTS_ALWAYS (2) /* user input "y" */
516
517/*
518 * Define the clefs that are allowed. The values are important, so that
519 * the program can conveniently figure note positions without having a
520 * separate case for each value.
521 */
522#define TREBLE_8A (-7)
523#define FRENCHVIOLIN (-2)
524#define TREBLE (0)
525#define SOPRANO (2)
526#define MEZZOSOPRANO (4)
527#define ALTO (6)
528#define TREBLE_8 (7)
529#define TENOR (8)
530#define BARITONE (10)
531#define BASS (12)
532#define TABCLEF (-1) /* tablature "clef" */
533#define NOCLEF (-99) /* no clef is present */
534
535/*
536 * Define what a GRPSYL structure can represent.
537 */
538#define GS_GROUP (0)
539#define GS_SYLLABLE (1)
540
541/*
542 * Define the different contents a group can have.
543 */
544#define GC_NOTES (0)
545#define GC_REST (1)
546#define GC_SPACE (2)
547
548/*
549 * Define the time values a group can have. Only note groups can be other than
550 * normal (grace notes). There are no grace rests or spaces.
551 */
552#define GV_NORMAL (0)
553#define GV_ZERO (1)
554
555/*
556 * Define the unknown value for headshapes. The other values aren't defined
557 * here because they are established as headshapes are loaded at run time.
558 * There is a built-in set of these that are loaded, and then the user can use
559 * the "headshapes" context to load more. Each headshape number corresponds to
560 * a headshape name, such as "norm", "xnote", "rect", etc., and stands for the
561 * set of music characters used to print note heads of the various basictimes.
562 */
563#define HS_UNKNOWN (0)
564
565/*
566 * Define the size of a group. Spaces are always normal, but notes and rests
567 * can have different sizes. For note groups, this can vary on a per-note
568 * basis.
569 */
570#define GS_NORMAL (0)
571#define GS_SMALL (1)
572
573/*
574 * Define position that you can be in relative to a list of objects.
575 */
576#define NOITEM (0) /* not within a list */
577#define STARTITEM (1) /* first item in a list */
578#define INITEM (2) /* interior item in a list */
579#define ENDITEM (3) /* last item in a list */
580#define LONEITEM (4) /* only item in a list */
581
582
583/*
584 * Define the directions for various items.
585 */
586#define UNKNOWN (0)
587#define UP (1)
588#define DOWN (2)
589
590
591/*
592 * Define values for controlling printing of tuplet numbers and brackets.
593 * For PT_DEFAULT, the bracket will be printed unless all the notes of the
594 * tuplet (and no other notes) form a beamed set.
595 */
596#define PT_NEITHER (0) /* never print number or bracket */
597#define PT_DEFAULT (1) /* always print number; maybe print bracket */
598#define PT_BOTH (2) /* always print number and bracket */
599#define PT_NUMBER (3) /* always print just the number */
600
601
602/*
603 * Coordinate types that can have location variables associated with them.
604 */
605#define CT_BUILTIN (1)
606#define CT_GRPSYL (2)
607#define CT_BAR (4)
608#define CT_NOTE (8)
609#define CT_INVISIBLE (128)
610
611
612/*
613 * Define the types of STUFF structure. "Stuff" is things that are to be
614 * printed other than the actual music and lyrics.
615 */
616#define ST_ROM (0)
617#define ST_BOLD (1)
618#define ST_ITAL (2)
619#define ST_BOLDITAL (3)
620#define ST_CRESC (4)
621#define ST_DECRESC (5)
622#define ST_MUSSYM (6)
623#define ST_PEDAL (7)
624#define ST_TIESLUR (8)
625#define ST_TABSLUR (9)
626#define ST_BEND (10)
627#define ST_PHRASE (11)
628#define ST_OCTAVE (12)
629#define ST_MIDI (13)
630
631#define IS_TEXT(stype) ((stype) == ST_ROM || (stype) == ST_ITAL || \
632 (stype) == ST_BOLD || (stype) == ST_BOLDITAL)
633
634/*
635 * Define the places where the stuff can be printed, relative to staff(s).
636 */
637#define PL_ABOVE (0)
638#define PL_BELOW (1)
639#define PL_BETWEEN (2)
640#define PL_UNKNOWN (3)
641#define NUM_PLACE (3) /* number of "good" places (exclude unknown) */
642
643/*
644 * Define the ways a user can specify the horizonal offset of a group from the
645 * chord's X coordinate.
646 */
647#define HO_NONE (0) /* not specified */
648#define HO_LEFT (1) /* "-" (next to other group(s), on the left) */
649#define HO_RIGHT (2) /* "+" (next to other group(s), on the right) */
650#define HO_VALUE (3) /* "+/-N" (offset given by GRPSYL.ho_value) */
651
652/*
653 * Define text modifiers: different flavors of rom, bold, ital, and
654 * boldital. TM_DYN also applies automatically to the hairpin stuffs, < and >.
655 */
656#define TM_NONE (0)
657#define TM_CHORD (1)
658#define TM_ANALYSIS (2)
659#define TM_FIGBASS (3)
660#define TM_DYN (4)
661
662#define IS_CHORDLIKE(x) ((x) == TM_CHORD || (x) == TM_ANALYSIS || \
663 (x) == TM_FIGBASS)
664
665/*
666 * Define values for dist_usage in STUFF.
667 */
668#define SD_NONE (0) /* user did not specify */
669#define SD_MIN (1) /* user specified minimum distance */
670#define SD_FORCE (2) /* user is forcing this distance */
671
672/*
673 * Define all the types of marks that the user can request to be stacked in
674 * different orders. This list is in increasing order of the default priority
675 * of stacking, except that by default MK_DYN, MK_OTHERTEXT, and MK_CHORD are
676 * of equal priority. If this list changes, make sure that Defmarkorder[]
677 * is updated too. For each place (above, below, between), the user can
678 * specify a different ordering of priority to be used. There is a restriction
679 * that the last ones (MK_LYRICS, MK_ENDING, MK_REHEARSAL, MK_PEDAL) must
680 * have a different priority from each other and any of the other ones. Also,
681 * MK_PEDAL is allowed only below; MK_ENDING and MK_REHEARSAL are allowed only
682 * above; and those three and MK_OCTAVE are not allowed between.
683 */
684#define MK_MUSSYM (0) /* ST_MUSSYM */
685#define MK_OCTAVE (1) /* ST_OCTAVE */
686#define MK_DYN (2) /* ST_CRESC or ST_DECRESC; or ST_ROM, */
687 /* ST_ITAL, ST_BOLD, ST_BOLDITAL with "dyn" */
688 /* (TM_DYN is set for these and only these) */
689#define MK_OTHERTEXT (3) /* ST_ROM, ST_ITAL, ST_BOLD, ST_BOLDITAL */
690 /* without chord/analysis/figbass or dyn */
691#define MK_CHORD (4) /* ST_ROM, ST_ITAL, ST_BOLD, ST_BOLDITAL */
692 /* with chord, analysis, or figbass */
693 /* (TM_CHORD is set for these and only these) */
694#define MK_LYRICS (5) /* lyrics */
695#define MK_ENDING (6) /* ending mark */
696#define MK_REHEARSAL (7) /* rehearsal mark */
697#define MK_PEDAL (8) /* ST_PEDAL */
698#define NUM_MARK (9) /* this must follow the last MK */
699
700/*
701 * While parsing, we need to temporarily store some things as pseudo-pitches.
702 * When the user does not specify any pitch for the first group of a measure,
703 * we temporarily use PP_NO_PITCH, since not specifying a pitch is legal iff it
704 * is for one or more 1-line staffs, but it's not easy to check on that until
705 * later. We also need to save rest, space, and rpt as pseudo notes until we
706 * later map them to groups.
707 */
708#define PP_NO_PITCH 'h'
709#define PP_REST 'r'
710#define PP_SPACE 's'
711#define PP_RPT 'p'
712
713/*
714 * Define the other staff that a given staff's groups are beamed or stemmed to.
715 */
716#define CS_SAME (0)
717#define CS_ABOVE (1)
718#define CS_BELOW (2)
719
720/*
721 * Define symbols for indexing coordinate arrays. The first 12 are X, Y,
722 * north, south, east, and west, both relative and absolute. Not all things
723 * that have coordinates bother to set all 12 of these. There should be
724 * comments in structs.h saying which things get set for what.
725 *
726 * In GRPSYL, during the time that positions of phrase marks are being
727 * figured out, AN and AS are used in a strange way. But later, they get
728 * set to their intended values.
729 *
730 * The 13th is a special number used by nongrace notes and GRPSYLs, and BARs
731 * only. For notes and GRPSYLs, it has the following meaning. It indicates
732 * how many inches of horizontal space would be allocated to this object
733 * if it were a whole note instead of whatever it actually is, but were
734 * allocated space proportionally. That is, fulltime times this number
735 * is the amount of space between the X coordinates of this GRPSYL and
736 * the next one in the measure (or the bar line if this is the last GRPSYL
737 * in the measure). Notice that even for notes, it's the X coordinate of
738 * the note's GRPSYL that count, even if the note head is on the "wrong"
739 * side of the stem. For BARs, this 13th number has a similiar use. If
740 * you pretend that a bar line is count 0 of the following measure, and
741 * the first GRPSYL of the measure is at count 1 (whichever type of note
742 * constitutes a "count"), this number is how many inches would be allocated
743 * to a whole note instead of the one count of space that is there.
744 */
745#define RX (0)
746#define RY (1)
747#define RN (2)
748#define RS (3)
749#define RE (4)
750#define RW (5)
751#define AX (6)
752#define AY (7)
753#define AN (8)
754#define AS (9)
755#define AE (10)
756#define AW (11)
757#define INCHPERWHOLE (12)
758#define NUMCTYPE (13)
759
760
761/*
762 * AN and AS of group coordinates are used temporarily to store the distance
763 * from the group to any phrase marks, to be used to make sure nesting phrases
764 * don't impinge on that space. But if a group has a phrase ending on it and
765 * another beginning on it, those won't collide. So use bitmap to keep track
766 * of whether the AN and AS values apply to east side, west side, or both.
767 * (phraseside in GRPSYL is a bit map.)
768 */
769#define EAST_SIDE (1 << 0)
770#define WEST_SIDE (1 << 1)
771
772
773/*
774 * Define the types of bar line.
775 */
776#define INVISBAR (0)
777#define SINGLEBAR (1)
778#define DOUBLEBAR (2)
779#define REPEATSTART (3)
780#define REPEATEND (4)
781#define REPEATBOTH (5)
782#define ENDBAR (6)
783#define RESTART (7)
784
785/*
786 * Define the types of font, leaving 0 unused to avoid ending up having
787 * null characters appear in strings where this number is stored,
788 * and to have something convenient to use to flag an unknown font.
789 * WARNING: the getfontinfo.c program depends on all the font names
790 * beginning with "FONT_", and on MAXFONTS being at the end of the list.
791 */
792#define FONT_UNKNOWN (0)
793#define FAMILY_DFLT (-1)
794
795#define BASE_TIMES (0)
796#define FONT_TR (1)
797#define FONT_TI (2)
798#define FONT_TB (3)
799#define FONT_TX (4)
800
801#define BASE_AVANTGARDE (FONT_TX)
802#define FONT_AR (BASE_AVANTGARDE + FONT_TR)
803#define FONT_AI (BASE_AVANTGARDE + FONT_TI)
804#define FONT_AB (BASE_AVANTGARDE + FONT_TB)
805#define FONT_AX (BASE_AVANTGARDE + FONT_TX)
806
807#define BASE_COURIER (FONT_AX)
808#define FONT_CR (BASE_COURIER + FONT_TR)
809#define FONT_CI (BASE_COURIER + FONT_TI)
810#define FONT_CB (BASE_COURIER + FONT_TB)
811#define FONT_CX (BASE_COURIER + FONT_TX)
812
813#define BASE_HELVETICA (FONT_CX)
814#define FONT_HR (BASE_HELVETICA + FONT_TR)
815#define FONT_HI (BASE_HELVETICA + FONT_TI)
816#define FONT_HB (BASE_HELVETICA + FONT_TB)
817#define FONT_HX (BASE_HELVETICA + FONT_TX)
818
819#define BASE_BOOKMAN (FONT_HX)
820#define FONT_BR (BASE_BOOKMAN + FONT_TR)
821#define FONT_BI (BASE_BOOKMAN + FONT_TI)
822#define FONT_BB (BASE_BOOKMAN + FONT_TB)
823#define FONT_BX (BASE_BOOKMAN + FONT_TX)
824
825#define BASE_NEWCENTURY (FONT_BX)
826#define FONT_NR (BASE_NEWCENTURY + FONT_TR)
827#define FONT_NI (BASE_NEWCENTURY + FONT_TI)
828#define FONT_NB (BASE_NEWCENTURY + FONT_TB)
829#define FONT_NX (BASE_NEWCENTURY + FONT_TX)
830
831#define BASE_PALATINO (FONT_NX)
832#define FONT_PR (BASE_PALATINO + FONT_TR)
833#define FONT_PI (BASE_PALATINO + FONT_TI)
834#define FONT_PB (BASE_PALATINO + FONT_TB)
835#define FONT_PX (BASE_PALATINO + FONT_TX)
836
837#ifdef EXTCHAR
838/* extra fonts that contain the extended character set start here.
839 * They go in the same order as their corresponding standard ASCII fonts */
840#define EXT_FONT_OFFSET (FONT_PX - BASE_TIMES)
841
842#define FONT_XTR (FONT_TR + EXT_FONT_OFFSET)
843#define FONT_XTI (FONT_TI + EXT_FONT_OFFSET)
844#define FONT_XTB (FONT_TB + EXT_FONT_OFFSET)
845#define FONT_XTX (FONT_TX + EXT_FONT_OFFSET)
846
847#define FONT_XAR (FONT_AR + EXT_FONT_OFFSET)
848#define FONT_XAI (FONT_AI + EXT_FONT_OFFSET)
849#define FONT_XAB (FONT_AB + EXT_FONT_OFFSET)
850#define FONT_XAX (FONT_AX + EXT_FONT_OFFSET)
851
852#define FONT_XCR (FONT_CR + EXT_FONT_OFFSET)
853#define FONT_XCI (FONT_CI + EXT_FONT_OFFSET)
854#define FONT_XCB (FONT_CB + EXT_FONT_OFFSET)
855#define FONT_XCX (FONT_CX + EXT_FONT_OFFSET)
856
857#define FONT_XHR (FONT_HR + EXT_FONT_OFFSET)
858#define FONT_XHI (FONT_HI + EXT_FONT_OFFSET)
859#define FONT_XHB (FONT_HB + EXT_FONT_OFFSET)
860#define FONT_XHX (FONT_HX + EXT_FONT_OFFSET)
861
862#define FONT_XBR (FONT_BR + EXT_FONT_OFFSET)
863#define FONT_XBI (FONT_BI + EXT_FONT_OFFSET)
864#define FONT_XBB (FONT_BB + EXT_FONT_OFFSET)
865#define FONT_XBX (FONT_BX + EXT_FONT_OFFSET)
866
867#define FONT_XNR (FONT_NR + EXT_FONT_OFFSET)
868#define FONT_XNI (FONT_NI + EXT_FONT_OFFSET)
869#define FONT_XNB (FONT_NB + EXT_FONT_OFFSET)
870#define FONT_XNX (FONT_NX + EXT_FONT_OFFSET)
871
872#define FONT_XPR (FONT_PR + EXT_FONT_OFFSET)
873#define FONT_XPI (FONT_PI + EXT_FONT_OFFSET)
874#define FONT_XPB (FONT_PB + EXT_FONT_OFFSET)
875#define FONT_XPX (FONT_PX + EXT_FONT_OFFSET)
876
877#define BASE_MISC (FONT_XPX)
878#else
879#define BASE_MISC (FONT_PX)
880#endif
881#define FONT_ZD (BASE_MISC + 1)
882#define FONT_ZI (BASE_MISC + 2)
883#define FONT_MUSIC (BASE_MISC + 3)
884#define FONT_MUSIC2 (BASE_MISC + 4)
885#define MAXFONTS (BASE_MISC + 5)
886
887/* number of music fonts */
888#define NUM_MFONTS (2)
889
890/* first printable character in a font */
891#define FIRST_CHAR (32)
892
893/*
894 * The following value plus FIRST_CHAR needs to be at least as large as
895 * one more than the largest value in either muschar.h or extchar.h
896 */
897#define CHARS_IN_FONT (96)
898
899/*
900 * Find array offset into height, width, and ascent tables. This is character
901 * code -FIRST_CHAR, to skip ASCII control characters.
902 */
903#define CHAR_INDEX(c) ((c) - FIRST_CHAR)
904
905/*
906 * Test if a font is a "music" font.
907 */
908#define IS_MUSIC_FONT(f) ((f) == FONT_MUSIC || (f) == FONT_MUSIC2)
909
910/*
911 * Special commands to use inside internal format of strings.
912 * All use high-bit==1 to indicate a command.
913 * Note that the low order bits of STR_MUS_CHAR* specify which music font it is.
914 */
915#define STR_MUS_CHAR 0x80 /* followed by 1-byte size and 1-byte \
916 * music character code */
917#define STR_MUS_CHAR2 0x81 /* same rules as above */
918#define STR_FONT 0xe0 /* followed by 1-byte font number */
919#define STR_SIZE 0xe1 /* followed by 1-byte size */
920#define STR_PAGENUM 0xe2 /* followed by '%' */
921#define STR_NUMPAGES 0xe3 /* followed by '#' */
922#define STR_PRE 0xe4 /* pre-syl <--->, ignored in spacing */
923#define STR_U_PRE 0xe5 /* pre-syl <...>, used in spacing */
924#define STR_PRE_END 0xe6 /* end of pre-syllable <...> */
925#define STR_PST 0xe7 /* post-syl <...>, ignored in spacing */
926#define STR_U_PST 0xe8 /* post-syl <...>, used in spacing */
927#define STR_PST_END 0xe9 /* end of post-syllable <...> */
928/*
929 * Backspace is a bit strange. The amount to back up varies because of
930 * proportionally spaced fonts. So we save the distance in terms of the width
931 * in 250ths of an inch in the default size. The actual distance to back up is
932 * then that number times the ratio of the current actual size to the default
933 * size divided by 250. 250 was chosen because that means a range of 1-127
934 * (to make sure it is non-zero and with high-bit of zero)
935 * will give a range of .004 to 0.508 inches, which should cover all
936 * characters we have today (the widest of which is currently just over 1/4").
937 * This is done in floating point, so no reason to use a power of 2 like 256.
938 */
939#define STR_BACKSPACE 0xea /* followed by how much to back up */
940
941#define BACKSP_FACTOR (250.0)
942
943/* string commands for boxed text */
944#define STR_BOX 0xeb
945#define STR_BOX_END 0xec
946#define IS_BOXED(string) (((string[2] & 0xff) == (STR_BOX & 0xff)) ? YES : NO)
947
948#define STR_VERTICAL 0xed /* vert move followed by 1-byte dist */
949#define STR_L_ALIGN 0xee /* align at left edge of next char */
950#define STR_C_ALIGN 0xef /* align at center of next char */
951#define STR_PILE 0xf0 /* toggle for piling, \: */
952#define STR_SLASH 0xf1 /* slash used by figbass, \/ */
953
954/* string commands for circled text */
955#define STR_CIR 0xf2
956#define STR_CIR_END 0xf3
957#define IS_CIRCLED(string) (((string[2] & 0xff) == (STR_CIR & 0xff)) ? YES : NO)
958
959/*
960 * Define macros relating to vertical movement within a string. It is stored
961 * in points, offset by a bias so that the number will always be positive when
962 * stored in the byte after the STR_VERTICAL in a string.
963 */
964#define MINVERTICAL (-50)
965#define MAXVERTICAL (50)
966#define VERT_BIAS (1 - MINVERTICAL)
967#define ENCODE_VERT(x) (x + VERT_BIAS)
968#define DECODE_VERT(x) (x - VERT_BIAS)
969
970/*
971 * Macro to determine if a character in an internal-format string is a
972 * command character.
973 */
974#define IS_STR_COMMAND(c) ((c) & 0x80)
975
976
977#define DFLT_SIZE (12)
978#define SMALLSIZE ((int)(DFLT_SIZE * SM_FACTOR))
979
980/*
981 * Define the default font size of a measure number.
982 */
983#define MNUM_SIZE (11)
984
985/*
986 * Define types of lines and curves.
987 */
988#define L_NORMAL (0)
989#define L_MEDIUM (1)
990#define L_WIDE (2)
991#define L_WAVY (3)
992#define L_DOTTED (4)
993#define L_DASHED (5)
994
995/*
996 * Define the kinds of justification.
997 */
998#define J_LEFT (1)
999#define J_RIGHT (2)
1000#define J_CENTER (3)
1001#define J_NONE (4)
1002#define J_RAGPARA (5) /* ragged-right paragraph */
1003#define J_JUSTPARA (6) /* justified paragraph */
1004
1005/*
1006 * Define the ending styles (which staffs 1st, 2nd, etc. endings are to
1007 * be drawn on).
1008 */
1009#define ENDING_TOP (0) /* only above top visible staff */
1010#define ENDING_BARRED (1) /* above each group of staffs barred together*/
1011#define ENDING_GROUPED (2) /* above each group of staffs grouped */
1012 /* together by braces or brackets */
1013
1014/*
1015 * Define types of rehearsal letters/numbers.
1016 */
1017#define REH_NONE (0) /* none at all */
1018#define REH_STRING (1) /* user-supplied string */
1019#define REH_NUM (2) /* consecutive numbers 1, 2, 3, . . . */
1020#define REH_LET (3) /* consecutive letters A, B, C, . . . */
1021#define REH_MNUM (4) /* use current measure number */
1022
1023/*
1024 * Define the style of (ways of drawing) rehearsal letters/numbers.
1025 */
1026#define RS_PLAIN (0) /* just the letter/number */
1027#define RS_BOXED (1) /* enclosed in a box */
1028#define RS_CIRCLED (2) /* enclosed in a circle */
1029
1030/*
1031 * Define the ways to print pedal markings.
1032 */
1033#define P_LINE (0) /* draw a line under where the pedal is down */
1034#define P_PEDSTAR (1) /* print "Ped." and the start and "*" at end */
1035#define P_ALTPEDSTAR (2) /* like P_PEDSTAR but only "Ped." when bounce*/
1036
1037/*
1038 * Define the side of a stem that a partial beam can be on. There is code in
1039 * prntdata.c that depends on these values, -1 and 1.
1040 */
1041#define PB_LEFT (-1)
1042#define PB_RIGHT (1)
1043
1044/*
1045 * Define types of intervals. There is code that depends on these being in
1046 * this order, starting from 0, counting up (like in trnspose.c).
1047 */
1048#define DIMINISHED (0)
1049#define MINOR (1)
1050#define PERFECT (2)
1051#define MAJOR (3)
1052#define AUGMENTED (4)
1053
1054/*
1055 * Define the input style.
1056 */
1057#define IS_VOICE_INPUT (0) /* voice-at-a-time (must be zero) */
1058#define IS_CHORD_INPUT (1) /* chord-at-a-time */
1059
1060/*
1061 * Define the valid page sizes. The values must match the indexes of
1062 * pagesztbl in gram.y.
1063 */
1064#define PS_LETTER (0)
1065#define PS_LEGAL (1)
1066#define PS_FLSA (2)
1067#define PS_HALFLETTER (3)
1068#define PS_A4 (4)
1069#define PS_A5 (5)
1070#define PS_A6 (6)
1071
1072/* Define page orientations */
1073#define O_PORTRAIT (0)
1074#define O_LANDSCAPE (1)
1075
1076/*
1077 * Define various constants =============================================
1078 */
1079
1080/* the number of PostScript points in one inch */
1081#define PPI (72.0)
1082
1083/* the size of a point in inches */
1084#define POINT (1.0 / PPI)
1085
1086/* the distance between a note and the next higher note */
1087#define STEPSIZE (3.0 * POINT)
1088
1089/* size of white space for surrounding things that should be padded thus */
1090#define STDPAD (STEPSIZE / 3.0)
1091
1092/* (distance between tab staff lines) / (distance between normal staff lines)*/
1093#define TABRATIO (1.735)
1094
1095/* scaling factor giving size of "sm" (small) music chars relative to normal */
1096#define SM_FACTOR (0.65)
1097
1098/* scaling factor giving size of a grace fret number relative to normal */
1099#define SMFRETSIZE ((int)(0.80 * DFLT_SIZE))
1100
1101/* font character size information is stored in FONTFACTORs of an inch */
1102#define FONTFACTOR (1000.0)
1103
1104/* widths of various types of lines, in points */
1105#define W_NORMAL (0.7)
1106#define W_MEDIUM (1.5)
1107#define W_WIDE (3.0)
1108
1109/* vertical distance between two flags or two beams */
1110#define FLAGSEP (1.6 * STEPSIZE) /* for normal notes */
1111#define SMFLAGSEP (FLAGSEP * SM_FACTOR) /* for cue or grace notes */
1112
1113/* minimum width to be given to a multirest */
1114#define MINMULTIWIDTH (0.7)
1115
1116/* temporary width for a measure rest, serves as a marker */
1117#define TEMPMRPTWIDTH (0.02)
1118
1119/* half the width of a restart bar */
1120#define HALF_RESTART_WIDTH (12 * POINT)
1121
1122/* padding provided to force more room between groups for various reasons */
1123#define TIESLURPAD (0.12) /* ties and slurs */
1124#define SLASHPAD (0.06) /* slashes through stems */
1125#define ALTPAD (0.12) /* alternation beams between groups */
1126#define ROLLPADDING (12 * STDPAD) /* a roll to the left of a group */
1127
1128/* padding to be put after a clef */
1129#define CLEFPAD (2.0 * STDPAD)
1130
1131/* how high certain things are */
1132#define TUPHEIGHT (10.0/3.0 * STEPSIZE) /* tuplet bracket */
1133#define OCTHEIGHT (10.0/3.0 * STEPSIZE) /* octave bracket */
1134#define ENDINGHEIGHT (13.0/3.0 * STEPSIZE) /* ending bracket */
1135#define MULTIHEIGHT (12.0/3.0 * STEPSIZE) /* multirest number */
1136#define MINWITHHEIGHT (2.2 * STEPSIZE) /* minimum "with" list item */
1137
1138/* horizontal extent of a slash, in stepsizes */
1139#define SLASHHORZ (5.0 / 3.0)
1140
1141/*
1142 * The maximum number of notes there could ever be in a "hand" (the notes of a
1143 * chord that occur on a given staff) is the number of unique notes that can
1144 * exist, C0 through B9.
1145 */
1146#define MAXHAND ((MAXOCTAVE - MINOCTAVE + 1) * 7)
1147
1148/* the length in the X direction of a tabslur to or from nowhere */
1149#define SLIDEXLEN (3.0 * STEPSIZE)
1150
1151/* define the default distance, in stepsizes, between the lines of a grid */
1152#define WHEREUSED_GS (1.6) /* when printed by the music */
1153#define ATEND_GS (2.0) /* when printed at the end of the song */
1154
1155#define NO (0)
1156#define YES (1)
1157
1158/* the "used" field in input SSVs uses the following in addition to YES/NO */
1159#define UNSET (2)
1160
1161#ifndef PI
1162#define PI (3.141592653589793)
1163#endif
1164
1165#define CMPERINCH (2.54) /* centimeters per inch */
1166
1167/*
1168 * Define miscellaneous macros =============================================
1169 */
1170
1171/* number of elements in an array */
1172#define NUMELEM(a) (sizeof(a) / sizeof((a)[0]))
1173
1174/*
1175 * Define macros for allocating structures.
1176 */
1177#define MALLOC(structtype, new_p, numelem) { \
1178 if ((new_p = (struct structtype *)malloc((unsigned) \
1179 (((numelem) == 0 ? 1 : (numelem)) * \
1180 sizeof(struct structtype)))) == 0) \
1181 l_no_mem(__FILE__, __LINE__); \
1182}
1183#define CALLOC(structtype, new_p, numelem) { \
1184 if ((new_p = (struct structtype *)calloc( \
1185 (numelem) == 0 ? 1 : (numelem), \
1186 (unsigned)sizeof(struct structtype))) == 0) \
1187 l_no_mem(__FILE__, __LINE__); \
1188}
1189#ifndef __STDC__
1190#define REALLOC(structtype, new_p, numelem) { \
1191 if ((new_p = (struct structtype *)realloc((char *)(new_p), \
1192 (unsigned)(((numelem) == 0 ? 1 : (numelem)) * \
1193 sizeof(struct structtype)))) == 0) \
1194 l_no_mem(__FILE__, __LINE__); \
1195}
1196#else
1197#define REALLOC(structtype, new_p, numelem) { \
1198 if ((new_p = (struct structtype *)realloc((void *)(new_p), \
1199 (unsigned)(((numelem) == 0 ? 1 : (numelem)) * \
1200 sizeof(struct structtype)))) == 0) \
1201 l_no_mem(__FILE__, __LINE__); \
1202}
1203#endif
1204
1205/*
1206 * Define macros for allocating other arrays.
1207 */
1208#define MALLOCA(type, new_p, numelem) { \
1209 if ((new_p = (type *)malloc((unsigned) \
1210 (((numelem) == 0 ? 1 : (numelem)) * \
1211 sizeof(type)))) == 0) \
1212 l_no_mem(__FILE__, __LINE__); \
1213}
1214#define CALLOCA(type, new_p, numelem) { \
1215 if ((new_p = (type *)calloc((numelem) == 0 ? 1 : (numelem), \
1216 (unsigned)sizeof(type))) == 0) \
1217 l_no_mem(__FILE__, __LINE__); \
1218}
1219#ifndef __STDC__
1220#define REALLOCA(type, new_p, numelem) { \
1221 if ((new_p = (type *)realloc((char *)(new_p), \
1222 (unsigned)(((numelem) == 0 ? 1 : (numelem)) * \
1223 sizeof(type)))) == 0) \
1224 l_no_mem(__FILE__, __LINE__); \
1225}
1226#else
1227#define REALLOCA(type, new_p, numelem) { \
1228 if ((new_p = (type *)realloc((void *)(new_p), \
1229 (unsigned)(((numelem) == 0 ? 1 : (numelem)) * \
1230 sizeof(type)))) == 0) \
1231 l_no_mem(__FILE__, __LINE__); \
1232}
1233#endif
1234
1235/* define macro for freeing memory */
1236#ifdef __STDC__
1237#define FREE(mem_p) free((void *)mem_p)
1238#else
1239#define FREE(mem_p) free((char *)mem_p)
1240#endif
1241
1242/* convert a RATIONAL to a float */
1243#define RAT2FLOAT(rat) ( (float)(rat).n / (float)(rat).d )
1244
1245/* the usual minimum and maximum macros */
1246#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
1247#define MIN(a, b) ( (a) < (b) ? (a) : (b) )
1248
1249/* absolute value of the difference of a and b */
1250#define ABSDIFF(a, b) ( (a) > (b) ? (a) - (b) : (b) - (a) )
1251
1252/* even and odd numbers (positive, zero, or negative; works on any compiler) */
1253#define EVEN(a) (abs(a) % 2 == 0)
1254#define ODD(a) (abs(a) % 2 == 1)
1255
1256#define SQUARED(x) ((x) * (x))
1257#define NEARESTQUARTER(x) ( (int)((x) * 4.0 + 0.5) / 4.0 )
1258
1259/* half the height of a staff in stepsizes; use 1 for 1-line staffs */
1260#define HALFSTAFF(s) ((svpath(s, STAFFLINES)->stafflines == 5) ? 4 : 1)
1261
1262/* given ptr to a group, return the NOTE struct for note nearest to the beam */
1263#define BNOTE(gs_p) \
1264 (gs_p)->notelist[ (gs_p)->stemdir == UP ? 0 : (gs_p)->nnotes - 1 ]
1265
1266/*
1267 * Define indices into GRPSYL.notelist for the first (FNNI) and last (LNNI)
1268 * non-cross-staff-stemmed notes. Also define indices for the first (FCNI)
1269 * and last (LCNI) cross-staff-stemmed notes.
1270 *
1271 * For FNNI and LNNI to work, there must be non-CSS notes, although even if
1272 * not, it's still okay to have loops like
1273 * for (n = FNNI(gs_p); n <= LNNI(gs_p); n++)
1274 * and the NNN macro, which uses them, always works.
1275 *
1276 * LCNI and FCNI only work if there are CSS notes.
1277 */
1278#define FNNI(gs_p) ((gs_p)->stemto == CS_ABOVE ? \
1279 (gs_p)->stemto_idx + 1 : 0)
1280#define LNNI(gs_p) ((gs_p)->stemto == CS_BELOW ? \
1281 (gs_p)->stemto_idx - 1 : (gs_p)->nnotes - 1)
1282#define FCNI(gs_p) ((gs_p)->stemto == CS_ABOVE ? \
1283 0 : (gs_p)->stemto_idx)
1284#define LCNI(gs_p) ((gs_p)->stemto == CS_BELOW ? \
1285 (gs_p)->nnotes - 1 : (gs_p)->stemto_idx)
1286
1287/* define the Number of Normal Notes (non-CSS notes) in a group */
1288#define NNN(gs_p) (LNNI(gs_p) - FNNI(gs_p) + 1)
1289
1290/* test whether the note given via the index is CSS */
1291#define IS_CSS_NOTE(gs_p, idx) ( \
1292 (((gs_p)->stemto == CS_ABOVE && idx <= (gs_p)->stemto_idx) || \
1293 ((gs_p)->stemto == CS_BELOW && idx >= (gs_p)->stemto_idx)) \
1294)
1295
1296/* test whether any CSS notes that exist would be on stem side of the group */
1297#define STEMSIDE_CSS(gs_p) \
1298 ((gs_p)->stemto == CS_ABOVE && (gs_p)->stemdir == UP || \
1299 (gs_p)->stemto == CS_BELOW && (gs_p)->stemdir == DOWN)
1300
1301/*
1302 * Define CSS_STEPS to be an offset to be applied to "stepsup" when the note is
1303 * on the other staff. It needs to be at twice as big as the interval between
1304 * the highest and lowest notes so that stepsup plus or minus half of it will
1305 * become a value that it could never be for a normal note (see doacc()), and
1306 * it has to be an even number, because, for example, that matters for vertical
1307 * dot placement.
1308 */
1309#define CSS_STEPS (MAXHAND * 2)
1310
1311/* is this FEED followed by a CLEFSIG (music), not a block? */
1312#define IS_CLEFSIG_FEED(mll_p) ((mll_p)->str == S_FEED && \
1313 (mll_p)->next != 0 && (mll_p)->next->str == S_CLEFSIG)
1314
1315/*
1316 * This macro is to be used as in this example:
1317 * extern int func P((int parm1, float parm2));
1318 * The ANSI version will result in a function prototype. The other version
1319 * will result in a function declaration (no parameters).
1320 */
1321#ifdef __STDC__
1322#define P(parms) parms
1323#else
1324#define P(parms) ()
1325#endif
1326
1327#endif