def test_graph_render(): graph = AudioGraph() sine = SineOscillator(440) graph.play(sine) with pytest.raises(RuntimeError): graph.render(441000) del graph
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)
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)
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
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
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