def test_expansion_recursive_processing():
    """
    Check that processing/upmixing propagates through the graph when
    an input's channel count is increased.

    Needs to be run through AudioGraph because simple process_tree
    doesn't do upmixing.
    """
    output = AudioOut_Dummy(2)
    graph = AudioGraph(output_device=output)

    a = Constant(4)
    b = a + 1
    c = b * 2
    d = c - 1
    buf = Buffer(2, 1024)
    graph.play(d)
    graph.render_to_buffer(buf)
    assert np.all(buf.data[0] == 9)

    buf = Buffer(2, 1024)
    b.set_input("input0", [5, 6])
    graph.render_to_buffer(buf)
    assert np.all(buf.data[0] == 11)
    assert np.all(buf.data[1] == 13)
    graph.stop(d)
Ejemplo n.º 2
0
def test_graph_sample_rate():
    graph = AudioGraph()
    assert graph.sample_rate > 0
    graph.sample_rate = 1000
    assert graph.sample_rate == 1000

    with pytest.raises(Exception):
        graph.sample_rate = 0

    buf = Buffer(1, 1000)
    sine = SineOscillator(10)
    process_tree(sine, buf)
    assert count_zero_crossings(buf.data[0]) == 10

    del graph
def test_expansion_upmix():
    output = AudioOut_Dummy(4)
    graph = AudioGraph(output_device=output)
    a = SquareOscillator([440, 880, 1320], [0.3, 0.7])
    assert a.num_input_channels == 3
    assert a.num_output_channels == 3

    process_tree(a)
    assert np.all(a.inputs["frequency"].output_buffer[0] == 440.0)
    assert np.all(a.inputs["frequency"].output_buffer[1] == 880.0)
    assert np.all(a.inputs["frequency"].output_buffer[2] == 1320.0)
    assert np.all(a.inputs["width"].output_buffer[0] == 0.3)
    assert np.all(a.inputs["width"].output_buffer[1] == 0.7)
    assert np.all(a.inputs["width"].output_buffer[2] == 0.0)

    assert count_zero_crossings(a.output_buffer[0]) == math.ceil(
        440 * DEFAULT_BUFFER_LENGTH / graph.sample_rate)
    assert count_zero_crossings(a.output_buffer[1]) == math.ceil(
        880 * DEFAULT_BUFFER_LENGTH / graph.sample_rate)
    assert count_zero_crossings(a.output_buffer[2]) == 0

    #--------------------------------------------------------------------------------
    # When processed through a Graph, multichannel expansion duplicates the
    # 2-channel width node to become 3-channel
    #--------------------------------------------------------------------------------
    a = SquareOscillator([440, 880, 1320], [0.3, 0.7])
    graph.play(a)
    graph.render(1024)
    assert graph.node_count == 4
    assert np.all(a.inputs["frequency"].output_buffer[0] == 440.0)
    assert np.all(a.inputs["frequency"].output_buffer[1] == 880.0)
    assert np.all(a.inputs["frequency"].output_buffer[2] == 1320.0)
    assert np.all(a.inputs["width"].output_buffer[0] == 0.3)
    assert np.all(a.inputs["width"].output_buffer[1] == 0.7)
    assert np.all(a.inputs["width"].output_buffer[2] == 0.3)
    assert count_zero_crossings(a.output_buffer[0]) == math.ceil(
        440 * DEFAULT_BUFFER_LENGTH / graph.sample_rate)
    assert count_zero_crossings(a.output_buffer[1]) == math.ceil(
        880 * DEFAULT_BUFFER_LENGTH / graph.sample_rate)
    assert count_zero_crossings(a.output_buffer[2]) == math.ceil(
        1320 * DEFAULT_BUFFER_LENGTH / graph.sample_rate)

    graph.stop(a)
    graph.render(1024)
    #--------------------------------------------------------------------------------
    # Only remaining note is the abstract audio output node
    #--------------------------------------------------------------------------------
    assert graph.node_count == 1
Ejemplo n.º 4
0
def test_graph_render():
    graph = AudioGraph()
    sine = SineOscillator(440)
    graph.play(sine)
    with pytest.raises(RuntimeError):
        graph.render(441000)
    del graph
Ejemplo n.º 5
0
def test_graph_cyclic():
    graph = AudioGraph()
    graph.sample_rate = 1000
    line = Line(0, 1, 1)
    m1 = line * 1
    m2 = line * 2
    add = m1 + m2
    graph.play(add)
    buf = Buffer(1, 1000)
    graph.render_to_buffer(buf)
    assert np.all(np.abs(buf.data[0] - np.linspace(0, 3, graph.sample_rate)) < 0.00001)
    del graph
Ejemplo n.º 6
0
def test_graph_dummy_audioout():
    output = AudioOut_Dummy(2)
    graph = AudioGraph(output_device=output)

    sine = SineOscillator([ 220, 440 ])
    graph.play(sine)

    graph.render(1024)
    samples = graph.output.output_buffer[0][:1024]
    assert len(samples) == 1024

    del graph
Ejemplo n.º 7
0
def test_config():
    graph = AudioGraph()
    assert graph.config.sample_rate >= 0
Ejemplo n.º 8
0
def test_graph_clear():
    graph = AudioGraph()
    c1 = Constant(1)
    graph.play(c1)
    c2 = Constant(2)
    graph.play(c2)
    buffer = Buffer(1, 1024)
    graph.render_to_buffer(buffer)
    assert np.all(buffer.data[0] == 3)
    graph.clear()
    graph.render_to_buffer(buffer)
    assert np.all(buffer.data[0] == 0)
Ejemplo n.º 9
0
def test_graph():
    graph = AudioGraph()
    assert graph
    del graph
Ejemplo n.º 10
0
def test_graph_add_remove_node():
    graph = AudioGraph()
    constant1 = Constant(1)
    constant2 = Constant(2)
    add = Add(constant1, constant2)
    graph.add_node(add)
    buffer = Buffer(1, 1024)
    graph.render_to_buffer(buffer)
    assert np.all(buffer.data[0] == 0.0)
    assert np.all(add.output_buffer[0] == 3)
    del graph

    graph = AudioGraph()
    constant1 = Constant(1)
    constant2 = Constant(2)
    add = Add(constant1, constant2)
    graph.add_node(add)
    graph.remove_node(add)
    buffer = Buffer(1, 1024)
    graph.render_to_buffer(buffer)
    assert np.all(buffer.data[0] == 0.0)
    assert np.all(add.output_buffer[0] == 0)
    del graph