forked from lewdlime/abcm2ps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
abcm2ps.h
903 lines (846 loc) · 29.2 KB
/
abcm2ps.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
/* -- general macros -- */
#include <stdio.h>
#include <time.h>
#include "config.h"
#define MAXVOICE 32 /* max number of voices */
#define MAXHD 8 /* max heads in a chord */
#define MAXDC 32 /* max decorations per symbol */
#define MAXMICRO 32 /* max microtone values (5 bits in accs[]) */
#define DC_NAME_SZ 128 /* size of the decoration name table */
#define BASE_LEN 1536 /* basic note length (semibreve or whole note - same as MIDI) */
#define VOICE_ID_SZ 16 /* max size of the voice identifiers */
/* accidentals */
enum accidentals {
A_NULL, /* none */
A_SH, /* sharp */
A_NT, /* natural */
A_FT, /* flat */
A_DS, /* double sharp */
A_DF /* double flat */
};
/* bar types - 4 bits per symbol */
#define B_BAR 1 /* | */
#define B_OBRA 2 /* [ */
#define B_CBRA 3 /* ] */
#define B_COL 4 /* : */
#define B_SINGLE 0x01 /* | single bar */
#define B_DOUBLE 0x11 /* || thin double bar */
#define B_THIN_THICK 0x13 /* |] thick at section end */
#define B_THICK_THIN 0x21 /* [| thick at section start */
#define B_LREP 0x14 /* |: left repeat bar */
#define B_RREP 0x41 /* :| right repeat bar */
#define B_DREP 0x44 /* :: double repeat bar */
#define B_DASH 0x04 /* : dashed bar */
/* slur/tie types (4 bits) */
#define SL_ABOVE 0x01
#define SL_BELOW 0x02
#define SL_HIDDEN 0x03 /* also opposite for gstemdir */
#define SL_AUTO 0x04
#define SL_DOTTED 0x08 /* (modifier bit) */
#define OUTPUTFILE "Out.ps" /* standard output file */
#ifndef WIN32
#define DIRSEP '/'
#else
#define DIRSEP '\\'
#define strcasecmp stricmp
#define strncasecmp _strnicmp
#define strdup _strdup
#define snprintf _snprintf
#ifdef _MSC_VER
#define fileno _fileno
#endif
#endif
#define CM * 37.8 /* factor to transform cm to pt */
#define PT /* factor to transform pt to pt */
#define IN * 96.0 /* factor to transform inch to pt */
/* basic page dimensions */
#ifdef A4_FORMAT
#define PAGEHEIGHT (29.7 CM)
#define PAGEWIDTH (21.0 CM)
#define MARGIN (1.8 CM)
#else
#define PAGEHEIGHT (11.0 IN)
#define PAGEWIDTH (8.5 IN)
#define MARGIN (0.7 IN)
#endif
/* -- macros controlling music typesetting -- */
#define STEM_YOFF 1.0 /* offset stem from note center */
#define STEM_XOFF 3.5
#define STEM 21 /* default stem height = one octave */
#define STEM_MIN 16 /* min stem height under beams */
#define STEM_MIN2 14 /* ... for notes with two beams */
#define STEM_MIN3 12 /* ... for notes with three beams */
#define STEM_MIN4 10 /* ... for notes with four beams */
#define STEM_CH_MIN 14 /* min stem height for chords under beams */
#define STEM_CH_MIN2 10 /* ... for notes with two beams */
#define STEM_CH_MIN3 9 /* ... for notes with three beams */
#define STEM_CH_MIN4 9 /* ... for notes with four beams */
#define BEAM_DEPTH 3.2 /* width of a beam stroke */
#define BEAM_OFFSET 0.25 /* pos of flat beam relative to staff line */
#define BEAM_SHIFT 5.0 /* shift of second and third beams */
/* To align the 4th beam as the 1st: shift=6-(depth-2*offset)/3 */
#define BEAM_FLATFAC 0.6 /* factor to decrease slope of long beams */
#define BEAM_THRESH 0.06 /* flat beam if slope below this threshold */
#define BEAM_SLOPE 0.5 /* max slope of a beam */
#define BEAM_STUB 7.0 /* length of stub for flag under beam */
#define SLUR_SLOPE 1.0 /* max slope of a slur */
#define GSTEM 15 /* grace note stem length */
#define GSTEM_XOFF 2.3 /* x offset for grace note stem */
#define BETA_C 0.1 /* max expansion for flag -c */
#define BETA_X 1.0 /* max expansion before complaining */
#define VOCPRE 0.4 /* portion of vocals word before note */
#define GCHPRE 0.4 /* portion of guitar chord before note */
/* -- Parameters for note spacing -- */
/* fnn multiplies the spacing under a beam, to compress the notes a bit */
#define fnnp 0.9
/* -- macros for program internals -- */
#define STRL1 256 /* string length for file names */
#define MAXSTAFF 32 /* max staves */
#define BSIZE 512 /* buffer size for one input string */
#define BREVE (BASE_LEN * 2) /* double note (square note) */
#define SEMIBREVE BASE_LEN /* whole note */
#define MINIM (BASE_LEN / 2) /* half note (white note) */
#define CROTCHET (BASE_LEN / 4) /* quarter note (black note) */
#define QUAVER (BASE_LEN / 8) /* 1/8 note */
#define SEMIQUAVER (BASE_LEN / 16) /* 1/16 note */
#define MAXFONTS 30 /* max number of fonts */
#define T_LEFT 0
#define T_JUSTIFY 1
#define T_FILL 2
#define T_CENTER 3
#define T_SKIP 4
#define T_RIGHT 5
#define YSTEP 128 /* number of steps for y offsets */
struct decos { /* decorations */
char n; /* whole number of decorations */
struct {
unsigned char t; /* decoration index */
signed char m; /* index in chord when note / -1 */
} tm[MAXDC];
};
struct note_map { /* note mapping */
struct note_map *next; /* note linkage */
char type; /* map type */
#define MAP_ONE 0
#define MAP_OCT 1
#define MAP_KEY 2
#define MAP_ALL 3
signed char pit; /* note pitch and accidental */
unsigned char acc;
char *heads; /* comma separated list of note heads */
int color; /* color */
signed char print_pit; /* print pitch */
unsigned char print_acc; /* print acc */
};
struct map { /* voice mapping */
struct map *next; /* name linkage */
char *name;
struct note_map *notes; /* mapping of the notes */
};
extern struct map *maps; /* note mappings */
struct note { /* note head */
int len; /* note duration (# pts in [1] if space) */
signed char pit; /* absolute pitch from source - used for ties and map */
unsigned char acc; /* code for accidental & index in micro_tb */
unsigned char sl1; /* slur start */
char sl2; /* number of slur ends */
char ti1; /* flag to start tie here */
char hlen; /* length of the head string */
char invisible; /* alternate note head */
float shhd; /* horizontal head shift (#pts if space) */
float shac; /* horizontal accidental shift */
char *head; /* head */
int color; /* heads when note mapping */
};
struct notes { /* note chord or rest */
struct note notes[MAXHD]; /* note heads */
unsigned char slur_st; /* slurs starting here (2 bits array) */
char slur_end; /* number of slurs ending here */
signed char brhythm; /* broken rhythm */
unsigned char microscale; /* microtone denominator - 1 */
float sdx; /* x offset of the stem */
struct decos dc; /* decorations */
};
extern int severity;
extern char *deco[256];
struct FONTSPEC {
int fnum; /* index to font tables in format.c */
float size;
float swfac;
};
extern char *fontnames[MAXFONTS]; /* list of font names */
/* lyrics */
#define LY_HYPH 0x10 /* replacement character for hyphen */
#define LY_UNDER 0x11 /* replacement character for underscore */
#define MAXLY 16 /* max number of lyrics */
struct lyl {
struct FONTSPEC *f; /* font */
float w; /* width */
float s; /* shift / note */
char t[256]; /* word (dummy size) */
};
struct lyrics {
struct lyl *lyl[MAXLY]; /* ptr to lyric lines */
};
/* guitar chord / annotations */
#define MAXGCH 8 /* max number of guitar chords / annotations */
struct gch {
char type; /* ann. char, 'g' gchord, 'r' repeat, '\0' end */
unsigned char idx; /* index in as.text */
unsigned char font; /* font */
char box; /* 1 if in box */
float x, y; /* x y offset / note + (top or bottom) of staff */
float w; /* width */
};
/* positions / directions - see SL_xxx */
struct posit_s {
unsigned short dyn:4; /* %%dynamic */
unsigned short gch:4; /* %%gchord */
unsigned short orn:4; /* %%ornament */
unsigned short voc:4; /* %%vocal */
unsigned short vol:4; /* %%volume */
unsigned short std:4; /* %%stemdir */
unsigned short gsd:4; /* %%gstemdir */
};
/* music element */
struct SYMBOL { /* struct for a drawable symbol */
struct SYMBOL *abc_next, *abc_prev; /* source linkage */
struct SYMBOL *next, *prev; /* voice linkage */
struct SYMBOL *ts_next, *ts_prev; /* time linkage */
struct SYMBOL *extra; /* extra symbols (grace notes, tempo... */
char abc_type; /* ABC symbol type */
#define ABC_T_NULL 0
#define ABC_T_INFO 1 /* (text[0] gives the info type) */
#define ABC_T_PSCOM 2
#define ABC_T_CLEF 3
#define ABC_T_NOTE 4
#define ABC_T_REST 5
#define ABC_T_BAR 6
#define ABC_T_EOLN 7
#define ABC_T_MREST 8 /* multi-measure rest */
#define ABC_T_MREP 9 /* measure repeat */
#define ABC_T_V_OVER 10 /* voice overlay */
#define ABC_T_TUPLET 11
unsigned char type; /* symbol type */
#define NO_TYPE 0 /* invalid type */
#define NOTEREST 1 /* valid symbol types */
#define SPACE 2
#define BAR 3
#define CLEF 4
#define TIMESIG 5
#define KEYSIG 6
#define TEMPO 7
#define STAVES 8
#define MREST 9
#define PART 10
#define GRACE 11
#define FMTCHG 12
#define TUPLET 13
#define STBRK 14
#define CUSTOS 15
#define NSYMTYPES 16
unsigned char voice; /* voice (0..nvoice) */
unsigned char staff; /* staff (0..nstaff) */
unsigned char nhd; /* number of notes in chord - 1 */
signed char pits[MAXHD]; /* pitches / clef */
int dur; /* main note duration */
int time; /* starting time */
unsigned int sflags; /* symbol flags */
#define S_EOLN 0x0001 /* end of line */
#define S_BEAM_ST 0x0002 /* beam starts here */
#define S_BEAM_BR1 0x0004 /* 2nd beam must restart here */
#define S_BEAM_BR2 0x0008 /* 3rd beam must restart here */
#define S_BEAM_END 0x0010 /* beam ends here */
#define S_CLEF_AUTO 0x0020 /* auto clef (when clef) */
#define S_IN_TUPLET 0x0040 /* in a tuplet */
#define S_TREM2 0x0080 /* tremolo on 2 notes */
#define S_RRBAR 0x0100 /* right repeat bar (when bar) */
#define S_XSTEM 0x0200 /* cross-staff stem (when note) */
#define S_BEAM_ON 0x0400 /* continue beaming */
#define S_SL1 0x0800 /* some chord slur start */
#define S_SL2 0x1000 /* some chord slur end */
#define S_TI1 0x2000 /* some chord tie start */
#define S_PERC 0x4000 /* percussion */
#define S_RBSTOP 0x8000 // end of repeat bracket
#define S_FEATHERED_BEAM 0x00010000 /* feathered beam */
#define S_REPEAT 0x00020000 /* sequence / measure repeat */
#define S_NL 0x00040000 /* start of new music line */
#define S_SEQST 0x00080000 /* start of vertical sequence */
#define S_SECOND 0x00100000 /* symbol on a secondary voice */
#define S_FLOATING 0x00200000 /* symbol on a floating voice */
#define S_NOREPBRA 0x00400000 /* don't print the repeat bracket */
#define S_TREM1 0x00800000 /* tremolo on 1 note */
#define S_TEMP 0x01000000 /* temporary symbol */
#define S_SHIFTUNISON_1 0x02000000 /* %%shiftunison 1 */
#define S_SHIFTUNISON_2 0x04000000 /* %%shiftunison 2 */
#define S_NEW_SY 0x08000000 /* staff system change (%%staves) */
#define S_RBSTART 0x10000000 // start of repeat bracket
struct posit_s posit; /* positions / directions */
signed char stem; /* 1 / -1 for stem up / down */
signed char combine; /* voice combine */
signed char nflags; /* number of note flags when > 0 */
char dots; /* number of dots */
unsigned char head; /* head type */
#define H_FULL 0
#define H_EMPTY 1
#define H_OVAL 2
#define H_SQUARE 3
signed char multi; /* multi voice in the staff (+1, 0, -1) */
signed char nohdi1; /* no head index (for unison) / nb of repeat */
signed char nohdi2;
signed char doty; /* NOTEREST: y pos of dot when voices overlap
* STBRK: forced
* FMTCHG REPEAT: infos */
short aux; /* auxillary information:
* - CLEF: small clef
* - KEYSIG: old key signature
* - BAR: new bar number
* - TUPLET: tuplet format
* - NOTE: tremolo number / feathered beam
* - FMTCHG (format change): subtype */
#define PSSEQ 0 /* postscript sequence */
#define SVGSEQ 1 /* SVG sequence */
#define REPEAT 2 /* repeat sequence or measure
* doty: # measures if > 0
* # notes/rests if < 0
* nohdi1: # repeat */
int color;
float x; /* x offset */
signed char y; /* y offset of note head */
signed char ymn, ymx; /* min, max, note head y offset */
signed char mid; // y offset of the staff middle line
float xmx; /* max h-pos of a head rel to top
* width when STBRK */
float xs, ys; /* coord of stem end / bar height */
float wl, wr; /* left, right min width */
float space; /* natural space before symbol */
float shrink; /* minimum space before symbol */
float xmax; /* max x offset */
struct gch *gch; /* guitar chords / annotations */
struct lyrics *ly; /* lyrics */
char state; /* symbol state in file/tune */
#define ABC_S_GLOBAL 0 /* global */
#define ABC_S_HEAD 1 /* in header (after X:) */
#define ABC_S_TUNE 2 /* in tune (after K:) */
unsigned short flags;
#define ABC_F_ERROR 0x0001 /* error around this symbol */
#define ABC_F_INVIS 0x0002 /* invisible symbol */
#define ABC_F_SPACE 0x0004 /* space before a note */
#define ABC_F_STEMLESS 0x0008 /* note with no stem */
#define ABC_F_LYRIC_START 0x0010 /* may start a lyric here */
#define ABC_F_GRACE 0x0020 /* grace note */
#define ABC_F_GR_END 0x0040 /* end of grace note sequence */
#define ABC_F_SAPPO 0x0080 /* short appoggiatura */
#define ABC_F_RBSTART 0x0100 // start of repeat bracket and mark
#define ABC_F_RBSTOP 0x0200 // end of repeat bracket and mark
unsigned short colnum; /* ABC source column number */
int linenum; /* ABC source line number */
char *fn; /* ABC source file name */
char *text; /* main text (INFO, PSCOM),
* guitar chord (NOTE, REST, BAR) */
union { /* type dependent part */
struct key_s { /* K: info */
signed char sf; /* sharp (> 0) flats (< 0) */
char empty; /* clef alone if 1, 'none' if 2 */
char exp; /* exp (1) or mod (0) */
// char mode; /* mode */
// /* 0: Ionian, 1: Dorian, 2: Phrygian, 3: Lydian,
// * 4: Mixolydian, 5: Aeolian, 6: Locrian */
char instr; /* specific instrument */
#define K_HP 1 /* bagpipe */
#define K_Hp 2
#define K_DRUM 3 /* percussion */
signed char nacc; /* number of explicit accidentals */
signed char cue; /* cue voice (scale 0.7) */
signed char octave; /* 'octave=' */
#define NO_OCTAVE 10 /* no 'octave=' */
unsigned char microscale; /* microtone denominator - 1 */
char clef_delta; /* clef delta */
char key_delta; // tonic base
char *stafflines;
float staffscale;
signed char pits[8];
unsigned char accs[8];
} key;
struct { /* L: info */
int base_length; /* basic note length */
} length;
struct meter_s { /* M: info */
short wmeasure; /* duration of a measure */
unsigned char nmeter; /* number of meter elements */
char expdur; /* explicit measure duration */
#define MAX_MEASURE 16
struct {
char top[8]; /* top value */
char bot[2]; /* bottom value */
} meter[MAX_MEASURE];
} meter;
struct { /* Q: info */
char *str1; /* string before */
short beats[4]; /* up to 4 beats */
short circa; /* "ca. " */
short tempo; /* number of beats per mn or */
short new_beat; /* old beat */
char *str2; /* string after */
} tempo;
struct { /* V: info */
char id[VOICE_ID_SZ]; /* voice ID */
char *fname; /* full name */
char *nname; /* nick name */
float scale; /* != 0 when change */
unsigned char voice; /* voice number */
signed char octave; /* 'octave=' - same as in K: */
char merge; /* merge with previous voice */
signed char stem; /* have stems up or down (2 = auto) */
signed char gstem; /* have grace stems up or down (2 = auto) */
signed char dyn; /* have dynamic marks above or below the staff */
signed char lyrics; /* have lyrics above or below the staff */
signed char gchord; /* have gchord above or below the staff */
signed char cue; /* cue voice (scale 0.7) */
char *stafflines;
float staffscale;
} voice;
struct { /* bar, mrest or mrep */
int type;
char repeat_bar;
char len; /* len if mrest or mrep */
char dotted;
struct decos dc; /* decorations */
} bar;
struct clef_s { /* clef */
char *name; /* PS drawing function */
signed char type;
#define TREBLE 0
#define ALTO 1
#define BASS 2
#define PERC 3
#define AUTOCLEF 4
char line;
signed char octave; /* '+8' / '-8' */
signed char transpose; /* if '^8' / '_8' */
char invis; /* clef 'none' */
char check_pitch; /* check if old abc2ps transposition */
} clef;
struct notes note; /* note, rest */
struct { /* user defined accent */
unsigned char symbol;
unsigned char value;
} user;
struct {
char type; /* 0: end of line
* 1: continuation ('\')
* 2: line break ('!') */
} eoln;
struct { /* voice overlay */
char type;
#define V_OVER_V 0 /* & */
#define V_OVER_S 1 /* (& */
#define V_OVER_E 2 /* &) */
unsigned char voice;
} v_over;
struct { /* tuplet */
char p_plet, q_plet, r_plet;
} tuplet;
} u;
};
/* parse definition */
struct parse {
struct SYMBOL *first_sym; /* first symbol */
struct SYMBOL *last_sym; /* last symbol */
int abc_vers; /* ABC version = (H << 16) + (M << 8) + L */
char *deco_tb[DC_NAME_SZ]; /* decoration names */
unsigned short micro_tb[MAXMICRO]; /* microtone values [ (n-1) | (d-1) ] */
int abc_state; /* parser state */
};
extern struct parse parse;
#define FONT_UMAX 10 /* max number of user fonts 0..9 */
enum e_fonts {
ANNOTATIONFONT = FONT_UMAX,
COMPOSERFONT,
FOOTERFONT,
GCHORDFONT,
HEADERFONT,
HISTORYFONT,
INFOFONT,
MEASUREFONT,
PARTSFONT,
REPEATFONT,
SUBTITLEFONT,
TEMPOFONT,
TEXTFONT,
TITLEFONT,
VOCALFONT,
VOICEFONT,
WORDSFONT,
FONT_DYN /* index of dynamic fonts (gch, an, ly) */
};
#define FONT_DYNX 12 /* number of dynamic fonts */
#define FONT_MAX (FONT_DYN + FONT_DYNX) /* whole number of fonts */
struct FORMAT { /* struct for page layout */
float pageheight, pagewidth;
float topmargin, botmargin, leftmargin, rightmargin;
float topspace, wordsspace, titlespace, subtitlespace, partsspace;
float composerspace, musicspace, vocalspace, textspace;
float breaklimit, maxshrink, lineskipfac, parskipfac, stemheight;
float gutter, indent, infospace, slurheight, notespacingfactor, scale;
float staffsep, sysstaffsep, maxstaffsep, maxsysstaffsep, stretchlast;
int abc2pscompat, alignbars, aligncomposer, autoclef;
int barsperstaff, breakoneoln, bstemdown, cancelkey, capo;
int combinevoices, contbarnb, continueall, custos;
int dblrepbar, decoerr, dynalign, flatbeams, infoline;
int gchordbox, graceslurs, graceword,gracespace, hyphencont;
int keywarn, landscape, linewarn;
int measurebox, measurefirst, measurenb, micronewps;
int oneperpage;
#ifdef HAVE_PANGO
int pango;
#endif
int partsbox, pdfmark;
int rbdbstop, rbmax, rbmin;
int setdefl, shiftunison, splittune, squarebreve;
int staffnonote, straightflags, stretchstaff;
int textoption, titlecaps, titleleft, titletrim;
int timewarn, transpose, tuplets;
char *bgcolor, *dateformat, *header, *footer, *titleformat;
char *musicfont;
struct FONTSPEC font_tb[FONT_MAX];
char ndfont; /* current index of dynamic fonts */
unsigned char gcf, anf, vof; /* fonts for guitar chords,
* annotations and lyrics */
unsigned int fields[2]; /* info fields to print
*[0] is 'A'..'Z', [1] is 'a'..'z' */
struct posit_s posit;
};
extern struct FORMAT cfmt; /* current format */
extern struct FORMAT dfmt; /* global format */
typedef struct SYMBOL *INFO[26]; /* information fields ('A' .. 'Z') */
extern INFO info;
extern char *outbuf; /* output buffer.. should hold one tune */
extern int outbufsz; /* size of outbuf */
extern char *mbf; /* where to PUTx() */
extern int use_buffer; /* 1 if lines are being accumulated */
extern int outft; /* last font in the output file */
extern int tunenum; /* number of current tune */
extern int pagenum; /* current page number */
extern int pagenum_nr; /* current page (non-resettable) */
extern int nbar; /* current measure number */
extern int in_page;
extern int defl; /* decoration flags */
#define DEF_NOST 0x01 /* long deco with no start */
#define DEF_NOEN 0x02 /* long deco with no end */
#define DEF_STEMUP 0x04 /* stem up (1) or down (0) */
/* switches modified by flags: */
extern int quiet; /* quiet mode */
extern int secure; /* secure mode */
extern int annotate; /* output source references */
extern int pagenumbers; /* write page numbers */
extern int epsf; /* 1: EPSF, 2: SVG, 3: embedded ABC */
extern int svg; /* 1: SVG, 2: XHTML */
extern int showerror; /* show the errors */
extern int pipeformat; /* format for bagpipes */
extern char outfn[FILENAME_MAX]; /* output file name */
extern char *in_fname; /* current input file name */
extern time_t mtime; /* last modification time of the input file */
extern int file_initialized; /* for output file */
extern FILE *fout; /* output file */
#define MAXTBLT 8
struct tblt_s {
char *head; /* PS head function */
char *note; /* PS note function */
char *bar; /* PS bar function */
float wh; /* width of head */
float ha; /* height above the staff */
float hu; /* height under the staff */
short pitch; /* pitch when no associated 'w:' / 0 */
char instr[2]; /* instrument pitch */
};
extern struct tblt_s *tblts[MAXTBLT];
#define MAXCMDTBLT 4 /* max number of -T in command line */
struct cmdtblt_s {
short index; /* tablature number */
short active; /* activate or not */
char *vn; /* voice name */
};
extern struct cmdtblt_s cmdtblts[MAXCMDTBLT];
extern int ncmdtblt;
extern int s_argc; /* command line arguments */
extern char **s_argv;
struct STAFF_S {
struct SYMBOL *s_clef; /* clef at start of music line */
char empty; /* no symbol on this staff */
char *stafflines;
float staffscale;
short botbar, topbar; /* bottom and top of bar */
float y; /* y position */
float top[YSTEP], bot[YSTEP]; /* top/bottom y offsets */
};
extern struct STAFF_S staff_tb[MAXSTAFF];
extern int nstaff; /* (0..MAXSTAFF-1) */
struct VOICE_S {
char id[VOICE_ID_SZ]; /* voice id */
/* generation */
struct VOICE_S *next; /* link */
struct SYMBOL *sym; /* associated symbols */
struct SYMBOL *last_sym; /* last symbol while scanning */
struct SYMBOL *lyric_start; /* start of lyrics while scanning */
char *nm; /* voice name */
char *snm; /* voice subname */
char *bar_text; /* bar text at start of staff when bar_start */
struct gch *bar_gch; /* bar text */
struct SYMBOL *tie; /* note with ties of previous line */
struct SYMBOL *rtie; /* note with ties before 1st repeat bar */
struct tblt_s *tblts[2]; /* tablatures */
float scale; /* scale */
int time; /* current time (parsing) */
struct SYMBOL *s_clef; /* clef at end of music line */
struct key_s key; /* current key signature */
struct meter_s meter; /* current time signature */
struct key_s ckey; /* key signature while parsing */
struct key_s okey; /* original key signature (parsing) */
unsigned hy_st; /* lyrics hyphens at start of line (bit array) */
unsigned ignore:1; /* ignore this voice (%%staves) */
unsigned second:1; /* secondary voice in a brace/parenthesis */
unsigned floating:1; /* floating voice in a brace system */
unsigned bar_repeat:1; /* bar at start of staff is a repeat bar */
unsigned norepbra:1; /* don't display the repeat brackets */
unsigned have_ly:1; /* some lyrics in this voice */
unsigned new_name:1; /* redisplay the voice name */
unsigned space:1; /* have a space before the next note (parsing) */
unsigned perc:1; /* percussion */
unsigned auto_len:1; /* auto L: (parsing) */
short wmeasure; /* measure duration (parsing) */
short transpose; /* transposition (parsing) */
short bar_start; /* bar type at start of staff / 0 */
struct posit_s posit; /* positions / directions */
signed char octave; /* octave (parsing) */
signed char ottava; /* !8va(! ... (parsing) */
signed char clone; /* duplicate from this voice number */
signed char over; /* overlay of this voice number */
unsigned char staff; /* staff (0..n-1) */
unsigned char cstaff; /* staff (parsing) */
unsigned char slur_st; /* slurs at start of staff */
signed char combine; /* voice combine */
int color;
char *stafflines;
float staffscale;
/* parsing */
struct SYMBOL *last_note; /* last note or rest */
char *map_name;
int ulen; /* unit note length */
unsigned char microscale; /* microtone scale */
unsigned char mvoice; /* main voice when voice overlay */
};
extern struct VOICE_S *curvoice; /* current voice while parsing */
extern struct VOICE_S voice_tb[MAXVOICE]; /* voice table */
extern struct VOICE_S *first_voice; /* first_voice */
extern struct SYMBOL *tsfirst; /* first symbol in the time linked list */
extern struct SYMBOL *tsnext; /* next line when cut */
extern float realwidth; /* real staff width while generating */
#define NFLAGS_SZ 10 /* size of note flags tables */
#define C_XFLAGS 5 /* index of crotchet in flags tables */
extern float space_tb[NFLAGS_SZ]; /* note spacing */
extern float hw_tb[]; // width of note heads
struct SYSTEM { /* staff system */
struct SYSTEM *next;
short top_voice; /* first voice in the staff system */
short nstaff;
struct {
short flags;
#define OPEN_BRACE 0x01
#define CLOSE_BRACE 0x02
#define OPEN_BRACKET 0x04
#define CLOSE_BRACKET 0x08
#define OPEN_PARENTH 0x10
#define CLOSE_PARENTH 0x20
#define STOP_BAR 0x40
#define FL_VOICE 0x80
#define OPEN_BRACE2 0x0100
#define CLOSE_BRACE2 0x0200
#define OPEN_BRACKET2 0x0400
#define CLOSE_BRACKET2 0x0800
#define MASTER_VOICE 0x1000
char empty;
char *stafflines;
float staffscale;
// struct clef_s clef;
float sep, maxsep;
} staff[MAXSTAFF];
struct {
signed char range;
unsigned char staff;
char second;
char dum;
float sep, maxsep;
// struct clef_s clef;
} voice[MAXVOICE];
};
extern struct SYSTEM *cursys; /* current staff system */
/* -- external routines -- */
/* abcm2ps.c */
void include_file(unsigned char *fn);
void clrarena(int level);
int lvlarena(int level);
void *getarena(int len);
void strext(char *fid, char *ext);
/* abcparse.c */
void abc_parse(char *p, char *fname, int linenum);
void abc_eof(void);
char *get_str(char *d,
char *s,
int maxlen);
char *parse_acc_pit(char *p,
int *pit,
int *acc);
/* buffer.c */
void a2b(char *fmt, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
;
void block_put(void);
void buffer_eob(int eot);
void marg_init(void);
void bskip(float h);
void check_buffer(void);
void init_outbuf(int kbsz);
void close_output_file(void);
void close_page(void);
float get_bposy(void);
void open_fout(void);
void write_buffer(void);
extern int (*output)(FILE *out, const char *fmt, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 2, 3)))
#endif
;
void write_eps(void);
/* deco.c */
void deco_add(char *text);
void deco_cnv(struct decos *dc, struct SYMBOL *s, struct SYMBOL *prev);
void deco_update(struct SYMBOL *s, float dx);
float deco_width(struct SYMBOL *s);
void draw_all_deco(void);
//int draw_deco_head(int deco, float x, float y, int stem);
void draw_deco_near(void);
void draw_deco_note(void);
void draw_deco_staff(void);
float draw_partempo(int staff, float top);
void draw_measnb(void);
void init_deco(void);
void reset_deco(void);
void set_defl(int new_defl);
float tempo_width(struct SYMBOL *s);
void write_tempo(struct SYMBOL *s,
int beat,
float sc);
float y_get(int staff,
int up,
float x,
float w);
void y_set(int staff,
int up,
float x,
float w,
float y);
/* draw.c */
void draw_sym_near(void);
void draw_all_symb(void);
float draw_systems(float indent);
void output_ps(struct SYMBOL *s, int color);
struct SYMBOL *prev_scut(struct SYMBOL *s);
void putf(float f);
void putx(float x);
void puty(float y);
void putxy(float x, float y);
void set_scale(struct SYMBOL *s);
void set_sscale(int staff);
void set_color(int color);
/* format.c */
void define_fonts(void);
int get_textopt(char *p);
int get_font_encoding(int ft);
int get_bool(char *p);
void interpret_fmt_line(char *w, char *p, int lock);
void lock_fmt(void *fmt);
void make_font_list(void);
FILE *open_file(char *fn,
char *ext,
char *rfn);
void print_format(void);
void set_font(int ft);
void set_format(void);
void set_voice_param(struct VOICE_S *p_voice, int state, char *w, char *p);
struct tblt_s *tblt_parse(char *p);
/* front.c */
#define FE_ABC 0
#define FE_FMT 1
#define FE_PS 2
void frontend(unsigned char *s,
int ftype,
char *fname,
int linenum);
/* glyph.c */
char *glyph_out(char *p);
void glyph_add(char *p);
/* music.c */
void output_music(void);
void reset_gen(void);
void unlksym(struct SYMBOL *s);
/* parse.c */
extern float multicol_start;
void do_tune(void);
void identify_note(struct SYMBOL *s,
int len,
int *p_head,
int *p_dots,
int *p_flags);
void sort_pitch(struct SYMBOL *s);
struct SYMBOL *sym_add(struct VOICE_S *p_voice,
int type);
/* subs.c */
void bug(char *msg, int fatal);
void error(int sev, struct SYMBOL *s, char *fmt, ...);
float scan_u(char *str, int type);
float cwid(unsigned char c);
void get_str_font(int *cft, int *dft);
void set_str_font(int cft, int dft);
#ifdef HAVE_PANGO
void pg_init(void);
void pg_reset_font(void);
#endif
void put_history(void);
void put_words(struct SYMBOL *words);
void str_font(int ft);
#define A_LEFT 0
#define A_CENTER 1
#define A_RIGHT 2
#define A_LYRIC 3
#define A_GCHORD 4
#define A_ANNOT 5
#define A_GCHEXP 6
void str_out(char *p, int action);
void put_str(char *str, int action);
float tex_str(char *s);
extern char tex_buf[]; /* result of tex_str() */
#define TEX_BUF_SZ 512
char *trim_title(char *p, struct SYMBOL *title);
void user_ps_add(char *s, char use);
void user_ps_write(void);
void write_title(struct SYMBOL *s);
void write_heading(void);
void write_user_ps(void);
void write_text(char *cmd, char *s, int job);
/* svg.c */
void define_svg_symbols(char *title, int num, float w, float h);
void svg_def_id(char *id, int idsz);
void svg_font_switch(void);
int svg_output(FILE *out, const char *fmt, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 2, 3)))
#endif
;
void svg_write(char *buf, int len);
void svg_close();
/* syms.c */
void define_font(char *name, int num, int enc);
void define_symbols(void);