Cue commands are indented.
[ahxm.git] / compiler.y
blobf37134d9780b08941e064f651a212621cebb12a3
1 %{
2 /*
4 Ann Hell Ex Machina - Music Software
5 Copyright (C) 2003/2006 Angel Ortega <angel@triptico.com>
7 compiler.y - Scripting language YACC parser
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 http://www.triptico.com
27 #include "config.h"
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdlib.h>
32 #include <math.h>
34 #include "annhell.h"
36 /*******************
37 Data
38 ********************/
40 int yylex(void);
41 void yyerror(char * s);
43 /* injecting code functions (defined in compiler.l) */
44 int push_code(char * code, int times, int dyn);
45 int push_code_from_file(char * file);
47 /* current track */
48 int track;
50 /* current time */
51 double cur_time;
53 /* note globals */
54 static double length;
55 static int octave;
56 static int transpose;
57 static double staccato;
58 static float volume;
59 static double gliss;
61 /* parser debugging */
63 #define DEBUGF if(verbose >= 2)printf
65 /* named blocks */
67 struct named_block
69 char name[64];
70 char * block;
73 static struct named_block * named_blocks = NULL;
74 static int n_named_blocks = 0;
75 static int named_blocks_size = 0;
77 /* group info */
78 struct group
80 double start;
81 double gliss;
82 double max;
85 static struct group * groups = NULL;
86 static int n_groups = 0;
87 static int groups_size = 0;
89 /* mark info */
90 struct mark
92 char name[64];
93 double time;
96 static struct mark * marks = NULL;
97 static int n_marks = 0;
98 static int marks_size = 0;
100 /* arpeggiator */
101 struct arp
103 double delay;
104 int transpose;
105 float volume;
106 int track;
109 static struct arp * arps = NULL;
110 static int n_arps = 0;
111 static int arps_size = 0;
113 static double arp_delay;
114 static int arp_transpose;
115 static float arp_volume;
116 static int arp_track;
118 int compiler_error = 0;
120 extern int yyline;
122 /*******************
123 Code
124 ********************/
126 void c_err(char * e1, char * e2, char * e3)
127 /* reports an error from the compiler */
129 printf("ahxm:");
130 if(e1 != NULL) printf(" %s", e1);
131 if(e2 != NULL) printf(" %s", e2);
132 if(e3 != NULL) printf(" %s", e3);
133 printf(" in line %d\n", yyline);
135 compiler_error++;
139 static void forward(double step)
140 /* moves forward current time */
142 /* add step */
143 cur_time += step;
145 /* quantizations could be done here */
149 /* named blocks */
151 static int set_named_block(char * name, char * block)
152 /* sets a named block */
154 int n;
156 /* find first if block is previously defined */
157 for(n = 0;n < n_named_blocks;n++)
159 if(strcmp(name, named_blocks[n].name) == 0)
161 free(named_blocks[n].block);
162 break;
166 if(n == n_named_blocks)
168 /* need to expand? */
169 if(n_named_blocks == named_blocks_size)
171 named_blocks_size += 4;
173 named_blocks = (struct named_block *)
174 realloc(named_blocks,
175 named_blocks_size *
176 sizeof(struct named_block));
179 n_named_blocks++;
182 strncpy(named_blocks[n].name, name, sizeof(named_blocks[n].name));
183 named_blocks[n].block = block;
185 return(1);
189 static void insert_named_block(char * name)
190 /* inserts a named block */
192 int n;
194 for(n = 0;n < n_named_blocks;n++)
196 if(strcmp(name, named_blocks[n].name) == 0)
198 push_code(named_blocks[n].block, 1, 0);
199 return;
203 c_err("block-not-found", name, NULL);
207 static int insert_file(char * filename)
209 if(!push_code_from_file(filename))
211 c_err("script-not-found", filename, NULL);
212 return(1);
215 return(0);
219 /* groups */
221 static int push_group(void)
222 /* starts a new group of notes */
224 if(n_groups == groups_size)
226 groups_size += 4;
228 groups = (struct group *) realloc(groups,
229 groups_size * sizeof(struct group));
232 groups[n_groups].start = cur_time;
233 groups[n_groups].gliss = 0.0;
234 groups[n_groups].max = 0.0;
236 n_groups++;
238 return(1);
242 static int next_group_part(void)
243 /* part delimiter */
245 if(n_groups == 0)
247 c_err("missing-start-of-group", NULL, NULL);
248 return(0);
251 /* store maximum frame */
252 if(groups[n_groups - 1].max < cur_time)
253 groups[n_groups - 1].max = cur_time;
255 /* add glissando delay */
256 groups[n_groups - 1].gliss += gliss;
258 /* rewind */
259 cur_time = groups[n_groups - 1].start + groups[n_groups - 1].gliss;
261 return(1);
265 static int pop_group(void)
266 /* finishes a group, moving the frame to the end of the longer part */
268 if(n_groups == 0)
270 c_err("missing-start-of-group", NULL, NULL);
271 return(0);
274 n_groups--;
276 /* if other parts of group were longer than the last one,
277 move pointer there */
278 if(groups[n_groups].max > cur_time)
279 cur_time = groups[n_groups].max;
281 return(1);
285 /* marks */
287 static void add_mark(char * name)
288 /* creates a new mark */
290 if(n_marks == marks_size)
292 marks_size += 4;
294 marks = (struct mark *) realloc(marks,
295 marks_size * sizeof(struct mark));
298 strncpy(marks[n_marks].name, name, sizeof(marks[n_marks].name));
299 marks[n_marks].time = cur_time;
301 n_marks++;
305 static void find_mark(char * name, int set)
306 /* finds a mark by name, optionally moving time cursor there */
308 int n;
310 for(n = 0;n < n_marks;n++)
312 if(strcmp(marks[n].name, name) == 0)
314 if(set)
316 if(cur_time > marks[n].time)
317 c_err("mark-overpassed", name, NULL);
318 else
319 cur_time = marks[n].time;
321 else
322 if(cur_time != marks[n].time)
323 c_err("mark-mismatch", name, NULL);
325 return;
329 c_err("mark-not-found", name, NULL);
333 /* arpeggiator */
335 static void arp_default(void)
336 /* resets arpeggiator values to the default ones */
338 arp_delay = 0.0;
339 arp_transpose = 0;
340 arp_volume = 1.0;
341 arp_track = track;
345 static void add_arp(void)
346 /* adds an arpeggiator note */
348 /* if the note is exactly the same, do nothing */
349 if(arp_delay == 0.0 && arp_transpose == 0 &&
350 arp_volume == 1.0 && arp_track == track)
351 return;
353 if(n_arps == arps_size)
355 arps_size += 4;
357 arps = (struct arp *) realloc(arps,
358 arps_size * sizeof(struct arp));
361 arps[n_arps].delay = arp_delay;
362 arps[n_arps].transpose = arp_transpose;
363 arps[n_arps].volume = arp_volume;
364 arps[n_arps].track = arp_track;
366 n_arps++;
367 arp_default();
371 /* song events */
373 static void add_note_event(int note)
374 /* adds a note event */
376 int n;
377 int np;
378 union song_ev e;
380 /* calculate the note */
381 np = note + transpose + (octave * 12);
383 /* is note out of range? */
384 if(np < 0 || np > 127)
386 c_err("note-out-of-range", NULL, NULL);
387 return;
390 e.note.type = SONG_EV_NOTE;
391 e.note.time = cur_time;
392 e.note.trk_id = track;
393 e.note.note = np;
394 e.note.len = length * staccato;
395 e.note.vol = volume;
397 add_song_ev(&e);
399 /* add arpeggiator repetitions */
400 for(n = 0;n < n_arps;n++)
402 e.note.time = cur_time + arps[n].delay;
403 e.note.trk_id = arps[n].track;
404 e.note.note = np + arps[n].transpose;
405 e.note.vol = volume * arps[n].volume;
407 add_song_ev(&e);
412 static void add_back_event(void)
414 union song_ev e;
416 e.back.type = SONG_EV_BACK;
417 e.back.time = cur_time;
418 e.back.trk_id = track;
419 e.back.len = length;
420 add_song_ev(&e);
424 static void add_tempo_event(int trk_id, double tempo)
426 union song_ev e;
428 e.tempo.type = SONG_EV_TEMPO;
429 e.tempo.time = cur_time;
430 e.tempo.trk_id = trk_id;
431 e.tempo.tempo = tempo;
432 add_song_ev(&e);
436 static void add_meter_event(int trk_id, int num, int den)
438 union song_ev e;
440 e.meter.type = SONG_EV_METER;
441 e.meter.time = cur_time;
442 e.meter.trk_id = trk_id;
443 e.meter.num = num;
444 e.meter.den = den;
445 add_song_ev(&e);
448 static void add_measure_event(void)
450 union song_ev e;
452 e.measure.type = SONG_EV_MEASURE;
453 e.measure.time = cur_time;
454 e.measure.trk_id = -1;
455 e.measure.line = yyline;
457 add_song_ev(&e);
461 static void add_ss_sustain_event(double sustain)
463 union song_ev e;
465 e.ss_sustain.type = SONG_EV_SS_SUSTAIN;
466 e.ss_sustain.time = cur_time;
467 e.ss_sustain.trk_id = track;
468 e.ss_sustain.sustain = sustain;
470 add_song_ev(&e);
474 static void add_ss_vibrato_event(double depth, double freq)
476 union song_ev e;
478 e.ss_vibrato.type = SONG_EV_SS_VIBRATO;
479 e.ss_vibrato.time = cur_time;
480 e.ss_vibrato.trk_id = track;
481 e.ss_vibrato.vib_depth = depth;
482 e.ss_vibrato.vib_freq = freq;
484 add_song_ev(&e);
488 static void add_ss_channel_event(int channel, float vol)
490 union song_ev e;
492 e.ss_channel.type = SONG_EV_SS_CHANNEL;
493 e.ss_channel.time = cur_time;
494 e.ss_channel.trk_id = track;
495 e.ss_channel.channel = channel;
496 e.ss_channel.vol = vol;
498 add_song_ev(&e);
502 static void add_ss_wav_event(char * wav_file, int base, int min, int max,
503 double loop_start, double loop_end)
505 union song_ev e;
507 e.ss_wav.type = SONG_EV_SS_WAV;
508 e.ss_wav.time = cur_time;
509 e.ss_wav.trk_id = track;
510 e.ss_wav.file = wav_file;
511 e.ss_wav.base = base;
512 e.ss_wav.min = min;
513 e.ss_wav.max = max;
514 e.ss_wav.loop_start = loop_start;
515 e.ss_wav.loop_end = loop_end;
517 add_song_ev(&e);
521 static void add_ss_pat_event(char * pat_file)
523 union song_ev e;
525 e.ss_pat.type = SONG_EV_SS_PAT;
526 e.ss_pat.time = cur_time;
527 e.ss_pat.trk_id = track;
528 e.ss_pat.file = pat_file;
530 add_song_ev(&e);
534 static void add_ss_eff_event(int type, int channel, double size, float gain,
535 double depth, double freq, double phase, float initial, float final)
537 union song_ev e;
539 e.ss_eff.type = type;
540 e.ss_eff.time = cur_time;
541 e.ss_eff.trk_id = track;
542 e.ss_eff.channel = channel;
543 e.ss_eff.size = size;
544 e.ss_eff.gain = gain;
545 e.ss_eff.depth = depth;
546 e.ss_eff.freq = freq;
547 e.ss_eff.phase = phase;
548 e.ss_eff.initial = initial;
549 e.ss_eff.final = final;
551 add_song_ev(&e);
555 static void add_ss_pitch_stretch(int note, double len, float vol)
557 union song_ev e;
559 e.ss_pitch_stretch.type = SONG_EV_SS_PITCH_STRETCH;
560 e.ss_pitch_stretch.time = cur_time;
561 e.ss_pitch_stretch.trk_id = track;
562 e.ss_pitch_stretch.note = note;
563 e.ss_pitch_stretch.len = len;
564 e.ss_pitch_stretch.vol = vol;
566 add_song_ev(&e);
570 static void add_ss_print_wave_tempo(int note, double len)
572 union song_ev e;
574 e.ss_print_wave_tempo.type = SONG_EV_SS_PRINT_WAVE_TEMPO;
575 e.ss_print_wave_tempo.time = cur_time;
576 e.ss_print_wave_tempo.trk_id = track;
577 e.ss_print_wave_tempo.note = note;
578 e.ss_print_wave_tempo.len = len;
580 add_song_ev(&e);
584 static void add_midi_channel_event(int channel)
586 union song_ev e;
588 /* 1st channel is 0 */
589 channel--;
591 e.midi_channel.type = SONG_EV_MIDI_CHANNEL;
592 e.midi_channel.time = cur_time;
593 e.midi_channel.trk_id = track;
594 e.midi_channel.channel = channel;
596 add_song_ev(&e);
600 static void add_midi_program_event(int program)
602 union song_ev e;
604 e.midi_program.type = SONG_EV_MIDI_PROGRAM;
605 e.midi_program.time = cur_time;
606 e.midi_program.trk_id = track;
607 e.midi_program.program = program;
609 add_song_ev(&e);
613 static void add_track_info_event(char * author, char * name)
615 union song_ev e;
617 e.track_info.type = SONG_EV_TRACK_INFO;
618 e.track_info.time = cur_time;
619 e.track_info.trk_id = track;
620 e.track_info.author = author;
621 e.track_info.name = name;
623 add_song_ev(&e);
627 static void init_track(void)
628 /* sets the default values for a new track */
630 cur_time = 0.0;
631 length = 0.0;
632 transpose = 0;
633 staccato = 0.8;
634 volume = 0.75;
635 octave = 5;
636 gliss = 0;
638 /* groups should not cross track boundaries */
639 n_groups = 0;
641 /* reset arpeggiator */
642 n_arps = 0;
643 arp_default();
649 %union {
650 int i;
651 double d;
652 char * p;
655 %token <i> P_INTEGER S_INTEGER
656 %token <d> P_REAL S_REAL
657 %token <i> NOTE_P NOTE_T3 NOTE_T5
658 %token <p> NEW_MARK GOTO_MARK ASSERT_MARK
660 %token <p> BLOCK BLK_ASSIGN BLK_INSERT FILE_INSERT
662 %token <p> XC_STR
663 %token <i> XC_ABSNOTE
664 %token <d> XC_MSECS
666 %token SS_SEP SS_WAV SS_LOOP_WAV SS_PAT SS_SUSTAIN SS_VIBRATO SS_CHANNEL SS_VOL
668 %token SS_EFF_DELAY SS_EFF_ECHO SS_EFF_COMB SS_EFF_ALLPASS SS_EFF_FLANGER
669 %token SS_EFF_WOBBLE SS_EFF_SQWOBBLE SS_EFF_FADER SS_EFF_REVERB SS_EFF_OFF
671 %token SS_PITCH_STRETCH SS_TIME_STRETCH SS_PRINT_WAVE_TEMPO
673 %token TRACK_INFO
675 %token MIDI_CHANNEL MIDI_PROGRAM MIDI_GENERIC
677 %type <i> integer note note_pitch rest back
678 %type <d> real p_number number note_length
680 %type <d> arp_list arp_note
681 %type <i> xc_absnote
685 script:
686 script stmt { ; }
687 | /* NULL */
690 stmt:
691 note {
692 /* note event */
693 add_note_event($1);
694 forward(length);
696 | rest {
697 /* rest */
698 forward(length);
700 | back {
701 /* back */
702 add_back_event();
704 | 'z' note_length {
705 /* zero note */
706 length = $2;
708 | 'o' P_INTEGER {
709 /* absolute octave */
710 octave = $2;
712 | 'o' S_INTEGER {
713 /* relative octave */
714 octave += $2;
716 | 'v' P_INTEGER {
717 /* absolute volume */
718 volume = (float)$2;
720 | 'v' P_REAL {
721 /* absolute volume */
722 volume = (float)$2;
724 | 'v' S_REAL {
725 /* relative volume */
726 volume += (float)$2;
728 | 't' integer {
729 /* transpose */
730 transpose = $2;
732 | 's' p_number {
733 /* staccato */
734 staccato = $2;
737 | '<' {
738 /* start of group */
739 push_group();
741 | ';' {
742 /* group delimiter */
743 next_group_part();
745 | '>' {
746 /* end of group */
747 pop_group();
749 | 'l' note_length {
750 /* glissando */
751 gliss = $2;
754 | '|' {
755 /* measure mark event */
756 add_measure_event();
759 | NEW_MARK {
760 /* add new mark */
761 add_mark($1);
763 | GOTO_MARK {
764 /* go to mark */
765 find_mark($1, 1);
767 | ASSERT_MARK {
768 /* assert mark */
769 find_mark($1, 0);
772 | '\\' {
773 /* new track */
775 track++;
776 init_track();
778 | 'T' p_number {
779 /* tempo setting */
780 add_tempo_event(-1, $2);
782 | 'M' P_INTEGER '/' P_INTEGER {
783 /* meter (time signature) setting */
784 add_meter_event(-1, $2, $4);
787 | BLOCK '*' P_INTEGER {
788 /* repeat block */
789 push_code($1, $3, 1);
791 | BLOCK BLK_ASSIGN {
792 /* assign block */
793 set_named_block($2, $1);
795 | BLK_INSERT {
796 /* insert named block */
797 insert_named_block($1);
799 | FILE_INSERT {
800 /* insert file */
801 insert_file($1);
804 | arp { ; }
806 | xc_cmd { ; }
810 integer:
811 P_INTEGER { $$ = $1; }
812 | S_INTEGER { $$ = $1; }
815 real:
816 P_REAL { $$ = $1; }
817 | S_REAL { $$ = $1; }
820 p_number:
821 P_INTEGER { $$ = (double) $1; }
822 | P_REAL { $$ = $1; }
825 number:
826 integer { $$ = (double) $1; }
827 | real { $$ = $1; }
830 note:
831 note_pitch { $$ = $1; }
832 | note note_length { $$ = $1; length=$2; }
833 | note '~' number { $$ = $1; DEBUGF("imm volume: %lf\n", $3); }
836 note_pitch:
837 NOTE_P { $$ = $1; }
838 | note_pitch '&' { $$ = $1 - 1; }
839 | note_pitch '#' { $$ = $1 + 1; }
840 | note_pitch '\'' { $$ = $1 + 12; }
841 | note_pitch ',' { $$ = $1 - 12; }
844 note_length:
845 P_INTEGER { $$ = 1 / (double) $1; }
846 | note_length NOTE_T3 { $$ = $1 * 2.0 / 3.0; }
847 | note_length NOTE_T5 { $$ = $1 * 4.0 / 5.0; }
848 | note_length '*' p_number { $$ = $1 * $3; }
849 | note_length '.' { $$ = $1 * 1.5; }
852 rest:
853 'r' { ; }
854 | rest note_length {
855 /* rest with length */
856 length = $2;
860 back:
861 'k' { ; }
862 | back note_length {
863 /* back with length */
864 length = $2;
868 arp:
869 'x' {
870 /* empty arpeggiator */
871 n_arps = 0;
872 arp_default();
874 | 'x' arp_list { ; }
877 arp_list:
878 arp_note {
879 /* first arpeggiator note */
880 n_arps = 0;
881 add_arp();
883 | arp_list ',' arp_note {
884 /* rest of arpeggiator notes */
885 add_arp();
889 arp_note:
890 note_length {
891 /* arpeggiator delay */
892 arp_delay = $1;
894 | arp_note '~' number {
895 /* arpeggiator volume */
896 arp_volume = (float)$3;
898 | arp_note S_INTEGER {
899 /* arpeggiator transpose */
900 arp_transpose = $2;
902 | arp_note '@' P_INTEGER {
903 /* arpeggiator track */
904 arp_track = $3;
908 xc_absnote:
909 P_INTEGER { $$ = $1; }
910 | XC_ABSNOTE { $$ = $1; }
913 xc_cmd:
914 SS_WAV XC_STR xc_absnote {
915 /* load .wav file with just one note */
916 add_ss_wav_event($2, $3, $3, $3, -1.0, -1.0);
918 | SS_WAV XC_STR xc_absnote xc_absnote xc_absnote {
919 /* load .wav file */
920 add_ss_wav_event($2, $3, $4, $5, -1.0, -1.0);
922 | SS_WAV XC_STR xc_absnote xc_absnote xc_absnote number number {
923 /* load .wav file, with loop boundaries */
924 add_ss_wav_event($2, $3, $4, $5, $6, $7);
926 | SS_PAT XC_STR {
927 /* load .pat file */
928 add_ss_pat_event($2);
930 | SS_SUSTAIN XC_MSECS {
931 /* sets sustain */
932 add_ss_sustain_event($2);
934 | SS_VIBRATO XC_MSECS number {
935 /* sets vibrato */
936 add_ss_vibrato_event($2, $3);
938 | SS_CHANNEL integer number {
939 /* sets volume for a channel */
940 add_ss_channel_event($2, $3);
942 | SS_VOL number number {
943 /* set vol for 2 channels */
944 add_ss_channel_event(0, $2);
945 add_ss_channel_event(1, $3);
947 | SS_VOL number number number {
948 /* set vol for 3 channels */
949 add_ss_channel_event(0, $2);
950 add_ss_channel_event(1, $3);
951 add_ss_channel_event(2, $4);
953 | SS_VOL number number number number {
954 /* set vol for 4 channels */
955 add_ss_channel_event(0, $2);
956 add_ss_channel_event(1, $3);
957 add_ss_channel_event(2, $4);
958 add_ss_channel_event(3, $5);
960 | SS_VOL number number number number number number {
961 /* set vol for 6 channels */
962 add_ss_channel_event(0, $2);
963 add_ss_channel_event(1, $3);
964 add_ss_channel_event(2, $4);
965 add_ss_channel_event(3, $5);
966 add_ss_channel_event(4, $6);
967 add_ss_channel_event(5, $7);
969 | SS_EFF_DELAY integer XC_MSECS {
970 /* delay effect */
971 add_ss_eff_event(SONG_EV_SS_EFF_DELAY,
972 $2, $3, 0, 0, 0, 0, 0, 0);
975 | SS_EFF_ECHO integer XC_MSECS number {
976 /* echo effect */
977 add_ss_eff_event(SONG_EV_SS_EFF_ECHO,
978 $2, $3, $4, 0, 0, 0, 0, 0);
981 | SS_EFF_COMB integer XC_MSECS number {
982 /* comb effect */
983 add_ss_eff_event(SONG_EV_SS_EFF_COMB,
984 $2, $3, $4, 0, 0, 0, 0, 0);
987 | SS_EFF_ALLPASS integer XC_MSECS number {
988 /* allpass effect */
989 add_ss_eff_event(SONG_EV_SS_EFF_ALLPASS,
990 $2, $3, $4, 0, 0, 0, 0, 0);
993 | SS_EFF_FLANGER integer XC_MSECS number XC_MSECS number number {
994 /* flanger effect */
995 add_ss_eff_event(SONG_EV_SS_EFF_FLANGER,
996 $2, $3, $4, $5, $6, $7, 0, 0);
999 | SS_EFF_WOBBLE integer number number {
1000 /* wobble effect */
1001 add_ss_eff_event(SONG_EV_SS_EFF_WOBBLE,
1002 $2, 0, 0, 0, $3, $4, 0, 0);
1005 | SS_EFF_SQWOBBLE integer number number {
1006 /* square wobble effect */
1007 add_ss_eff_event(SONG_EV_SS_EFF_SQWOBBLE,
1008 $2, 0, 0, 0, $3, $4, 0, 0);
1011 | SS_EFF_FADER integer XC_MSECS number number {
1012 /* fader effect */
1013 add_ss_eff_event(SONG_EV_SS_EFF_FADER,
1014 $2, $3, 0, 0, 0, 0, $4, $5);
1017 | SS_EFF_REVERB integer {
1018 /* reverb effect */
1019 add_ss_eff_event(SONG_EV_SS_EFF_REVERB,
1020 $2, 0, 0, 0, 0, 0, 0, 0);
1023 | SS_EFF_OFF integer {
1024 /* off effect */
1025 add_ss_eff_event(SONG_EV_SS_EFF_OFF,
1026 $2, 0, 0, 0, 0, 0, 0, 0);
1029 | SS_PITCH_STRETCH xc_absnote number number {
1030 /* pitch stretch note */
1031 add_ss_pitch_stretch($2, $3, $4);
1033 forward($3);
1036 | SS_PRINT_WAVE_TEMPO xc_absnote number {
1037 /* print tempo from wave */
1038 add_ss_print_wave_tempo($2, $3);
1041 | TRACK_INFO XC_STR XC_STR {
1042 /* add track info */
1043 add_track_info_event($2, $3);
1046 | MIDI_CHANNEL integer {
1047 /* midi channel */
1048 add_midi_channel_event($2);
1051 | MIDI_PROGRAM integer {
1052 /* midi program */
1053 add_midi_program_event($2);
1059 void yyerror(char * s)
1061 c_err(s, NULL, NULL);
1065 static void compile_startup(void)
1067 track = 0;
1068 yyline = 1;
1069 compiler_error = 0;
1071 /* default settings */
1072 add_tempo_event(-2, 120.0);
1073 add_meter_event(-2, 4, 4);
1074 init_track();
1078 int compile_ahs_string(char * code)
1080 compile_startup();
1082 push_code(code, 1, 0);
1084 return(yyparse() + compiler_error);
1088 int compile_ahs(char * file)
1090 compile_startup();
1092 if(insert_file(file))
1093 return(1);
1095 return(yyparse() + compiler_error);