Updated TODO.
[ahxm.git] / wav.c
blob3a0fac519266f48f8647f50a5cc35905f090c985
1 /*
3 Ann Hell Ex Machina - Music Software
4 Copyright (C) 2003/2005 Angel Ortega <angel@triptico.com>
6 wav.c - Code for testing the libraries
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 http://www.triptico.com
26 #include "config.h"
28 #include <stdio.h>
29 #include <string.h>
30 #include <stdlib.h>
31 #include <math.h>
33 #include "annhell.h"
35 /*******************
36 Data
37 ********************/
39 /* defined in compiler.y */
40 int compile(char * code);
41 int compile_file(char * file);
43 /*******************
44 Code
45 ********************/
47 int main(int argc, char * argv[])
49 char * ahs_file="examples/example2.ahs";
51 #if 0
52 float * wave[CHANNELS];
53 float output[CHANNELS];
54 float vol[CHANNELS];
55 int s_rate;
56 double size;
57 int n_channels;
58 FILE * f;
59 int n, m;
60 struct effect e[16];
61 struct ss_ins i[16];
62 int goon;
63 int frame;
64 struct ss_wave w;
65 union event1 e1;
66 union event2 * e2;
67 #endif
68 #if 0
70 event1_clear();
72 e1.note.type=EV1_NOTE;
73 e1.note.time=0;
74 e1.note.trk_id=1;
75 e1.note.note=60;
76 e1.note.len=1.0;
77 e1.note.vol=1.0;
79 new_event1(&e1);
81 e1.note.note=63;
82 new_event1(&e1);
84 e1.note.note=67;
85 new_event1(&e1);
87 e1.note.type=EV1_NOTE;
88 e1.note.time=1.0;
89 e1.note.note=60;
91 new_event1(&e1);
93 e1.note.note=65;
94 new_event1(&e1);
96 e1.note.note=68;
97 new_event1(&e1);
99 e1.note.type=EV1_NOTE;
100 e1.note.time=2.0;
101 e1.note.note=60;
103 new_event1(&e1);
105 e1.note.note=63;
106 new_event1(&e1);
108 e1.note.note=67;
109 new_event1(&e1);
111 e1.note.type=EV1_NOTE;
112 e1.note.time=3.0;
113 e1.note.note=60;
115 new_event1(&e1);
117 e1.note.note=65;
118 new_event1(&e1);
120 e1.note.note=68;
121 new_event1(&e1);
123 e1.tempo.type=EV1_TEMPO;
124 e1.tempo.time=0;
125 e1.tempo.trk_id=-1;
126 e1.tempo.tempo=60.0;
128 new_event1(&e1);
130 e1.tempo.time=2;
131 e1.tempo.tempo=120.0;
132 new_event1(&e1);
134 e1.meter.type=EV1_METER;
135 e1.meter.time=0;
136 e1.meter.trk_id=-1;
137 e1.meter.num=4;
138 e1.meter.den=4;
140 new_event1(&e1);
141 #endif
144 char * ptr=preprocess("%examples/example1.ahml");
145 printf("%s\n",ptr);
146 compile("x16-2~0.8,8-4~0.6 c8d#''4/3*6~0.5 x o2e4~0.8o++f");
149 ss_interpolation=3;
150 ss_frequency=44100;
151 ss_master_volume=0.5;
152 ss_nchannels=4;
153 #if 0
154 ss_ins_init(&i[1], 1);
155 load_pat_file(&i[1], "samples/acpiano.pat");
156 ss_ins_init(&i[2], 2);
157 /* load_pat_file(&i[2], "samples/synstr1.pat"); */
158 load_pat_file(&i[2], "samples/flute.pat");
160 /* n_channels=load_wav_file("samples/as-al017.wav", &size, wave); */
161 /* n_channels=load_wav_file("samples/amen1.wav", &size, &s_rate, wave);
162 printf("n_channels: %d\n", n_channels); */
164 load_wav_file(&w, "samples/amen1.wav");
166 printf("tempo: %lf\n", tempo_from_wave(&w, 60, 1));
168 ss_ins_init(&i[0], 0);
169 /* ss_ins_add_layer(&i[0],
170 note_frequency(36), note_frequency(0), note_frequency(127),
171 n_channels, wave, size, s_rate, 0, size); */
172 ss_ins_add_layer(&i[0], &w);
173 #endif
176 f=popen("sox -V -t raw -s -r 44100 -c 2 -w - qq.wav","w");
179 if(ss_output_open("default", NULL) < 0)
181 printf("Error: can't init driver\n");
182 return(1);
185 /* 'reverb' with 3 allpass */
187 init_delay(&e, (int)TIME2SAMPLES(20.0 / 1000.0), 0.9, 0, 0, 0, 0);
188 init_delay(&e2, (int)TIME2SAMPLES(36.0 / 1000.0), 0.9, 0, 0, 0, 0);
189 init_delay(&e3, (int)TIME2SAMPLES(39.0 / 1000.0), 0.9, 0, 0, 0, 0);
192 /* init_delay(&e, 44100, 0.9, 150, 0.1, 3.14 / 2, 0); */
194 /* wobble */
196 init_delay(&e4, 1, 1, 1, 4, 3.14 / 2, 0);
198 #if 0
199 /* wobble */
200 effect_wobble(&e[0], 0.5, 0);
201 effect_wobble(&e[1], 0.5, 0.25);
203 /* delay */
204 effect_delay(&e[2], 300);
206 /* allpasses in serial (reverb) */
207 effect_allpass(&e[3], (int)TIME2SAMPLES(20.0 / 1000.0), 0.9);
208 effect_allpass(&e[4], (int)TIME2SAMPLES(36.0 / 1000.0), 0.9);
209 effect_allpass(&e[5], (int)TIME2SAMPLES(39.0 / 1000.0), 0.9);
211 effect_allpass(&e[6], (int)TIME2SAMPLES(20.0 / 1000.0), 0.9);
212 effect_allpass(&e[7], (int)TIME2SAMPLES(36.0 / 1000.0), 0.9);
213 effect_allpass(&e[8], (int)TIME2SAMPLES(39.0 / 1000.0), 0.9);
215 /* flanger */
216 effect_flanger(&e[9], 44100, 0.9, 150, 0.1, 0.25);
217 effect_flanger(&e[10], 44100, 0.9, 150, 0.1, 0);
219 /* fader */
220 effect_fader(&e[11], 44100 * 6, 0, 1);
221 #endif
222 #if 0
223 /* events */
224 event_clear();
226 vol[0]=1.0; vol[1]=1.0; vol[2]=0.0; vol[3]=0.0;
227 ss_ins_set_channel_map(&i[0], 4, vol);
229 /* drum loop */
230 event_note_on(0, 0, 36, 1);
231 event_note_off(441000, 0, 36);
233 /* piano */
234 vol[0]=0.0; vol[1]=0.0; vol[2]=1.0; vol[3]=1.0;
235 ss_ins_set_channel_map(&i[1], 4, vol);
237 event_note_on(44100, 1, 64, 1);
238 event_note_on(44100, 1, 67, 1);
239 event_note_on(44100, 1, 71, 1);
241 event_note_off(44100 * 3, 1, 64);
242 event_note_off(44100 * 3, 1, 67);
243 event_note_off(44100 * 3, 1, 71);
245 event_note_on(44100 * 3, 1, 64, 1);
246 event_note_on(44100 * 3, 1, 66, 1);
247 event_note_on(44100 * 3, 1, 71, 1);
249 event_note_off(44100 * 6, 1, 64);
250 event_note_off(44100 * 6, 1, 66);
251 event_note_off(44100 * 6, 1, 71);
253 event_note_on(44100, 1, 28, 1);
254 event_note_off(44100 * 9, 1, 28);
256 event_sort();
257 #endif
259 #if 0
260 /* compile("T81.67 o5c1*10 \\ z1s0.5 t-1 x4~0.6,2~0.3,2.~0.2 <c;e&;g><c;e&;g#>|<c;f;g#><d;f;g> s0.8z8 c'gb&c'b&gfg| \\ t-1 o6s1 c1*3.5 b,2 c1*4 "); */
261 if(compile("{ pat 'samples/acpiano.pat' echo 0 1s 0.5\n/* broken\ncomment */ echo 1 1.5s 0.3 }\n z1 v1 <c;e&;g>|<c;e&;g#>|<c;f;g#>|<d;f;g>\n\\\n{ wav 'samples/amen1.wav' c5 c0 g10\nflanger 0 1s 0.9 3ms 0.1 0.5 flanger 1 1s 0.9 3ms 0.1 0 }\no5 c1*4"))
263 exit(0);
265 #endif
267 if(argc > 1)
268 ahs_file=argv[1];
270 if(compile_file(ahs_file))
272 exit(0);
275 /* event1_to_event2();*/
276 /* generate_ss_song();*/
278 ss_song_render();
279 /* midi_song_play();*/
280 #if 0
281 e2=_events_2;
283 for(frame=0,goon=1;goon;frame++)
285 if(e2->generic.type == EV2_END)
286 break;
288 while(e2->generic.frame == frame)
290 if(e2->generic.type == EV2_NOTE_ON)
291 ss_ins_note_on(&i[e2->note_on.trk_id],
292 e2->note_on.note,
293 e2->note_on.vol,
294 e2->note_on.note_id);
295 else
296 if(e2->generic.type == EV2_NOTE_OFF)
297 ss_ins_note_off(&i[e2->note_off.trk_id],
298 e2->note_off.note_id);
299 else
300 if(e2->generic.type == EV2_END)
301 goon=0;
303 e2++;
306 ss_output_init_frame(output);
308 ss_ins_frame(&i[0], output);
309 ss_ins_frame(&i[1], output);
310 ss_ins_frame(&i[2], output);
312 #if 0
313 if(n < TIME2SAMPLES(13))
315 output[0]=process_effect(&e[0], output[0]);
316 output[1]=process_effect(&e[1], output[1]);
318 /* output[1]=process_effect(&e[2], output[1]); */
320 /* output[0]=process_effect(&e[3], output[0]);
321 output[0]=process_effect(&e[4], output[0]);
322 output[0]=process_effect(&e[5], output[0]);
324 output[1]=process_effect(&e[6], output[1]);
325 output[1]=process_effect(&e[7], output[1]);
326 output[1]=process_effect(&e[8], output[1]); */
328 /* output[0]=process_effect(&e[9], output[0]);
329 output[1]=process_effect(&e[10], output[1]); */
331 /* output[0]=process_effect(&e[11], output[0]);
332 output[1]=process_effect(&e[11], output[1]); */
334 #endif
336 ss_output_write(output);
338 /* if(n < TIME2SAMPLES(14))
339 generator_release(&_generators[1]); */
341 #endif
342 ss_output_close();
344 printf("clipped: %d optimal volume: %f\n",
345 ss_output_clipped, ss_optimal_volume);
347 return(0);