2015-09-03 3 views
4

Je suis nouveau pour les pilotes audio alors s'il vous plaît nu avec moi.Comment contrôler une carte son par programme?

Je joue avec pyaudio sur un mac en utilisant une carte son Saffire Pro 40. Actuellement, j'ai deux entrées branché et je voudrais contrôler les niveaux du deuxième canal d'entrée par programmation. (Cela fonctionne bien en utilisant le logiciel de contrôle de mixage de la carte son).

J'ai parcouru les docs pyaudio, mais je n'ai rien trouvé de flagrant sur ce problème jusqu'à présent. Quelle est la manière la plus simple de faire essentiellement ce que le logiciel de contrôle de mélange fait (contrôler le volume par canal) par programmation? (Une API Python serait bien, mais pas indispensable)

Pour simplifier: il semble qu'il soit possible de lire manuellement les flux à partir des canaux que je veux contrôler, les mettre à l'échelle en utilisant numpy, les écrire en sortie, mais je J'espère qu'il existe une méthode pour simplement envoyer une valeur normalisée par canal pour le contrôler.

Ainsi, au lieu de quelque chose comme ceci:

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()) 

Ceci est un peu trompeur mais je besoin de mélanger des canaux séparés du même indice de dispositif d'entrée. Mais ce que j'espère est quelque chose comme:

someSoundCardAPI.channels[0].setVolume(0.2) 

Avoir un regard sur le Channel Maps example se sent plus proche de ce que je suis après. Pour le moment, je trouve la partie host_api_specific de l'API un peu déroutante et j'espérais que quelqu'un avait déjà une certaine expérience avec succès.

J'utilise OSX 10,10

+2

Alors voulez-vous un moyen de contrôler à distance votre logiciel de mixage ou voulez-vous écrire une application qui manipule d'une manière ou d'une autre l'entrée audio et écrit le résultat sur les sorties de la carte son? Vous devriez être un peu plus précis. Et vous devriez probablement mentionner le système d'exploitation que vous utilisez. – Matthias

+0

Toutes très bonnes questions, merci! J'ai mis à jour la question ci-dessus. Si je pouvais contrôler à distance le logiciel de mixage, ou puiser dans ses fonctionnalités à partir du code, ce serait génial! Mon approche jusqu'ici est de manipuler l'audio et de réécrire le résultat, mais j'espère qu'il y a un moyen sans avoir besoin de faire cela. J'utilise OSX 10.10 –

Répondre

1

Je n'ai pas vraiment d'expérience avec Mac OS X, donc je ne sais pas, mais normalement vous pouvez contrôler à distance tout avec AppleScript. Voir, par exemple, this question. Il ne dit pas comment contrôler le volume d'un seul canal séparément, cependant.

Probablement vous devriez demander ... il

En ce qui concerne le travail autour, vous pouvez utiliser inférieure python-sounddevice pour créer un peu (non testé) script Python:

import sounddevice as sd 

def callback(indata, outdata, *stuff): 
    outdata[:] = indata * [1, 0.5] 

with sd.Stream(channels=2, callback=callback): 
    input() 

Ce script se déroulera jusqu'à ce que vous appuyez sur <Return> et cela réduira le volume du deuxième canal.

+0

Merci (+1), je ne savais pas à propos de python-sounddevice, semble prometteur –