我在mac上使用Saffire Pro 40声卡玩pyaudio
。目前我有两个输入插入,我想以编程方式控制第二个输入通道的电平。(使用声卡的混音控制软件可以正常工作)。
我一直在看pyaudio
文档,但到目前为止还没有发现任何关于这个问题的明显问题。什么是最简单的方法,本质上做混音控制软件所做的(控制每个通道的音量)编程?(Python API会很好,但不是必需的)
为了简化:看起来可以手动从我想要控制的通道中读取流,使用numpy缩放它们,然后将它们作为输出写入,但我希望有一种方法可以简单地向每个通道发送规范化值来控制它。
而不是像这样:
stream1 = pyaudioInstance.open( format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
output = True,
input_device_index = 0,
frames_per_buffer = CHUNK
)
stream2 = pyaudioInstance.open( format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
input_device_index = 1,
frames_per_buffer = CHUNK
)
while processingAudio:
# manually fetch each channel
data1In = stream1.read(CHUNK)
data2In = stream2.read(CHUNK)
# convert to numpy to easy scale the arrays
decodeddata1 = numpy.fromstring(data1In, numpy.int16)
decodeddata2 = numpy.fromstring(data2In, numpy.int16)
newdata = (decodeddata1 * 0.5 + decodeddata2* 0.1).astype(numpy.int16)
# finally write the processed data
stream1.write(result.tostring())
这有点误导,但我需要混合来自相同输入设备索引的单独通道。然而,我希望是这样的:
someSoundCardAPI.channels[0].setVolume(0.2)
看一下通道映射的例子感觉更接近我所追求的。目前,我发现API的host_api_specific部分有点混乱,我希望有人已经有一些成功使用这个的经验。
我正在使用OSX 10.10
我对OSX没有任何经验,所以我不知道,但通常你可以用AppleScript远程控制一切。比如这个问题。不过,它并没有说明如何单独控制单个频道的音量。
也许你应该问问那里…
对于较差的解决方案,您可以使用Python -sounddevice创建一个小的(未经测试的)Python脚本:
import sounddevice as sd
def callback(indata, outdata, *stuff):
outdata[:] = indata * [1, 0.5]
with sd.Stream(channels=2, callback=callback):
input()
这个脚本将运行,直到你按下<Return>
,它将减少第二个通道的音量。