はじめに
Pure Data(以降はPD と略記します。)は、サウンド処理用のビジュアルプログラミング環境です。
本書は、インターネットラジオ(VLCメディアプレーヤー)の音声出力をFFT(高速フーリエ変換)して、LED表示した経験をもとに、Pure Data を紹介します。Pure Data のプログラムはつぎのようなイメージです。
本書では、つぎの内容を記述しています。
- PDのメリットとデメリット
- PDのインストール
- Hello world(音声版を含む)
- サウンド・ループバック
- FFT(高速フーリエ変換)
- その他
PD のメリットとデメリット
メリット
- 視覚的にプログラミングでき、直感的で楽しい
- リアルタイム信号の波形表示が簡単にでき、実験とデバッグがしやすい
- 機能が豊富(ネットワーク通信、FFT等)
- マルチプラットフォーム(Win、Mac、ラズパイ)
デメリット
- 組み込みには向かない? あくまで実験用?
PD のインストール
OSが64bit版でも、PDは32bit版が安定しているようです。
使用したOSのバージョンとインストール方法をつぎに示します。
##Windows10
本家サイト http://puredata.info/downloads/pure-data よりダウンロードします。
Get Pure Data for Windows (8MB)
Installer for Microsoft Windows 32 bit version (XP or later)
##Mac OS X El Capitan 10.11.6
本家サイト http://puredata.info/downloads/pure-data よりダウンロードします。
Get Pure Data for Mac OS X (4MB)
Intel/32bit "i386" (works with older externals libraries)
##Raspberry Pi Raspbian GNU/Linux 9.3 (stretch)
つぎのコマンドでPDをインストールします。
sudo apt-get update
sudo apt-get install puredata
Hello world
プログラム(パッチウィンドウ)と実行結果(PDウィンドウ)を、つぎに示します。
##パッチウィンドウ
##Hello world のプログラミングと実行
(1)PDを起動すると「PDウィンドウ」が開きます。上部メニュー File → New で新しい「パッチウィンドウ」が開きます。 PDではプログラムをパッチと呼びます。
(2)パッチ上部メニュー Put → Message で、メッセージを配置し、キーボードより「Hello world」と入力します。
(3)パッチ上部メニュー Put → Object で、オブジェクトを配置し、キーボードより「print」と入力します。
(4)パッチ上で、メッセージとオブジェクトを結線します。
(5)パッチ上部メニュー Edit → Edit Mode で、エディットモードを解除します。
(6)パッチ上の「Hello world」メッセージをクリックすると「PDウィンドウ」に、「print: Hello world」が表示されます。
サウンド版 Hello world
サウンド版 Hello world として、指定した周波数の音を出すプログラムを作成します。
処理の流れはつぎのようになります。
(1)水平スライダーで音声周波数(Hz)を指定する
(2)発振器で音声データを生成する(osc~)
(3)音声データをスピーカに接続する(dac~)
(4)トグルスイッチでメトロノームの ON/OFF を指定する
(5)メトロノームで100ミリ秒毎の処理タイミングを生成する(metro)
(6)処理タイミング毎に音声データを配列に書き込み、グラフを表示する(tabwrite~)
##配置
各記号はパッチ上部メニュー「Put」からつぎのように選択して配置します。
水平スライダーは、「Hslider」
周波数は、「Number」
トグルスイッチは、「Toggle」
配列は、「Array」 (配列内容を表示するためのグラフがパッチ上に表示されます)
osc~、dac~、metro、tabwrite~ は、「Object」+ キー入力
##水平スライダーのプロパティ
(1)水平スライダーを右クリックして Properties を選択します。
(2)OutputRange の Lower と Upper に、440 と 880 を入力します。
##配列のプロパティ
(1)グラフ array1 を右クリックして Properties を選択します。
(2)Array の size に、441 を入力します。
(3)Draw as で Polygon にチェックします。
#実行
(1)水平スライダーで周波数を指定し、スピーカーから出力します。
(2)トグルスイッチ ON で、リアルタイムで音声信号がグラフ表示されます。
(3)トグルスイッチ OFF で、その時点のグラフ表示が固定されます。
#音がでないとき
(1)PDウィンドウの上部にある「DSP」にチェックを入れます。
(2)パッチ上部メニュー Media → Audio Settings で、音声設定ウィンドウを開き、
Channels に「2」を設定します。
#サウンド・ループバック
パソコンの標準出力音声をPDの入力にするには、サウンド・ループバックが必要です。
各OSでサウンド・ループバックを用意する方法が異なります。
##Windows10
「録音デバイス」の「ステレオミキサー」を有効にします。手順はつぎのサイトが参考になります。
Windows10でPCから出る音を録音 (ステレオミキサーを有効にする)
https://freesoft.tvbok.com/win10/general/stereo_mixer.html
##Mac
「kuwatec Audio Loopback」をインストールします。手順はつぎのサイトが参考になります。
音声の記録について Mac OSX 10.7 以降
http://www.kuwatec.co.jp/preflight/jp/man/contents/audiorec.html#osx7
##Raspberry Pi
(1)サウンド・ループバックの作成
$ modprobe snd-aloop pcm_substreams=2
手順はつぎのサイトが参考になります。
ALSAから出力された音声をpifmで再生する
https://ll0s0ll.wordpress.com/raspberrypi/alsa_to_pifm/
(2)ALSA の設定ファイル
ALSA(Advanced Linux Sound Architecture)の設定ファイル「~/.asoundrc 」をつぎの内容にして、音声入力と出力を複数アプリで使用できるようにします。
具体的には入力用と出力用にそれぞれミキサーを用意します。(dsnooped、dmixed)
# dsnooped allows multiple applications to use an input device (microphone)
# without dsnoop, devices are exclusive, and the mic can only be used by one app at a time.
pcm.dsnooped {
type dsnoop
ipc_key 5978293 # must be unique for all dmix plugins!!!!
ipc_key_add_uid yes
slave {
pcm {
format S16_LE
rate 48000
nonblock true
type hw
card Loopback
device 1
subdevice 0
}
channels 1
period_size 1024
buffer_size 8192
periods 0
period_time 0
}
}
pcm.dmixed {
type dmix
ipc_key_add_uid true
ipc_key 5678293
ipc_perm 0660
ipc_gid audio
slave {
channels 1
pcm {
format S16_LE
rate 48000
nonblock true
type hw
card Loopback
device 0
subdevice 0
}
period_size 1024
buffer_size 8192
}
}
# this 'combines' both input and optput devices into a single pseudo-device
pcm.asymd {
type asym
playback.pcm "dmixed"
capture.pcm "dsnooped"
}
# this sets the above combined device as the default input/output
pcm.!default {
type plug
slave.pcm "asymd"
}
上記設定で、標準音声出力とスピーカーの接続が切れます。
スピーカを接続するには、つぎのいずれかを行います。
(1)PD上で行う
PDパッチ上で「adc~」を「dac~」に接続します。
(2)OS上で行う
alsaloop -C dsnooped -P plughw:0,0 -c 1 -t 50000
負荷が高いと動作が不安定です。CPU使用率は50%程度までが良いようです。
#FFT(高速フーリエ変換)
メインパッチ
処理の流れはつぎのようになります。
(1)「adc~」オブジェクトで音声信号を受け取り、水平スライダーの値と積算し、レベルを調整します。
(2)FFT(高速フーリエ変換)を100msec毎に行う。FFT後の周波数グラフを表示する
(3)周波数成分を低音から高音まで4分割する
(4)4つのVUメータに各周波数成分を表示する
(5)VUメータの値をネットワークに送信する。通信プロトコルは、OSC(OpenSound Control)です。python で受信する場合は、つぎのサイトが参考になります。
python-osc 1.6.8
https://pypi.org/project/python-osc/
「pd fft」サブパッチ
処理の流れはつぎのようになります。
(1)ハミング関数を作成し、グラフ表示する
(2)音声信号とハミング関数を積算し、音声信号の両端をなめらかにゼロにする。
(3)FFT(高速フーリエ変換)を「rfft~」オブジェクトで行う
(4)単位を RMS から dB へ変換する (RMS:Root Mean Square、実効値)
「pd vuVal」サブパッチ(平均値の計算)
#その他
パッチを拡大表示する
パッチウィンドウ上部メニュー Edit → Font で、Font Size を「24」にする。デフォルトは「12」です。PDウィンドウの文字サイズは変更できないようです。
##オブジェクト位置を変更する
パッチ上のオブジェクトを「シフトキーを押しながらクリック」で選択する。その後に矢印キー(上下左右)で移動する。
#参考情報
Pure Data
https://ja.wikipedia.org/wiki/Pure_Data
Programming Electronic Music in Pd
http://www.pd-tutorial.com/english/index.html
Jeskola Buzz
https://ja.wikipedia.org/wiki/Jeskola_Buzz