The wrong detection of the end of a song has been fixed by storing the
[ahxm.git] / ss_song.c
blob9f148f01fa1b0d26462aa79f379d4e24ed09408d
1 /*
3 Ann Hell Ex Machina - Music Software
4 Copyright (C) 2003/2005 Angel Ortega <angel@triptico.com>
6 ss_song.c - Software synth song event stream management
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 <stdlib.h>
30 #include <string.h>
31 #include <math.h>
33 #include "annhell.h"
35 /*******************
36 Data
37 ********************/
39 struct ss_ev_generic
41 song_ev_type type; /* event type */
42 int frame; /* frame number (time) */
43 int trk_id; /* track id */
46 struct ss_ev_note_off
48 song_ev_type type; /* SONG_EV_NOTE_OFF */
49 int frame;
50 int trk_id;
51 int note_id; /* note id */
54 struct ss_ev_note_on
56 song_ev_type type; /* SONG_EV_NOTE_ON */
57 int frame;
58 int trk_id;
59 int note_id; /* note id */
60 int note; /* MIDI-like note */
61 float vol; /* volume */
64 struct ss_ev_ss_sustain
66 song_ev_type type; /* SONG_EV_SS_SUSTAIN */
67 int frame;
68 int trk_id;
69 double sustain; /* sustain time (in frames) */
72 struct ss_ev_ss_vibrato
74 song_ev_type type; /* SONG_EV_SS_VIBRATO */
75 int frame;
76 int trk_id;
77 double vib_depth; /* vibrato depth (in msecs) */
78 double vib_freq; /* vibrato frequency (in Hzs) */
81 struct ss_ev_ss_channel
83 song_ev_type type; /* SONG_EV_SS_CHANNEL */
84 int frame;
85 int trk_id;
86 int channel; /* channel */
87 float vol; /* volume */
90 struct ss_ev_ss_wav
92 song_ev_type type; /* SONG_EV_SS_WAV */
93 int frame;
94 int trk_id;
95 char * file; /* path to .wav file */
96 int base; /* MIDI-like base note */
97 int min; /* MIDI-like minimum note */
98 int max; /* MIDI-like maximum note */
99 double loop_start; /* loop start */
100 double loop_end; /* loop end */
103 struct ss_ev_ss_pat
105 song_ev_type type; /* SONG_EV_SS_PAT */
106 int frame;
107 int trk_id;
108 char * file; /* path to .pat file */
111 struct ss_ev_tempo
113 song_ev_type type; /* SONG_EV_TEMPO */
114 int frame;
115 int trk_id;
116 double tempo; /* tempo in bmp */
119 struct ss_ev_pitch_stretch
121 song_ev_type type; /* SONG_EV_SS_PITCH_STRETCH */
122 int frame;
123 int trk_id;
124 int note_id; /* note id */
125 int note; /* MIDI-like note (to find the wave) */
126 double len; /* note length (1: whole note) */
127 float vol; /* note volume (1: full volume) */
130 struct ss_ev_ss_eff
132 song_ev_type type; /* effect type */
133 int frame;
134 int trk_id;
135 int channel; /* channel */
136 double size; /* size of effect */
137 float gain; /* gain */
138 double depth; /* depth */
139 double freq; /* freq */
140 double phase; /* phase */
141 float initial; /* initial vol */
142 float final; /* final vol */
145 union ss_ev
147 struct ss_ev_generic generic;
148 struct ss_ev_note_on note_on;
149 struct ss_ev_note_off note_off;
150 struct ss_ev_ss_sustain ss_sustain;
151 struct ss_ev_ss_vibrato ss_vibrato;
152 struct ss_ev_ss_channel ss_channel;
153 struct ss_ev_ss_wav ss_wav;
154 struct ss_ev_ss_pat ss_pat;
155 struct ss_ev_ss_eff ss_eff;
156 struct ss_ev_tempo tempo;
157 struct ss_ev_pitch_stretch ss_pitch_stretch;
160 /* the softsynth song stream */
162 static union ss_ev * ss_song=NULL;
163 static int n_ss_ev=0;
166 /* the instruments */
168 #define SONG_INS_NUM 256
169 struct ss_ins song_ins[SONG_INS_NUM];
172 /*******************
173 Code
174 ********************/
176 static void add_ss_ev(union ss_ev * e)
177 /* adds a softsynth song event */
179 /* reallocs */
180 ss_song=(union ss_ev *)realloc(ss_song,
181 (n_ss_ev + 1) * sizeof(union ss_ev));
183 /* store */
184 memcpy(&ss_song[n_ss_ev], e, sizeof(union ss_ev));
186 n_ss_ev++;
190 static int ss_ev_cmp(const void * v1, const void * v2)
191 /* softsynth song event compare function for qsort() */
193 struct ss_ev_generic * e1;
194 struct ss_ev_generic * e2;
196 e1=(struct ss_ev_generic *)v1; e2=(struct ss_ev_generic *)v2;
198 if(e1->frame == e2->frame)
199 return(e1->type - e2->type);
201 return(e1->frame - e2->frame);
205 static int ss_song_convert_events(void)
206 /* converts generic song_ev events to softsynth events */
208 int note_id=1;
209 union song_ev * e;
210 union ss_ev sse;
211 int frame, frame_ac, f_frame;
212 double fpw, time_ac, time_ac_m;
213 int num, den;
214 int n;
215 int b_track=-1;
217 /* resets the ss stream */
218 if(ss_song != NULL)
220 free(ss_song);
221 ss_song=NULL;
224 n_ss_ev=0;
226 /* sorts the song */
227 song_sort();
229 fpw=0;
230 frame=frame_ac=f_frame=0;
231 time_ac=time_ac_m=0;
232 num=den=4;
234 /* travels the song events generating softsynth song events */
235 for(n=0;n < n_song_ev;n++)
237 /* gets the song event */
238 e=&song[n];
240 /* calculates the frame */
241 frame=((e->generic.time - time_ac) * fpw) + frame_ac;
243 /* generic event data */
244 sse.generic.type=e->generic.type;
245 sse.generic.frame=frame;
246 sse.generic.trk_id=e->generic.trk_id;
248 /* account the biggest track seen */
249 if(b_track < e->generic.trk_id) b_track=e->generic.trk_id;
251 switch(e->generic.type)
253 case SONG_EV_TEMPO:
255 /* updates accumulations */
256 frame_ac += frame;
257 time_ac += e->generic.time;
259 /* calculates frames-per-whole based on new tempo */
260 fpw=(double) ss_frequency * 60.0;
261 fpw /= e->tempo.tempo / 4.0;
263 /* adds an event */
264 sse.tempo.tempo=e->tempo.tempo;
265 add_ss_ev(&sse);
267 break;
269 case SONG_EV_METER:
271 /* just store the values */
272 num=e->meter.num;
273 den=e->meter.den;
274 time_ac_m=e->meter.time;
276 break;
278 case SONG_EV_MEASURE:
280 song_test_measure_boundary(e->measure.time - time_ac_m,
281 num, den, e->measure.line);
282 break;
284 case SONG_EV_NOTE:
286 /* convert to note on / off pairs */
288 sse.note_on.type=SONG_EV_NOTE_ON;
289 sse.note_on.note_id=note_id++;
290 sse.note_on.note=e->note.note;
291 sse.note_on.vol=e->note.vol;
293 add_ss_ev(&sse);
295 frame += (int)(e->note.len * fpw);
297 sse.note_off.type=SONG_EV_NOTE_OFF;
298 sse.note_off.frame=frame;
300 add_ss_ev(&sse);
301 break;
303 case SONG_EV_SS_PITCH_STRETCH:
305 sse.ss_pitch_stretch.note_id=note_id++;
306 sse.ss_pitch_stretch.note=e->ss_pitch_stretch.note;
307 sse.ss_pitch_stretch.len=e->ss_pitch_stretch.len;
308 sse.ss_pitch_stretch.vol=e->ss_pitch_stretch.vol;
310 add_ss_ev(&sse);
312 frame += (int)(e->ss_pitch_stretch.len * fpw);
314 sse.note_off.type=SONG_EV_NOTE_OFF;
315 sse.note_off.frame=frame;
317 add_ss_ev(&sse);
318 break;
320 case SONG_EV_SS_WAV:
322 sse.ss_wav.file=e->ss_wav.file;
323 sse.ss_wav.base=e->ss_wav.base;
324 sse.ss_wav.min=e->ss_wav.min;
325 sse.ss_wav.max=e->ss_wav.max;
326 sse.ss_wav.loop_start=e->ss_wav.loop_start;
327 sse.ss_wav.loop_end=e->ss_wav.loop_end;
329 add_ss_ev(&sse);
330 break;
332 case SONG_EV_SS_PAT:
334 sse.ss_pat.file=e->ss_pat.file;
336 add_ss_ev(&sse);
337 break;
339 case SONG_EV_SS_SUSTAIN:
341 sse.ss_sustain.sustain=e->ss_sustain.sustain;
343 add_ss_ev(&sse);
344 break;
346 case SONG_EV_SS_VIBRATO:
348 sse.ss_vibrato.vib_depth=e->ss_vibrato.vib_depth;
349 sse.ss_vibrato.vib_freq=e->ss_vibrato.vib_freq;
351 add_ss_ev(&sse);
352 break;
354 case SONG_EV_SS_CHANNEL:
356 sse.ss_channel.channel=e->ss_channel.channel;
357 sse.ss_channel.vol=e->ss_channel.vol;
359 add_ss_ev(&sse);
360 break;
362 case SONG_EV_SS_EFF_DELAY:
363 case SONG_EV_SS_EFF_ECHO:
364 case SONG_EV_SS_EFF_COMB:
365 case SONG_EV_SS_EFF_ALLPASS:
366 case SONG_EV_SS_EFF_FLANGER:
367 case SONG_EV_SS_EFF_WOBBLE:
368 case SONG_EV_SS_EFF_SQWOBBLE:
369 case SONG_EV_SS_EFF_FADER:
370 case SONG_EV_SS_EFF_REVERB:
371 case SONG_EV_SS_EFF_OFF:
373 sse.ss_eff.channel=e->ss_eff.channel;
374 sse.ss_eff.size=e->ss_eff.size;
375 sse.ss_eff.gain=e->ss_eff.gain;
376 sse.ss_eff.depth=e->ss_eff.depth;
377 sse.ss_eff.freq=e->ss_eff.freq;
378 sse.ss_eff.phase=e->ss_eff.phase;
379 sse.ss_eff.initial=e->ss_eff.initial;
380 sse.ss_eff.final=e->ss_eff.final;
382 add_ss_ev(&sse);
383 break;
385 case SONG_EV_MIDI_CHANNEL:
386 case SONG_EV_MIDI_PROGRAM:
388 /* ignored */
389 break;
391 case SONG_EV_NOTE_ON:
392 case SONG_EV_NOTE_OFF:
393 case SONG_EV_END:
395 /* never found in generic song streams */
396 break;
399 /* store the further frame seen */
400 if(f_frame < frame) f_frame=frame;
403 /* generates an end of event mark, a time after the last one */
404 sse.generic.type=SONG_EV_END;
405 sse.generic.frame=f_frame + ss_frequency;
406 add_ss_ev(&sse);
408 /* finally sort */
409 qsort(ss_song, n_ss_ev, sizeof(union ss_ev), ss_ev_cmp);
411 /* return the number of tracks */
412 return(b_track + 1);
416 int ss_song_render(void)
418 union ss_ev * e;
419 int frame;
420 int go;
421 int n;
422 float output[SS_MAX_CHANNELS];
423 int n_tracks;
424 struct ss_ins * i;
425 double tempo=120.0;
427 /* convert the song to ss events */
428 n_tracks=ss_song_convert_events();
430 frame=0;
431 go=1;
432 e=ss_song;
434 /* init the instruments */
435 for(n=0;n < n_tracks;n++)
436 ss_ins_init(&song_ins[n]);
438 /* loop the events */
439 while(go)
441 /* process all events for this exact frame */
442 while(e->generic.frame == frame)
444 /* take the instrument */
445 if(e->generic.trk_id == -1)
446 i=NULL;
447 else
448 i=&song_ins[e->generic.trk_id];
450 switch(e->generic.type)
452 case SONG_EV_NOTE_ON:
454 ss_ins_note_on(i, e->note_on.note,
455 e->note_on.vol, e->note_on.note_id);
457 break;
459 case SONG_EV_NOTE_OFF:
461 ss_ins_note_off(i, e->note_off.note_id);
463 break;
465 case SONG_EV_SS_SUSTAIN:
467 ss_ins_set_sustain(i, e->ss_sustain.sustain);
469 break;
471 case SONG_EV_SS_VIBRATO:
473 ss_ins_set_vibrato(i, e->ss_vibrato.vib_depth,
474 e->ss_vibrato.vib_freq);
476 break;
478 case SONG_EV_SS_CHANNEL:
480 ss_ins_set_channel(i, e->ss_channel.channel,
481 e->ss_channel.vol);
483 break;
485 case SONG_EV_SS_WAV:
488 struct ss_wave * w;
490 w=ss_load_wav_file(e->ss_wav.file,
491 ss_note_frequency(e->ss_wav.base),
492 ss_note_frequency(e->ss_wav.min),
493 ss_note_frequency(e->ss_wav.max),
494 e->ss_wav.loop_start,
495 e->ss_wav.loop_end);
497 ss_ins_add_layer(i, w);
500 break;
502 case SONG_EV_SS_PAT:
504 ss_load_pat_file(i, e->ss_pat.file);
505 break;
507 case SONG_EV_SS_EFF_DELAY:
509 ss_eff_delay(&i->effs[e->ss_eff.channel],
510 e->ss_eff.size);
511 break;
513 case SONG_EV_SS_EFF_ECHO:
515 ss_eff_echo(&i->effs[e->ss_eff.channel],
516 e->ss_eff.size, e->ss_eff.gain);
517 break;
519 case SONG_EV_SS_EFF_COMB:
521 ss_eff_comb(&i->effs[e->ss_eff.channel],
522 e->ss_eff.size, e->ss_eff.gain);
523 break;
525 case SONG_EV_SS_EFF_ALLPASS:
527 ss_eff_allpass(&i->effs[e->ss_eff.channel],
528 e->ss_eff.size, e->ss_eff.gain);
529 break;
531 case SONG_EV_SS_EFF_FLANGER:
533 ss_eff_flanger(&i->effs[e->ss_eff.channel],
534 e->ss_eff.size, e->ss_eff.gain,
535 e->ss_eff.depth, e->ss_eff.freq,
536 e->ss_eff.phase);
537 break;
539 case SONG_EV_SS_EFF_WOBBLE:
541 ss_eff_wobble(&i->effs[e->ss_eff.channel],
542 e->ss_eff.freq, e->ss_eff.phase);
544 break;
546 case SONG_EV_SS_EFF_SQWOBBLE:
548 ss_eff_square_wobble(&i->effs[e->ss_eff.channel],
549 e->ss_eff.freq, e->ss_eff.phase);
551 break;
553 case SONG_EV_SS_EFF_FADER:
555 ss_eff_fader(&i->effs[e->ss_eff.channel],
556 e->ss_eff.size, e->ss_eff.initial,
557 e->ss_eff.final);
558 break;
560 case SONG_EV_SS_EFF_REVERB:
562 ss_eff_reverb(&i->effs[e->ss_eff.channel]);
563 break;
565 case SONG_EV_SS_EFF_OFF:
567 ss_eff_off(&i->effs[e->ss_eff.channel]);
568 break;
570 case SONG_EV_TEMPO:
572 /* just store the last tempo */
573 tempo=e->tempo.tempo;
574 break;
576 case SONG_EV_SS_PITCH_STRETCH:
579 int n=0;
580 struct ss_wave * w;
581 double freq;
583 /* find the wave */
584 freq=ss_note_frequency(e->ss_pitch_stretch.note);
585 w=ss_ins_find_layer(i, freq, &n);
587 /* calculate optimal frequency */
588 freq=ss_pitch_from_tempo(w, tempo, e->ss_pitch_stretch.len);
590 /* play the note */
591 ss_ins_play(i, freq, e->ss_pitch_stretch.vol,
592 e->ss_pitch_stretch.note_id, w);
595 break;
597 case SONG_EV_END:
599 go=0;
600 break;
602 case SONG_EV_MIDI_CHANNEL:
603 case SONG_EV_MIDI_PROGRAM:
604 case SONG_EV_NOTE:
605 case SONG_EV_METER:
606 case SONG_EV_MEASURE:
608 /* never found in ss song streams */
609 break;
612 /* next event */
613 e++;
616 /* reset frame samples */
617 ss_output_init_frame(output);
619 /* generate output from all instruments */
620 for(n=0;n < n_tracks;n++)
621 ss_ins_frame(&song_ins[n], output);
623 /* dump to sampling driver */
624 ss_output_write(output);
626 /* next frame */
627 frame++;
630 return(0);