我正在使用 Saffire Pro 40 声卡在 mac 上玩 pyaudio
。
目前我插入了两个输入,我想以编程方式控制第二个输入 channel 的电平。 (使用声卡的混音控制软件可以很好地工作)。
我一直在浏览 pyaudio
文档,但到目前为止还没有发现任何关于这个问题的明显内容。以编程方式基本上完成混音控制软件所做的(控制每个 channel 的音量)的最简单方法是什么? (Python API 会很好,但不是必需的)
为了简化:看起来可以从我想要控制的 channel 手动读取流,使用 numpy 缩放它们,然后将它们写为输出,但我希望有一种方法可以简单地将每个 channel 的标准化值发送到控制它。
所以,而不是这样的事情:
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())
这有点误导,但我需要混合来自同一输入设备索引的不同 channel 。但是,我希望是这样的:
someSoundCardAPI.channels[0].setVolume(0.2)
看看 Channel Maps example 感觉更接近我所追求的。目前我发现 API 的 host_api_specific 部分有点令人困惑,我希望有人已经成功地使用过它。
我使用的是 OSX 10.10
最佳答案
我对 OSX 没有任何经验,所以我不知道,但通常您可以使用 AppleScript 远程控制所有内容。
例如,参见 this question 。
但是,它没有说明如何单独控制单个 channel 的音量。
可能你应该问那里...
关于较差的解决方法,您可以使用 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>
并且它会降低第二个 channel 的音量。关于python - 如何以编程方式控制声卡?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32372911/