Pdのexternalsをつくる（Helloworld）

# はじめに
## Pdが好き
自分は音や光をつかったインタラクティブな作品を制作しています。ここ10年ほどは、タッチセンサを組み合わせて「触れると音を奏でる」というインタラクションをよく取り入れています。この「音」の音色は全て電子回路を用いたデジタルなものです。

15年ほど前の記憶ですが、メディア・アート作品を応募しアーティストが講評するテレビ番組で、MIDI音源をつかったオリジナル電子楽器をつくった方に、あるアーティストが「MIDI音源の音色は誰かが作ったものだから、完全なオリジナルではないよね」というようなコメントがありました。細かい言い回しはうろ覚えですが、それをきっかけに自分の中に「そうだよね、オリジナルの音色にしなきゃだよ」と、音色にこだわる気持ちが芽生えて、ずっと頭に残っています。

考えてみると、バイオリンやピアノなどアナログ楽器は、物理的な素材や原理から、必然的に固有の音色があって唯一無二の魅力があるのでしょう。それならば自分の作品でも、作品のたたずまいやイメージにあう音色を、自由自在に微調整しながらつくりたい。でも、どうしたらいいのか？

現時点でたどり着いたのが、音響合成ソフトの「PureData(Pd)」です。

## Pdとは
1990年代にミラー・パケットいう方がある音楽家のコンサートのために開発したソフトで、その後オープンソースとなって現在もバージョンアップされています。現在「Max」という名前で販売されているソフトは、もともとパケットさんが作っていたそうで、徐々にたくさんの便利な機能が増えてきました。「Pd」を使っていて感じるのは、何より音のことを最優先していて、音が遅延したりノイズが乗ったりしないように、最小限の機能に絞られていることです。顕著なのは、オブジェクトを結ぶ線が直線のみというところでしょうか。しかしPdはオープンソースなので、便利な機能が詰まった「Pd-extended」という別系統のPdも有志によって開発されていましたが現在は開発停止しています（<strong>※Pd-extendedをフォークしたPurrDataがありました</strong>）。ちなみに別系統のPdと区別するため、パケットさんの「Pd」は「Pd-Vanilla」とも呼ばれています（プレーンなバニラの意味）。この「Pd-Vanilla」は、さすが音がよく、しかも無料で、コンパクトなのでRaspberryPiでも十分に動作します。

<strong> ※ PurrDataはバージョンアップしていたので修正しました（2020.10.30）</strong>
https://www.youtube.com/watch?v=DVU-tz8Wxl4


## Pdの機能拡張-externals-
でも最小限の「Pd-Vanilla」だけでは正直なところ使いにくさも感じます。その場合は「Pd-extended」などに入っていた機能拡張（externalsといいます）を「Pd-Vanilla」に個別にインストールして使っています。externalsの定番なものは、現在もバージョンアップされています。そして「Pd-Vanilla」側もバージョン0.47.0以降、そのexternalsインストールがしやすくなったので、そのような使い方を想定しているのかなと思います。

## externalsを自分でつくってみよう
ところがそのexternalsの中にもバージョンアップされなくなったものが出てきました。このままだと近い未来、ハードやOSやPdがバージョンアップするのにexternalsが追いついてこなくなって、作品が動かなくなることが考えられます。そこで、自分で作る方法を知っておこうと思いました。

---
# 情報収集
## 書籍  「Pure Data -チュートリアル&リファレンス- 美山千香士」
Pdで有名な美山千香士さんの書籍があって、基本的な使い方からexternalsの開発方法まで載っているとてもよい本です。個人的なバイブルですが現在は出版がなく入手困難です。また入手できたとしても、2013年版なのでサンプルデータがダウンロードできなくかったり、本野中の古い内容を自分の中で読みかえる必要があります。でも、日本語で丁寧に解説されている貴重な資料です。

## Github 「externals-howto」
https://github.com/pure-data/externals-howto
美山さんの書籍の頃にはなかった「pd-lib-builder」があって、これを使うと便利です。macOSしか確認していませんが開発ソフト「Xcode」は不要です。個人的にXcodeが重すぎてインストールを躊躇していたので、これだけでもありがたいです。

