summaryrefslogtreecommitdiffstats
path: root/examples/seq.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/seq.c')
-rw-r--r--examples/seq.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/examples/seq.c b/examples/seq.c
new file mode 100644
index 0000000..3c0293a
--- /dev/null
+++ b/examples/seq.c
@@ -0,0 +1,140 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sysexits.h>
+#include <fcntl.h>
+#include <math.h>
+
+#include <xas/vox.h>
+#include <xas/audio.h>
+#include <xas/riff.h>
+#include <xas/spatial.h>
+#include <xas/seq.h>
+
+static void usage(int argc, char **argv, const char *message, ...) {
+ va_list args;
+
+ va_start(args, message);
+
+ if (message) {
+ vfprintf(stderr, message, args);
+ fputc('\n', stderr);
+ }
+
+ va_end(args);
+
+ fprintf(stderr, "usage: %s output.wav\n", argv[0]);
+
+ exit(EX_USAGE);
+}
+
+int main(int argc, char **argv) {
+ xas_spatial_scene *scene;
+ xas_seq *seq;
+
+ xas_spatial_object *synth_l,
+ *synth_r,
+ *voice;
+
+ xas_audio_stream *output,
+ *wave;
+
+ xas_audio_format format = {
+ .channels = XAS_AUDIO_STEREO,
+ .sample_size = XAS_AUDIO_PCM_16_BIT,
+ .sample_rate = 44100
+ };
+
+ size_t buffer_size = 735;
+
+ xas_spatial_coord speakers[2] = {
+ { -0.09, 0.0, 0.0 },
+ { 0.09, 0.0, 0.0 }
+ };
+
+ if (argc != 2) {
+ usage(argc, argv, "No output file provided");
+ }
+
+ if ((wave = xas_riff_new_file(argv[1],
+ format,
+ O_WRONLY | O_CREAT | O_TRUNC)) == NULL) {
+ goto error_riff_new_file;
+ }
+
+ if ((scene = xas_spatial_scene_new(format,
+ speakers[0],
+ speakers[1])) == NULL) {
+ goto error_spatial_scene_new;
+ }
+
+ if ((seq = xas_seq_new(scene, buffer_size)) == NULL) {
+ goto error_seq_new;
+ }
+
+ if ((voice = xas_spatial_scene_add_vox(scene,
+ (xas_spatial_coord){ 0.0, 0.0, -20.0 },
+ "/usr/bin/text2wave")) == NULL) {
+ goto error_spatial_scene_add_vox;
+ }
+
+ if ((synth_l = xas_spatial_scene_add_synth(scene,
+ (xas_spatial_coord){ -20.0, 0.0, 0.0 },
+ XAS_SYNTH_SINE)) == NULL) {
+ goto error_spatial_scene_add_synth_l;
+ }
+
+ if ((synth_r = xas_spatial_scene_add_synth(scene,
+ (xas_spatial_coord){ 20.0, 0.0, 0.0 },
+ XAS_SYNTH_SINE)) == NULL) {
+ goto error_spatial_scene_add_synth_r;
+ }
+
+ if ((output = xas_spatial_scene_stream_new(scene,
+ buffer_size)) == NULL) {
+ goto error_spatial_scene_stream_new;
+ }
+
+ xas_vox_set_parameter_float(voice->ctx, "Duration_Stretch", 1.3);
+
+ xas_seq_add_set_frequency(seq, synth_l, (struct timeval){ 0, 0 }, 220);
+ xas_seq_add_set_frequency(seq, synth_r, (struct timeval){ 0, 0 }, 420);
+ xas_seq_add_event_on( seq, synth_l, (struct timeval){ 0, 0 });
+ xas_seq_add_event_on( seq, synth_r, (struct timeval){ 0, 0 });
+
+ xas_seq_add_set_position(seq,
+ synth_l,
+ (struct timeval){ 15, 0 },
+ (xas_spatial_coord){ -10.0, 0.0, 0.0 });
+
+ xas_seq_add_phrase(seq,
+ voice,
+ (struct timeval){ 10, 0 },
+ "I will eat your soul.");
+
+ xas_seq_add_event_off(seq, synth_l, (struct timeval){ 60, 0 });
+
+ xas_seq_play(seq, wave);
+
+ xas_seq_destroy(seq);
+ xas_spatial_scene_destroy(scene);
+ xas_audio_stream_destroy(wave);
+
+ return EX_OK;
+
+error_spatial_scene_stream_new:
+error_spatial_scene_add_synth_r:
+error_spatial_scene_add_synth_l:
+error_spatial_scene_add_vox:
+ xas_seq_destroy(seq);
+
+error_seq_new:
+ xas_spatial_scene_destroy(scene);
+
+error_spatial_scene_new:
+ xas_audio_stream_destroy(wave);
+
+error_riff_new_file:
+ return EX_OSERR;
+}