Pure Data 紹介（導入からFFTまで）

# はじめに

Pure Data（以降はPD と略記します。）は、サウンド処理用のビジュアルプログラミング環境です。


本書は、インターネットラジオ（VLCメディアプレーヤー）の音声出力をFFT（高速フーリエ変換）して、LED表示した経験をもとに、Pure Data を紹介します。Pure Data のプログラムはつぎのようなイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/3c00b062-c50c-7a98-2411-53a2ba4f23d6.png)


本書では、つぎの内容を記述しています。

- 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ウィンドウ）を、つぎに示します。
##パッチウィンドウ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/e2711fd2-3797-07da-d31e-335f000e9e2e.png)

##PDウィンドウ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/453add79-d4db-24b1-86a0-72ffe04c871c.png)

##Hello world のプログラミングと実行
（１）PDを起動すると「PDウィンドウ」が開きます。上部メニュー File → New で新しい「パッチウィンドウ」が開きます。 PDではプログラムをパッチと呼びます。
（２）パッチ上部メニュー Put → Message で、メッセージを配置し、キーボードより「Hello world」と入力します。
（３）パッチ上部メニュー Put → Object で、オブジェクトを配置し、キーボードより「print」と入力します。
（４）パッチ上で、メッセージとオブジェクトを結線します。
（５）パッチ上部メニュー Edit → Edit Mode で、エディットモードを解除します。
（６）パッチ上の「Hello world」メッセージをクリックすると「PDウィンドウ」に、「print: Hello world」が表示されます。



# サウンド版 Hello world

サウンド版 Hello world として、指定した周波数の音を出すプログラムを作成します。
処理の流れはつぎのようになります。
（１）水平スライダーで音声周波数（Hz）を指定する
（２）発振器で音声データを生成する（osc~）
（３）音声データをスピーカに接続する（dac~）
（４）トグルスイッチでメトロノームの ON/OFF を指定する
（５）メトロノームで100ミリ秒毎の処理タイミングを生成する（metro）
（６）処理タイミング毎に音声データを配列に書き込み、グラフを表示する（tabwrite~）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/5e1aef7d-9b19-2cc1-9139-fb9959aea2e6.png)


##配置
各記号はパッチ上部メニュー「Put」からつぎのように選択して配置します。
水平スライダーは、「Hslider」
周波数は、「Number」
トグルスイッチは、「Toggle」
配列は、「Array」 (配列内容を表示するためのグラフがパッチ上に表示されます)
osc~、dac~、metro、tabwrite~ は、「Object」＋　キー入力


##水平スライダーのプロパティ 
（１）水平スライダーを右クリックして Properties を選択します。
（２）OutputRange の Lower と Upper に、440 と 880 を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/a4d4372f-a4f6-9ba1-9436-74d86ca8f8c7.png)

##配列のプロパティ
（１）グラフ array1 を右クリックして Properties を選択します。
（２）Array の size に、441 を入力します。
（３）Draw as で Polygon にチェックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/1a9f3fe7-afca-69f9-1a46-a8562e27fb1f.png)

#実行
（１）水平スライダーで周波数を指定し、スピーカーから出力します。
（２）トグルスイッチ ON で、リアルタイムで音声信号がグラフ表示されます。
（３）トグルスイッチ OFF で、その時点のグラフ表示が固定されます。

#音がでないとき
（１）PDウィンドウの上部にある「DSP」にチェックを入れます。
（２）パッチ上部メニュー Media → Audio Settings で、音声設定ウィンドウを開き、
　　Channels に「２」を設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/013ecca5-fc55-3254-307a-d89ffa753095.png)

#サウンド・ループバック
パソコンの標準出力音声を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
（１）サウンド・ループバックの作成
$ modprobe snd-aloop pcm_substreams=2
手順はつぎのサイトが参考になります。

ALSAから出力された音声をpifmで再生する
https://ll0s0ll.wordpress.com/raspberrypi/alsa_to_pifm/

（２）ALSA の設定ファイル
ALSA（Advanced Linux Sound Architecture）の設定ファイル「~/.asoundrc 」をつぎの内容にして、音声入力と出力を複数アプリで使用できるようにします。
具体的には入力用と出力用にそれぞれミキサーを用意します。（dsnooped、dmixed）

```:~/.asoundrc
# 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"
}
```
上記設定で、標準音声出力とスピーカーの接続が切れます。
スピーカを接続するには、つぎのいずれかを行います。
（１）PD上で行う
　PDパッチ上で「adc~」を「dac~」に接続します。
（２）OS上で行う
alsaloop -C dsnooped -P plughw:0,0 -c 1 -t 50000
負荷が高いと動作が不安定です。CPU使用率は50％程度までが良いようです。


#FFT（高速フーリエ変換）


## メインパッチ
処理の流れはつぎのようになります。
（１）「adc~」オブジェクトで音声信号を受け取り、水平スライダーの値と積算し、レベルを調整します。
（２）FFT（高速フーリエ変換）を100msec毎に行う。FFT後の周波数グラフを表示する
（３）周波数成分を低音から高音まで４分割する
（４）４つのVUメータに各周波数成分を表示する
（５）VUメータの値をネットワークに送信する。通信プロトコルは、OSC(OpenSound Control）です。python で受信する場合は、つぎのサイトが参考になります。

python-osc 1.6.8
https://pypi.org/project/python-osc/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/3c00b062-c50c-7a98-2411-53a2ba4f23d6.png)


## 「pd fft」サブパッチ
処理の流れはつぎのようになります。
（１）ハミング関数を作成し、グラフ表示する
（２）音声信号とハミング関数を積算し、音声信号の両端をなめらかにゼロにする。
（３）FFT（高速フーリエ変換）を「rfft~」オブジェクトで行う
（４）単位を RMS から dB へ変換する　（RMS:Root Mean Square、実効値）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/b09aa645-38d4-4e00-4f14-b64e52866746.png)



## 「pd vuVal」サブパッチ（平均値の計算）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78212/7f053cc3-11f5-1615-fa78-b7410b591378.png)



#その他
## パッチを拡大表示する
パッチウィンドウ上部メニュー Edit → Font で、Font Size を「２４」にする。デフォルトは「１２」です。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