Python-Sounddeviceでマルチチャネルから同時再生


この記事について

  • pythonのsounddeviceというモジュールを使ってマルチチャネル(3つ以上)から同時再生する方法を紹介します。
  • 音響関係の研究に使えると思います。

必要な機材

  • マルチチャネルDAC
    • 今回はMOTUの8AというDACを使いました。
  • PC
    • OSは基本的にはなんでも動くと思われます。(Windows,Ubuntuで確認済みです)

参考にした記事・サイト

インストール方法、初期設定、使い方などは以下の良記事を参考にしてください。

サンプルコード

コード内で説明します。今回は4つの異なる信号を4チャネルから同時再生させました。

import numpy as np
import sounddevice as sd

#デバイス番号の設定、今回はMOTU 8Aを選択した。
dev = 0 
#サンプリングレート, 192kHzまで可能らしいが安定しなかったため96kHzに
fs = 96000

#sounddevice の初期設定
sd.default.samplerate = fs
sd.default.device = dev

#使用するデバイスを確認
print("query devices")
print(sd.query_devices())

#信号を生成(例)
sec = 1 #信号長(秒)
A = 1 #振幅
f1 = 1000 #信号1の周波数
f2 = 2000 #信号2の周波数
f3 = 3000 #信号3の周波数
f4 = 4000 #信号4の周波数

#送信信号、今回は1kHzずつ離れた正弦波を作成
n = np.arange(fs*sec)
swav1 = A*np.sin(2*np.pi*f1*n/fs) #信号1
swav2 = A*np.sin(2*np.pi*f2*n/fs) #信号2
swav3 = A*np.sin(2*np.pi*f3*n/fs) #信号3
swav4 = A*np.sin(2*np.pi*f4*n/fs) #信号4

#4つの再生信号を結合させ、縦ベクトルになるように転置
sdata = np.array([swav1,swav2,swav3,swav4]).T

#再生開始
#引数は順番に(送信信号、サンプリングレート、送信信号の各列の出力チャネル番号、etc)
sd.play(sdata, fs, mapping = [1,2,3,4], blocking = True, loop = True)

補足

  • MOTU 8Aの公式ドキュメントによると最大サンプリングレートは192kHzとあったが設定すると異音が出た
  • 色々試してみたが安定するのは96kHzまでか(要検証)?
  • mappingは再生信号の1列目から順番に、DACの何番チャネルから出力するかを決定する引数
  • 再生信号の列数=mappingの個数、となるようにする
  • mappingの中の数字(チャネル番号)は1度しか使えない。[1,2,2,3]などにするとエラーとなる
  • 需要があるのか分からないが、気が向いたら課筆していく