マイク入力の音量に応じてsACNのDMXレベルを変化させる
マイクに入力された音量に応じてsACNのDMXレベルを変化させるスクリプトを書きました。
動いている様子はこんな感じ。
sACNだと28fpsくらい。思ったよりいい。 pic.twitter.com/XuGvfkH6EU
— Yuta Minakawa (@YutaMinakawa) March 15, 2020
音声の入力にはsounddevice、sACNの出力にはsACNのライブラリを使っています。sounddeviceは昔のpyaudioに比べて格段に使いやすくなってます。作ってくれた人に感謝。波形のデータがnumpyのアレイとして返ってくるので加工が楽だし速い(気がする)。
github.com
github.com
コードはこんな感じ。デフォルトのマイク入力から音声を入力して、その音量に応じてsACNのユニバース1のアドレス1を変化させています。
sd.recがけっこう時間かかって毎回やってると速度が出ないので10秒分まとめてやって、録音の進み具合に合わせて処理も進めています。録音が間に合ってるかどうかは値が0.0より大きいかどうかで判定してるので、ノイズが入ってること前提。
コード上では40fpsで動くはずだけどsACN Viewで見てみると28fpsくらい。
import sounddevice as sd import numpy as np import time import sacn fs = 48000 sender = sacn.sACNsender() sender.bind_port = 5564 sender.start() sender.activate_output(1) sender[1].multicast = True rms = 0 while 1==1: data = sd.rec(int(480000), samplerate=fs, channels=1)#10秒分一気に for cnt in range(400): while 0.0 == data[((cnt + 1) * 1200) - 1]:#録音が追いつくまで待つ time.sleep(0.0001) rms = np.abs(data[cnt*1200: (cnt+1)*1200]).mean()#RMSを計算 if rms > 1:#クリップ対策 rms = 1 sender[1].dmx_data = (int(float(rms)*255), 0, 0)#送信 print (rms)