Example #1
0
END_TEST


START_TEST(Infinite_mode_loops_composition)
{
    set_audio_rate(mixing_rates[MIXING_RATE_LOW]);
    set_mix_volume(0);
    setup_debug_instrument();
    setup_debug_single_pulse();

    set_data("album/p_manifest.json", "{}");
    set_data("album/p_tracks.json", "[0]");
    set_data("song_00/p_manifest.json", "{}");
    set_data("song_00/p_order_list.json", "[ [0, 0] ]");
    set_data("pat_000/p_manifest.json", "{}");
    set_data("pat_000/p_length.json", "[2, 0]");
    set_data("pat_000/instance_000/p_manifest.json", "{}");
    set_data("pat_000/col_00/p_triggers.json", "[ [[0, 0], [\"n+\", \"0\"]] ]");

    validate();

    kqt_Handle_fire_event(handle, 0, "[\"cinfinite+\", null]");
    check_unexpected_error();

    float actual_buf[buf_len] = { 0.0f };
    const long mixed = mix_and_fill(actual_buf, buf_len);
    fail_unless(mixed == buf_len,
            "Wrong number of frames mixed"
            KT_VALUES("%ld", buf_len, mixed));

    float expected_buf[buf_len] = { 0.0f };
    for (long i = 0; i < buf_len; i += mixing_rates[MIXING_RATE_LOW])
        expected_buf[i] = 1.0f;

    check_buffers_equal(expected_buf, actual_buf, buf_len, 0.0f);
}
Example #2
0
END_TEST


START_TEST(Add_and_remove_internal_effect_and_render)
{
    set_audio_rate(220);
    set_mix_volume(0);

    setup_debug_instrument();
    setup_debug_single_pulse();

    float actual_buf[buf_len] = { 0.0f };

    // Add silence
    set_data("album/p_manifest.json", "{}");
    set_data("album/p_tracks.json", "[0]");
    set_data("song_00/p_manifest.json", "{}");
    set_data("song_00/p_order_list.json", "[ [0, 0] ]");
    set_data("pat_000/p_manifest.json", "{}");
    set_data("pat_000/p_length.json", "[16, 0]");
    set_data("pat_000/instance_000/p_manifest.json", "{}");

    // Add internal audio unit
    set_data("au_00/au_00/p_manifest.json", "{ \"type\": \"effect\" }");
    set_data("au_00/au_00/in_00/p_manifest.json", "{}");
    set_data("au_00/au_00/out_00/p_manifest.json", "{}");
    set_data(
            "au_00/p_connections.json",
            "[ [\"proc_00/C/out_00\", \"out_00\"]"
            ", [\"proc_00/C/out_00\", \"au_00/in_00\"]"
            ", [\"au_00/out_00\", \"out_00\"] ]");

    // Add processor inside the internal audio unit
    set_data("au_00/au_00/proc_00/in_00/p_manifest.json", "{}");
    set_data("au_00/au_00/proc_00/out_00/p_manifest.json", "{}");
    set_data("au_00/au_00/proc_00/p_manifest.json", "{ \"type\": \"volume\" }");
    set_data("au_00/au_00/proc_00/p_signal_type.json", "\"mixed\"");
    set_data(
            "au_00/au_00/p_connections.json",
            "[ [\"in_00\", \"proc_00/C/in_00\"]"
            ", [\"proc_00/C/out_00\", \"out_00\"] ]");

    validate();
    check_unexpected_error();

    // Test rendering
    mix_and_fill(actual_buf, buf_len);

    // Remove the internal audio unit
    set_data("au_00/p_connections.json", "[ [\"proc_00/C/out_00\", \"out_00\"] ]");
    set_data("au_00/au_00/in_00/p_manifest.json", "");
    set_data("au_00/au_00/out_00/p_manifest.json", "");
    set_data("au_00/au_00/p_connections.json", "");
    set_data("au_00/au_00/p_manifest.json", "");
    set_data("au_00/au_00/proc_00/in_00/p_manifest.json", "");
    set_data("au_00/au_00/proc_00/out_00/p_manifest.json", "");
    set_data("au_00/au_00/proc_00/p_manifest.json", "");
    set_data("au_00/au_00/proc_00/p_signal_type.json", "");

    validate();
    check_unexpected_error();

    // Test rendering again
    kqt_Handle_set_position(handle, 0, 0);
    mix_and_fill(actual_buf, buf_len);
}
Example #3
0
END_TEST


START_TEST(Tempo_slide_affects_playback_cursor)
{
    set_audio_rate(mixing_rates[MIXING_RATE_LOW]);
    set_mix_volume(0);
    setup_debug_instrument();
    setup_debug_single_pulse();

    int tempos[] = { 30, 60, 120, 240, 0 }; // 0 is guard, shouldn't be used

    set_data("album/p_manifest.json", "{}");
    set_data("album/p_tracks.json", "[0]");
    set_data("song_00/p_manifest.json", "{}");
    set_data("song_00/p_order_list.json", "[ [0, 0] ]");
    set_data("pat_000/p_manifest.json", "{}");
    set_data("pat_000/p_length.json", "[4, 0]");
    set_data("pat_000/instance_000/p_manifest.json", "{}");
    char triggers[256] = "";
    snprintf(triggers, sizeof(triggers),
            "[ [[0, 0], [\"n+\", \"0\"]],"
            "  [[1, 0], [\"n+\", \"0\"]],"
            "  [[1, 0], [\"m/t\", \"%d\"]],"
            "  [[1, 0], [\"m/=t\", \"1\"]],"
            "  [[2, 0], [\"n+\", \"0\"]],"
            "  [[3, 0], [\"n+\", \"0\"]] ]", tempos[_i]);
    set_data("pat_000/col_00/p_triggers.json", triggers);

    validate();

    float actual_buf[buf_len] = { 0.0f };
    mix_and_fill(actual_buf, buf_len);

    float expected_buf[buf_len] = { 0.0f };
    expected_buf[0] = 1.0f;
    const long second_offset = mixing_rates[MIXING_RATE_LOW] / 2;
    expected_buf[second_offset] = 1.0f;

    long third_offset = 0;
    for (long i = second_offset + 1; i < buf_len; ++i)
    {
        if (actual_buf[i] == 1.0f)
        {
            third_offset = i;
            expected_buf[i] = 1.0f;
            break;
        }
    }
    fail_if(third_offset == 0, "Third pulse not found");

    if (tempos[_i] < 120)
    {
        fail_unless((third_offset - second_offset) >= second_offset,
                "Pulse interval was not increased during slide down");
    }
    else if (tempos[_i] > 120)
    {
        fail_unless((third_offset - second_offset) <= second_offset,
                "Pulse interval was not decreased during slide up");
    }
    else
    {
        fail_unless((third_offset - second_offset) == second_offset,
                "Pulse interval was changed without slide");
    }

    const long beat_len = mixing_rates[MIXING_RATE_LOW] * 60 / tempos[_i];
    expected_buf[third_offset + beat_len] = 1.0f;

    check_buffers_equal(expected_buf, actual_buf, buf_len, 0.0f);
}