りんご 小麦粉 バター

舞台照明とポストドラマ演劇とアップルパイとクィア障害学

マイク入力の音量に応じてsACNのDMXレベルを変化させる

マイクに入力された音量に応じてsACNのDMXレベルを変化させるスクリプトを書きました。

動いている様子はこんな感じ。

音声の入力には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)