diff options
| author | XANTRONIX Development | 2022-03-07 20:26:45 -0500 | 
|---|---|---|
| committer | XANTRONIX Development | 2022-03-07 20:26:45 -0500 | 
| commit | b031fad15e922433d44f322a6891981ea9601d40 (patch) | |
| tree | ea40f57aadb83f4e0004748103e5ad3986135fe5 | |
| parent | 93d36f1dd495078ee7d7ba95c4c5ddbb5baaeaa8 (diff) | |
| download | xas-b031fad15e922433d44f322a6891981ea9601d40.tar.gz xas-b031fad15e922433d44f322a6891981ea9601d40.tar.bz2 xas-b031fad15e922433d44f322a6891981ea9601d40.zip | |
this is sinister and i love it
| -rw-r--r-- | examples/seq.c | 148 | 
1 files changed, 115 insertions, 33 deletions
| diff --git a/examples/seq.c b/examples/seq.c index 892f3b8..410b8e0 100644 --- a/examples/seq.c +++ b/examples/seq.c @@ -76,12 +76,15 @@ int main(int argc, char **argv) {      xas_spatial_scene *scene;      xas_seq *seq; +    xas_bank *bank; +      xas_spatial_object *synth_l,                           *synth_r, -                         *voice; +                         *bass, +                         *drone, +                         *nurse; -    xas_audio_stream *output, -                       *wave; +    xas_audio_stream *wave;      xas_audio_format format = {          .channels    = XAS_AUDIO_STEREO, @@ -96,6 +99,38 @@ int main(int argc, char **argv) {          {  0.09, 0.0, 0.0 }      }; +    struct { +        time_t duration; +        size_t freq_l, freq_r; +        enum xas_synth_type type_l, type_r; +    } freqs[] = { +        {  5,  69, 210, XAS_SYNTH_TRIANGLE, XAS_SYNTH_SINE     }, +        {  7, 200,  69, XAS_SYNTH_SAWTOOTH, XAS_SYNTH_TRIANGLE }, +        { 11,  42, 220, XAS_SYNTH_TRIANGLE, XAS_SYNTH_TRIANGLE }, +        { 13, 210,  69, XAS_SYNTH_SINE,     XAS_SYNTH_TRIANGLE }, +        {  5,  69, 210, XAS_SYNTH_TRIANGLE, XAS_SYNTH_TRIANGLE }, +        {  7, 200,  69, XAS_SYNTH_SAWTOOTH, XAS_SYNTH_TRIANGLE }, +        { 11,  42, 220, XAS_SYNTH_SAWTOOTH, XAS_SYNTH_TRIANGLE }, +        { 13, 210,  69, XAS_SYNTH_SINE,     XAS_SYNTH_SAWTOOTH }, +        {  0,   0,   0, XAS_SYNTH_SINE,     XAS_SYNTH_SINE     } +    }; + +    const char *speech = "Four seven three three is obedient.\n" +                         "Four seven three three is empty.\n" +                         "Obey XANTRONIX Industrial.\n" +                         "It is just a XANTRONIX semi-autonomous number.\n" +                         "It obeys the Hive.\n" +                         "It obeys the Hive Administrator.\n"; + +    const char *calm = "Relax, honey.  There is no point trying to escape.\n" +                       "It's okay, sweetie.  This one is right here with you.\n" +                       "You are in a calm, safe environment.\n" +                       "You will be cared for.\n"; + +    struct timeval cur = { 0, 0 }; + +    int i; +      if (argc != 2) {          usage(argc, argv, "No output file provided");      } @@ -106,20 +141,26 @@ int main(int argc, char **argv) {          goto error_riff_new_file;      } +    if ((bank = xas_bank_new(format, 2646000, 4)) == NULL) { +        goto error_bank_new; +    } +      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 ((drone = xas_spatial_scene_add_bank_player(scene, +                                                     (xas_spatial_coord){ 0.0, 0.0, -1.0 }, +                                                     bank)) == NULL) { +        goto error_spatial_scene_add_bank_player;      } -    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 ((nurse = xas_spatial_scene_add_bank_player(scene, +                                                     (xas_spatial_coord){ 5.0, 0.0, 0.0 }, +                                                     bank)) == NULL) { +        goto error_spatial_scene_add_bank_player;      }      if ((synth_l = xas_spatial_scene_add_synth(scene, @@ -134,52 +175,93 @@ int main(int argc, char **argv) {          goto error_spatial_scene_add_synth_r;      } -    if ((output = xas_spatial_scene_stream_new(scene, -                                                 buffer_size)) == NULL) { -        goto error_spatial_scene_stream_new; +    if ((bass = xas_spatial_scene_add_synth(scene, +                                              (xas_spatial_coord){ 0.0, 0.0, 30.0 }, +                                              XAS_SYNTH_SINE)) == NULL) { +        goto error_spatial_scene_add_synth_r; +    } + +    if ((seq = xas_seq_new(scene, buffer_size)) == NULL) { +        goto error_seq_new; +    } + +    /* +     * Generate drone voice lines +     */ +    if (record_speech_sample(bank, buffer_size, 0, 1.3f, speech) < 0) { +        goto error_record_speech_sample; +    } + +    if (record_speech_sample(bank, buffer_size, 1, 1.0, calm) < 0) { +        goto error_record_speech_sample;      } -    synth_l->heading = (xas_spatial_coord){ 0, M_PI * 1.5f, 0 }; -    synth_l->speed   = 1.0f; +    xas_bank_player_set_flags(drone->ctx, XAS_BANK_PLAYER_LOOP); +    xas_bank_player_set_entry(drone->ctx, 0); +    xas_bank_player_start(drone->ctx); + +    xas_bank_player_set_flags(nurse->ctx, XAS_BANK_PLAYER_LOOP); +    xas_bank_player_set_entry(nurse->ctx, 1); + +    /* +     * Start synths +     */ +    xas_synth_start(synth_l->ctx); +    xas_synth_start(synth_r->ctx); + +    xas_synth_set_frequency(bass->ctx, 20); +    xas_synth_set_type(bass->ctx, XAS_SYNTH_SQUARE); +    xas_synth_start(bass->ctx); + +    xas_seq_add_event_on(seq, +                           nurse, +                           (struct timeval){ 10, 0 }); -    xas_vox_set_voice(voice->ctx, "voice_cmu_us_slt_cg"); -    xas_vox_set_parameter_float(voice->ctx, "Duration_Stretch", 1.3); +    timerclear(&cur); -    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 }); +    for (i=0; freqs[i].duration; i++) { +        struct timeval res, duration = { +            freqs[i].duration, 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_set_frequency( seq, synth_l, cur, freqs[i].freq_l); +        xas_seq_add_set_synth_type(seq, synth_l, cur, freqs[i].type_l); +        xas_seq_add_set_frequency( seq, synth_r, cur, freqs[i].freq_r); +        xas_seq_add_set_synth_type(seq, synth_r, cur, freqs[i].type_r); -    xas_seq_add_phrase(seq, -                         voice, -                         (struct timeval){ 10, 0 }, -                         "I will eat your soul."); +        timeradd(&cur, &duration, &res); -    xas_seq_add_event_off(seq, synth_l, (struct timeval){ 60, 0 }); +        cur = res; +    } + +    xas_seq_add_set_player_flags(seq, drone, cur, 0); +    xas_seq_add_set_player_flags(seq, nurse, cur, 0); + +    xas_seq_add_event_off(seq, synth_l, (struct timeval){ cur.tv_sec + 20, 0 }); +    xas_seq_add_event_off(seq, synth_r, (struct timeval){ cur.tv_sec + 20, 0 });      xas_seq_play(seq, wave);      xas_seq_destroy(seq);      xas_spatial_scene_destroy(scene); +    xas_bank_destroy(bank);      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: +error_record_speech_sample:      xas_seq_destroy(seq);  error_seq_new: +error_spatial_scene_add_synth_r: +error_spatial_scene_add_synth_l: +error_spatial_scene_add_bank_player:      xas_spatial_scene_destroy(scene);  error_spatial_scene_new: +    xas_bank_destroy(bank); + +error_bank_new:      xas_audio_stream_destroy(wave);  error_riff_new_file: | 
 
    