4 Ann Hell Ex Machina - Music Software
5 Copyright (C) 2003/2005 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
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
);
57 static double staccato
;
61 /* parser debugging */
63 #define DEBUGF if(ss_debug)printf
73 static struct named_block
* named_blocks
=NULL
;
74 static int n_named_blocks
=0;
75 static int named_blocks_size
=0;
85 static struct group
* groups
=NULL
;
86 static int n_groups
=0;
87 static int groups_size
=0;
96 static struct mark
* marks
=NULL
;
98 static int marks_size
=0;
109 static struct arp
* arps
=NULL
;
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;
124 ********************/
126 void c_err
(char * e1
, char * e2
, char * e3
)
127 /* reports an error from the compiler */
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
);
139 static void forward
(double step
)
140 /* moves forward current time */
145 /* quantizations could be done here */
151 static int set_named_block
(char * name
, char * block
)
152 /* sets a named block */
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
);
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
,
176 sizeof
(struct named_block
));
182 strncpy
(named_blocks
[n
].name
, name
, sizeof
(named_blocks
[n
].name
));
183 named_blocks
[n
].block
=block
;
189 static void insert_named_block
(char * name
)
190 /* inserts a named block */
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);
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
);
221 static int push_group
(void)
222 /* starts a new group of notes */
224 if
(n_groups
== groups_size
)
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;
242 static int next_group_part
(void)
247 c_err
("missing-start-of-group", NULL
, NULL
);
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
;
259 cur_time
=groups
[n_groups
- 1].start
+ groups
[n_groups
- 1].gliss
;
265 static int pop_group
(void)
266 /* finishes a group, moving the frame to the end of the longer part */
270 c_err
("missing-start-of-group", NULL
, NULL
);
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
;
287 static void add_mark
(char * name
)
288 /* creates a new mark */
290 if
(n_marks
== marks_size
)
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
;
305 static void find_mark
(char * name
, int set
)
306 /* finds a mark by name, optionally moving time cursor there */
310 for
(n
=0;n
< n_marks
;n
++)
312 if
(strcmp
(marks
[n
].name
, name
) == 0)
316 if
(cur_time
> marks
[n
].time
)
317 c_err
("mark-overpassed", name
, NULL
);
319 cur_time
=marks
[n
].time
;
322 if
(cur_time
!= marks
[n
].time
)
323 c_err
("mark-mismatch", name
, NULL
);
329 c_err
("mark-not-found", name
, NULL
);
335 static void arp_default
(void)
336 /* resets arpeggiator values to the default ones */
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
)
353 if
(n_arps
== arps_size
)
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
;
373 static void add_note_event
(int note
)
374 /* adds a note event */
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
);
390 e.note.type
=SONG_EV_NOTE
;
391 e.note.time
=cur_time
;
394 e.note.len
=length
* staccato
;
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
;
412 static void add_tempo_event
(int trk_id
, double tempo
)
416 e.tempo.type
=SONG_EV_TEMPO
;
417 e.tempo.time
=cur_time
;
418 e.tempo.trk_id
=trk_id
;
424 static void add_meter_event
(int trk_id
, int num
, int den
)
428 e.meter.type
=SONG_EV_METER
;
429 e.meter.time
=cur_time
;
430 e.meter.trk_id
=trk_id
;
436 static void add_measure_event
(void)
440 e.measure.type
=SONG_EV_MEASURE
;
441 e.measure.time
=cur_time
;
443 e.measure.line
=yyline
;
449 static void add_ss_sustain_event
(double sustain
)
453 e.ss_sustain.type
=SONG_EV_SS_SUSTAIN
;
454 e.ss_sustain.time
=cur_time
;
455 e.ss_sustain.trk_id
=track
;
456 e.ss_sustain.sustain
=sustain
;
462 static void add_ss_vibrato_event
(double depth
, double freq
)
466 e.ss_vibrato.type
=SONG_EV_SS_VIBRATO
;
467 e.ss_vibrato.time
=cur_time
;
468 e.ss_vibrato.trk_id
=track
;
469 e.ss_vibrato.vib_depth
=depth
;
470 e.ss_vibrato.vib_freq
=freq
;
476 static void add_ss_channel_event
(int channel
, float vol
)
480 e.ss_channel.type
=SONG_EV_SS_CHANNEL
;
481 e.ss_channel.time
=cur_time
;
482 e.ss_channel.trk_id
=track
;
483 e.ss_channel.channel
=channel
;
484 e.ss_channel.vol
=vol
;
490 static void add_ss_wav_event
(char * wav_file
, int base
, int min
, int max
,
491 double loop_start
, double loop_end
)
495 e.ss_wav.type
=SONG_EV_SS_WAV
;
496 e.ss_wav.time
=cur_time
;
497 e.ss_wav.trk_id
=track
;
498 e.ss_wav.file
=wav_file
;
502 e.ss_wav.loop_start
=loop_start
;
503 e.ss_wav.loop_end
=loop_end
;
508 static void add_ss_pat_event
(char * pat_file
)
512 e.ss_pat.type
=SONG_EV_SS_PAT
;
513 e.ss_pat.time
=cur_time
;
514 e.ss_pat.trk_id
=track
;
515 e.ss_pat.file
=pat_file
;
521 static void add_ss_eff_event
(int type
, int channel
, double size
, float gain
,
522 double depth
, double freq
, double phase
, float initial
, float final
)
527 e.ss_eff.time
=cur_time
;
528 e.ss_eff.trk_id
=track
;
529 e.ss_eff.channel
=channel
;
532 e.ss_eff.depth
=depth
;
534 e.ss_eff.phase
=phase
;
535 e.ss_eff.initial
=initial
;
536 e.ss_eff.final
=final
;
542 static void add_ss_pitch_stretch
(int note
, double len
, float vol
)
546 e.ss_pitch_stretch.type
=SONG_EV_SS_PITCH_STRETCH
;
547 e.ss_pitch_stretch.time
=cur_time
;
548 e.ss_pitch_stretch.trk_id
=track
;
549 e.ss_pitch_stretch.note
=note
;
550 e.ss_pitch_stretch.len
=len
;
551 e.ss_pitch_stretch.vol
=vol
;
557 static void add_ss_print_wave_tempo
(int note
, double len
)
561 e.ss_print_wave_tempo.type
=SONG_EV_SS_PRINT_WAVE_TEMPO
;
562 e.ss_print_wave_tempo.time
=cur_time
;
563 e.ss_print_wave_tempo.trk_id
=track
;
564 e.ss_print_wave_tempo.note
=note
;
565 e.ss_print_wave_tempo.len
=len
;
571 static void add_midi_channel_event
(int channel
)
575 /* 1st channel is 0 */
578 e.midi_channel.type
=SONG_EV_MIDI_CHANNEL
;
579 e.midi_channel.time
=cur_time
;
580 e.midi_channel.trk_id
=track
;
581 e.midi_channel.channel
=channel
;
587 static void add_midi_program_event
(int program
)
591 e.midi_program.type
=SONG_EV_MIDI_PROGRAM
;
592 e.midi_program.time
=cur_time
;
593 e.midi_program.trk_id
=track
;
594 e.midi_program.program
=program
;
600 static void init_track
(void)
601 /* sets the default values for a new track */
611 /* groups should not cross track boundaries */
614 /* reset arpeggiator */
628 %token
<i
> P_INTEGER S_INTEGER
629 %token
<d
> P_REAL S_REAL
630 %token
<i
> NOTE_P NOTE_T3 NOTE_T5
631 %token
<p
> NEW_MARK GOTO_MARK ASSERT_MARK
633 %token
<p
> BLOCK BLK_ASSIGN BLK_INSERT FILE_INSERT
636 %token
<i
> XC_ABSNOTE
639 %token SS_SEP SS_WAV SS_LOOP_WAV SS_PAT SS_SUSTAIN SS_VIBRATO SS_CHANNEL SS_VOL
641 %token SS_EFF_DELAY SS_EFF_ECHO SS_EFF_COMB SS_EFF_ALLPASS SS_EFF_FLANGER
642 %token SS_EFF_WOBBLE SS_EFF_SQWOBBLE SS_EFF_FADER SS_EFF_REVERB SS_EFF_OFF
644 %token SS_PITCH_STRETCH SS_TIME_STRETCH SS_PRINT_WAVE_TEMPO
646 %token MIDI_CHANNEL MIDI_PROGRAM MIDI_GENERIC
648 %type
<i
> integer note note_pitch rest
649 %type
<d
> real p_number number note_length
651 %type
<d
> arp_list arp_note
676 /* absolute octave */
680 /* relative octave */
684 /* absolute volume */
688 /* absolute volume */
692 /* relative volume */
709 /* group delimiter */
722 /* measure mark event */
747 add_tempo_event
(-1, $2);
749 |
'M' P_INTEGER
'/' P_INTEGER
{
750 /* meter (time signature) setting */
751 add_meter_event
(-1, $2, $4);
754 | BLOCK
'*' P_INTEGER
{
756 push_code
($1, $3, 1);
760 set_named_block
($2, $1);
763 /* insert named block */
764 insert_named_block
($1);
778 P_INTEGER
{ $$
= $1; }
779 | S_INTEGER
{ $$
= $1; }
784 | S_REAL
{ $$
= $1; }
788 P_INTEGER
{ $$
= (double) $1; }
789 | P_REAL
{ $$
= $1; }
793 integer
{ $$
= (double) $1; }
798 note_pitch
{ $$
= $1; }
799 | note note_length
{ $$
= $1; length
=$2; }
800 | note
'~' number
{ $$
= $1; DEBUGF
("imm volume: %lf\n", $3); }
805 | note_pitch
'&' { $$
= $1 - 1; }
806 | note_pitch
'#' { $$
= $1 + 1; }
807 | note_pitch
'\'' { $$
= $1 + 12; }
808 | note_pitch
',' { $$
= $1 - 12; }
812 P_INTEGER
{ $$
= 1 / (double) $1; }
813 | note_length NOTE_T3
{ $$
= $1 * 2.0 / 3.0; }
814 | note_length NOTE_T5
{ $$
= $1 * 4.0 / 5.0; }
815 | note_length
'*' p_number
{ $$
= $1 * $3; }
816 | note_length
'.' { $$
= $1 * 1.5; }
822 /* rest with length */
829 /* empty arpeggiator */
838 /* first arpeggiator note */
842 | arp_list
',' arp_note
{
843 /* rest of arpeggiator notes */
850 /* arpeggiator delay */
853 | arp_note
'~' number
{
854 /* arpeggiator volume */
855 arp_volume
=(float)$3;
857 | arp_note S_INTEGER
{
858 /* arpeggiator transpose */
861 | arp_note
'@' P_INTEGER
{
862 /* arpeggiator track */
868 P_INTEGER
{ $$
= $1; }
869 | XC_ABSNOTE
{ $$
= $1; }
873 SS_WAV XC_STR xc_absnote
{
874 /* load .wav file with just one note */
875 add_ss_wav_event
($2, $3, $3, $3, -1.0, -1.0);
877 | SS_WAV XC_STR xc_absnote xc_absnote xc_absnote
{
879 add_ss_wav_event
($2, $3, $4, $5, -1.0, -1.0);
881 | SS_WAV XC_STR xc_absnote xc_absnote xc_absnote number number
{
882 /* load .wav file, with loop boundaries */
883 add_ss_wav_event
($2, $3, $4, $5, $6, $7);
887 add_ss_pat_event
($2);
889 | SS_SUSTAIN XC_MSECS
{
891 add_ss_sustain_event
($2);
893 | SS_VIBRATO XC_MSECS number
{
895 add_ss_vibrato_event
($2, $3);
897 | SS_CHANNEL integer number
{
898 /* sets volume for a channel */
899 add_ss_channel_event
($2, $3);
901 | SS_VOL number number
{
902 /* set vol for 2 channels */
903 add_ss_channel_event
(0, $2);
904 add_ss_channel_event
(1, $3);
906 | SS_VOL number number number
{
907 /* set vol for 3 channels */
908 add_ss_channel_event
(0, $2);
909 add_ss_channel_event
(1, $3);
910 add_ss_channel_event
(2, $4);
912 | SS_VOL number number number number
{
913 /* set vol for 4 channels */
914 add_ss_channel_event
(0, $2);
915 add_ss_channel_event
(1, $3);
916 add_ss_channel_event
(2, $4);
917 add_ss_channel_event
(3, $5);
919 | SS_VOL number number number number number number
{
920 /* set vol for 6 channels */
921 add_ss_channel_event
(0, $2);
922 add_ss_channel_event
(1, $3);
923 add_ss_channel_event
(2, $4);
924 add_ss_channel_event
(3, $5);
925 add_ss_channel_event
(4, $6);
926 add_ss_channel_event
(5, $7);
928 | SS_EFF_DELAY integer XC_MSECS
{
930 add_ss_eff_event
(SONG_EV_SS_EFF_DELAY
,
931 $2, $3, 0, 0, 0, 0, 0, 0);
934 | SS_EFF_ECHO integer XC_MSECS number
{
936 add_ss_eff_event
(SONG_EV_SS_EFF_ECHO
,
937 $2, $3, $4, 0, 0, 0, 0, 0);
940 | SS_EFF_COMB integer XC_MSECS number
{
942 add_ss_eff_event
(SONG_EV_SS_EFF_COMB
,
943 $2, $3, $4, 0, 0, 0, 0, 0);
946 | SS_EFF_ALLPASS integer XC_MSECS number
{
948 add_ss_eff_event
(SONG_EV_SS_EFF_ALLPASS
,
949 $2, $3, $4, 0, 0, 0, 0, 0);
952 | SS_EFF_FLANGER integer XC_MSECS number XC_MSECS number number
{
954 add_ss_eff_event
(SONG_EV_SS_EFF_FLANGER
,
955 $2, $3, $4, $5, $6, $7, 0, 0);
958 | SS_EFF_WOBBLE integer number number
{
960 add_ss_eff_event
(SONG_EV_SS_EFF_WOBBLE
,
961 $2, 0, 0, 0, $3, $4, 0, 0);
964 | SS_EFF_SQWOBBLE integer number number
{
965 /* square wobble effect */
966 add_ss_eff_event
(SONG_EV_SS_EFF_SQWOBBLE
,
967 $2, 0, 0, 0, $3, $4, 0, 0);
970 | SS_EFF_FADER integer XC_MSECS number number
{
972 add_ss_eff_event
(SONG_EV_SS_EFF_FADER
,
973 $2, $3, 0, 0, 0, 0, $4, $5);
976 | SS_EFF_REVERB integer
{
978 add_ss_eff_event
(SONG_EV_SS_EFF_REVERB
,
979 $2, 0, 0, 0, 0, 0, 0, 0);
982 | SS_EFF_OFF integer
{
984 add_ss_eff_event
(SONG_EV_SS_EFF_OFF
,
985 $2, 0, 0, 0, 0, 0, 0, 0);
988 | SS_PITCH_STRETCH xc_absnote number number
{
989 /* pitch stretch note */
990 add_ss_pitch_stretch
($2, $3, $4);
995 | SS_PRINT_WAVE_TEMPO xc_absnote number
{
996 /* print tempo from wave */
997 add_ss_print_wave_tempo
($2, $3);
1000 | MIDI_CHANNEL integer
{
1002 add_midi_channel_event
($2);
1005 | MIDI_PROGRAM integer
{
1007 add_midi_program_event
($2);
1013 void yyerror(char * s
)
1015 c_err
(s
, NULL
, NULL
);
1023 push_code
("!this-is-a-mark", 1, 0);
1024 push_code
("< c1 ; e& ; g>", 1, 0);
1025 push_code
("^this-is-a-mark", 1, 0);
1026 push_code
("x4,2-1,2.+4", 1, 0);
1027 push_code
("a b'' c,, ", 1, 0);
1028 push_code
("v0.1 (d8 v+0.1)*10", 1, 0);
1029 push_code
("t1 t-2 t+3", 1, 0);
1030 push_code
("{ fader -1 100ms 0 1 } r r4. z2 `room_kit.ahs` o4 o+1 o-2 ", 1, 0);
1031 push_code
("{ sustain 100ms }", 1, 0);
1032 push_code
("T120.0 M4/4 z8 abcde T80 (edcba)=drum1 $drum1 $drum1 ((a&b)*3 (cd)*2)*10", 2, 0);
1036 printf
("Exiting main...\n");
1041 static void compile_startup
(void)
1047 /* default settings */
1048 add_tempo_event
(-2, 120.0);
1049 add_meter_event
(-2, 4, 4);
1054 int compile
(char * code
)
1058 push_code
(code
, 1, 0);
1060 return
(yyparse() + compiler_error
);
1064 int compile_file
(char * file
)
1068 if
(insert_file
(file
))
1071 return
(yyparse() + compiler_error
);