## 参考になるサイト
https://marui.hatenablog.com/entry/2016/08/15/152214

ということで、この情報をもとに少しずつ解説していきます。

---
# 手順
## ダウンロード
![スクリーンショット 2020-10-28 9.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/c502eaf4-efc5-06c0-2858-0e02c0a03757.png)
<a href = "https://github.com/pure-data/externals-howto/tree/master/pd-lib-builder">externals-howto</a>
<a href = "https://github.com/pure-data/pure-data">pure-data</a>

 「pure-data」と「externals-howto」を必ず同じフォルダに入れてください。

「externals-howto」だけダウンロードすると、プログラムでインクルードする「m_pd.h」ファイルが見つからず、エラーになります。すでにPdをインストールしている場合はそのアプリケーションのフォルダ内にも「m_pd.h」が存在するので、そこまでのパスに書き換えればエラーはなくなります。でも少し面倒なことと、古いPdをインストールしていた場合、せっかく新しくexternalsを作ろうとしているのに、古い「m_pd.h」を読みにいくことになるので、Githubから最新の「pure-data」のソースもダウンロードすることにしました。

## externals-howtoのサンプルたち

「externals-howto」の中には「example1」〜「example4」までのサンプルが入っています。

- example1 ... bangを送るとPdウィンドウにメッセージを表示するhelloworld
- example2 ... bangを送るとカウントアップするcounter
- example3 ... inletパラメータのあるcounter
- example4 ... チルダオブジェクトpan~

## example1でコンパイルを確認
### ターミナルを起動し「example1」フォルダに移動する
![スクリーンショット 2020-10-28 9.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/dd45305d-5e2c-2d7f-d20c-110b3eb284ea.png)
ターミナルが起動したら「cd半角スペース」と打ち込んで、externals-howtoの中の「example1」フォルダをターミナルのウィンドウにドラッグ＆ドロップすると楽です。
![スクリーンショット 2020-10-28 9.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/5fcd008f-02e4-a2f6-db50-5979491370b2.png)
ターミナルに「example1」までのパスが入るので、Enterキーで確定します。

![スクリーンショット 2020-10-28 9.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/1f643d97-0fbf-e6b7-ca0c-6936b3ec5d33.png)

example1フォルダに移動しました。


### make
```
make
```
![スクリーンショット 2020-10-28 9.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/6ef8c213-b531-8689-cbaa-c055badbdf8e.png)
ここで「make」と入力しEnterキーをおすと、helloworld.cがコンパイルされます。コンパイルされるだけでまだファイルは生成されません。

### make install
```
make install
```
![スクリーンショット 2020-10-28 9.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/f6ccceef-5104-0bb1-3658-d7aaf2f01f14.png)
次に「make半角スペースinstall」と入力しEnterキーをおすと、コンパイルされていたファイルがインストールされます。これでexternalsはできあがりました。

## 作ったexternalsを使う
Pdは通常は起動時にexterlansを読み込むことで使えるようになります。しかしこの方法は面倒です。externalsまでのパスをPdに登録し、いったんPdを終了させ、再びPdを起動させると、そのタイミングで初めて新しいexnerlansが読み込まれて、使えるようになります。

今回はトライ＆エラーしながら素早く使いたいのですが、そんな時はexternalsと同じフォルダにPdファイルを作ることで、そのファイルからだけexternalsが使えるようになります。

### 同じフォルダにPdファイルを作る
![スクリーンショット 2020-10-28 9.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/89cca327-5728-f196-c37c-40fc5da63230.png)
Pdを起動して「test.pd」という名前で空っぽのファイルを保存しました。この「test.pd」から実際にexternalsを使ってみます。

### 「helloworld」の動作確認
![スクリーンショット 2020-10-28 10.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668579/c01e906b-8adf-0121-55dc-836d72945a5b.png)
オブジェクトの名前は「helloworld」で、左にinletが1つあります。ここにボタンをつなぐことができます。そしてボタンを押すと、Pdウィンドウに「Hello world!!」と表示されます。

これでexternalsの書き出し、Pdでの動作が確認できました。

---

次はプログラムの中をじっくり見ていきたいと思います。