LoginSignup
15
15

More than 5 years have passed since last update.

Pure Data 紹介(導入からFFTまで)

Last updated at Posted at 2018-09-30

はじめに

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

本書は、インターネットラジオ(VLCメディアプレーヤー)の音声出力をFFT(高速フーリエ変換)して、LED表示した経験をもとに、Pure Data を紹介します。Pure Data のプログラムはつぎのようなイメージです。
image.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

PDウィンドウ

image.png

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~)
image.png

配置

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

水平スライダーのプロパティ

(1)水平スライダーを右クリックして Properties を選択します。
(2)OutputRange の Lower と Upper に、440 と 880 を入力します。
image.png

配列のプロパティ

(1)グラフ array1 を右クリックして Properties を選択します。
(2)Array の size に、441 を入力します。
(3)Draw as で Polygon にチェックします。
image.png

実行

(1)水平スライダーで周波数を指定し、スピーカーから出力します。
(2)トグルスイッチ ON で、リアルタイムで音声信号がグラフ表示されます。
(3)トグルスイッチ OFF で、その時点のグラフ表示が固定されます。

音がでないとき

(1)PDウィンドウの上部にある「DSP」にチェックを入れます。
(2)パッチ上部メニュー Media → Audio Settings で、音声設定ウィンドウを開き、
  Channels に「2」を設定します。
image.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

(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)

~/.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"
}

上記設定で、標準音声出力とスピーカーの接続が切れます。
スピーカを接続するには、つぎのいずれかを行います。
(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/
image.png

「pd fft」サブパッチ

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

image.png

「pd vuVal」サブパッチ(平均値の計算)

image.png

その他

パッチを拡大表示する

パッチウィンドウ上部メニュー 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

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15