Python-Sounddeviceでマルチチャネルから同時再生
この記事について
- pythonのsounddeviceというモジュールを使ってマルチチャネル(3つ以上)から同時再生する方法を紹介します。
- 音響関係の研究に使えると思います。
必要な機材
- マルチチャネルDAC
- 今回はMOTUの8AというDACを使いました。
- PC
- OSは基本的にはなんでも動くと思われます。(Windows,Ubuntuで確認済みです)
参考にした記事・サイト
- マルチチャネルDAC
- 今回はMOTUの8AというDACを使いました。
- PC
- OSは基本的にはなんでも動くと思われます。(Windows,Ubuntuで確認済みです)
参考にした記事・サイト
インストール方法、初期設定、使い方などは以下の良記事を参考にしてください。
- Python-Sounddevice ASIOで使える音響信号処理モジュール[基本編]
- Python-Sounddevice ASIOで使える音響信号処理モジュール[応用編]
- 歪み率・周波数特性測定向けオーディオ信号発生の自動化(Python-Sounddevice)
- 公式ドキュメント
サンプルコード
コード内で説明します。今回は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]などにするとエラーとなる
- 需要があるのか分からないが、気が向いたら課筆していく
Author And Source
この問題について(Python-Sounddeviceでマルチチャネルから同時再生), 我々は、より多くの情報をここで見つけました https://qiita.com/f_world/items/2e36a9388cb3e6456c7b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .