Pure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法

Home  >>  My Exciting  >>  Pure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法

Pure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法

On 11月 9, 2015, Posted by , In My Exciting, By , With 1 Comment

はろー。
もーりです。

以前、「Pure Dataの拡張オブジェクト(C言語)に悪戦苦闘」という記事を書きましたが、ようやくPure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法にたどり着いたので紹介します♪

Pure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法

http://forum.pdpatchrepo.info/topic/967/problem-compiling-external-on-windows/5

上記サイトを参照にすることで実現できました。情報が英語なので、改めて紹介しようと思います。

1、「Microsoft Visual C++ Express Edition」を使ってPure Dataの拡張オブジェクトを実装

まず、「Microsoft Visual C++ Express Edition」をダウンロードしてきます。「Microsoft Visual C++ Express Edition」は、無料で利用できますよ。

https://www.visualstudio.com/ja-jp/products/visual-studio-express-vs.aspx

下の方にある「Express for Desktop」をダウンロードします。ダウンロードした「wdexpress_full.exe」を実行し、インストールを行ってください。
もーりの場合には、すでに「Microsoft Visual C++ 2012 Express Edition」をインストール済みのため、こちらを使用しますが、最新のものでも同様に操作できると思います。

https://www.microsoft.com/ja-jp/

上記URLにアクセスし、「visual studio 2015 update」など自分のバージョンで検索をします。
updateやService Packが出ていたら、ダウンロードし、ダウンロードした実行ファイルを実行し適用してください。

2、プロジェクトを作成

インストールした「Microsoft Visual C++ Express」を起動します。
起動後、「開始」の「新しいプロジェクト…」をクリックします。

新しいプロジェクト

「新しいプロジェクト」ウィザードが立ち上がるので、左側の[テンプレート]-[Visual C++]を選択する。
中央の[空のプロジェクト]を選択する。(ダイナミック リンク ライブラリ (DLL)を作成することになりますが、後ほど設定するので空のプロジェクトとして作成する)

下にある[場所]に今回のプロジェクトを保存する場所を指定する

下の[名前]と[ソリューション]に好きなプロジェクト名を入力する。今回のプロジェクトでは、いったん「helloworld」としましょう。

「新しいプロジェクト」ウィザード

3、「m_pd.h」を取得する

「m_pd.h」は、作成するプログラムからインクルードするために必要になる。
みなさんは、おそらく「pd-extended」をインストールされていると思います。このインストールフォルダの中にも「m_pd.h」がありますが、これではコンパイルでエラーになります。pd-vanilla版の「m_pd.h」が必要になります。

https://puredata.info/

上記URLにアクセスし、右側の[Pure Data]」をクリックします。

Pure Data

「Get Pure Data for Windows (7.9MB)」をクリックし、ファイルをダウンロードします。ダウンロードすると「pd-0.45-4.msw.zip」ファイルがダウンロードされるので、解凍します。解凍すると「pd」ができると思います。

Get Pure Data for Windows (7.9MB)

「pd」フォルダの中の「src」フォルダの中に「m_pd.h」があります。この「m_pd.h」をコピーし、先ほど作成したプロジェクトフォルダーの中の「helloworld」フォルダの中にペーストします。

右側にある[ソリューションエクスプローラー]の中の[ヘッダーファイル]で右クリックし、[追加]-[既存の項目]」をクリックします。
「m_pd.h」を選択し、[追加]をクリックする。

[追加]-[既存の項目]

4、「helloworld.c」を作成する

ここでは、pure dataでバングをクリックするとpdウィンドウに「Hello world !!」と表示されるもっともシンプルなオブジェクトをつくることとする。

[ソリューションエクスプローラー]の中の[ソースファイル]で右クリックし、[追加]-[新しい項目]」をクリックする。

新しい項目

[C++ファイル]を選択したまま、[名前]に「helloworld.c」と入力し、[追加]ボタンをクリックする。

新しい項目の追加

下記URLにアクセスする。

http://iem.at/pd/externals-HOWTO/pd-externals-HOWTOse2.html#x4-80002

一番下にある「2.6 the code: helloworld」のソースコードをコピーし、先ほど作成した「helloworld.c」ファイルにペーストし、保存する。

helloworld.c

このままでは、シンタックスエラーになる部分があるので修正する。「class_new」関数の最後の引数が、int型からt_atomtype型へ代入しようとしているためにエラーとなる。そこで、int型からt_atomtype型へ変換を行うことを指示するため、「0」の前に「(t_atomtype)」を付ける必要がある。

  class_new(gensym("helloworld"),
    (t_newmethod)helloworld_new,
    0, sizeof(t_helloworld),
    CLASS_DEFAULT, 0);

修正後の完全な形のコードを下に示す

#include "m_pd.h"

static t_class *helloworld_class;

typedef struct _helloworld {
  t_object  x_obj;
} t_helloworld;

void helloworld_bang(t_helloworld *x)
{
  post("Hello world !!");
}

void *helloworld_new(void)
{
  t_helloworld *x = (t_helloworld *)pd_new(helloworld_class);

  return (void *)x;
}

void helloworld_setup(void) {
  helloworld_class = class_new(gensym("helloworld"),
        (t_newmethod)helloworld_new,
        0, sizeof(t_helloworld),
        CLASS_DEFAULT, (t_atomtype)0);
  class_addbang(helloworld_class, helloworld_bang);
}

5、「pd.lib」をプロジェクトから参照させる。

「helloworld.c」の最初でインクルードした「m_pd.h」は、定義を含んでいません。実際の実装は、「pd.lib」にまかせます。
そこで、先ほどダウンロードしてきたpd-vanilla版の「pd」フォルダに移動し、「bin」フォルダの中の「pd.lib」をコピーし、適当な場所にペーストします。
もーりの場合、あとあとpd-vanilla版の「pd」を使う場面もあるかもしれないので、「pd」フォルダーごと適当な場所に移動しています。
(実際に必要なのは、「pd.lib」だけです。)

右側にある[ソリューションエクスプローラー]の中の[helloworld]で右クリックし、[プロパティ]をクリックします。

helloworldプロパティ

[helloworld プロパティ]ウィザードが立ち上がるので、左側の[構成プロパティ]-[リンカー]-[入力]を選択します。
右側の[追加の依存ファイル]に先ほど「pd.lib」を保存したPath(パス)を指定します。
指定するとき、[追加の依存ファイル]に入力されているものを消さずに、「pd.lib;」となるように「セミコロン」で区切って追加してください。
もーりの場合にはフルパスで指定しています。

5、プロジェクトの設定

引き続き[helloworld プロパティ]ウィザードで設定していきます。
左側の[構成プロパティ]-[全般]を選択します。
右側の[構成の種類]で「ダイナミック ライブラリ(.dll)」を選択します。

ダイナミック ライブラリ(.dll)

左側の[構成プロパティ]-[C/C++]-[プリプロセッサ]を選択します。
右側の[プリプロセッサの定義]に「MSW;」を追加します。

プリプロセッサの定義

左側の[構成プロパティ]-[C/C++]-[詳細設定]を選択します。
右側の[コンパイル言語の選択]に「Cコードとしてコンパイル(/TC)」を選択します。

コンパイル言語の選択

左側の[構成プロパティ]-[リンカー]-[コマンド ライン]を選択します。
右側の[追加オプション]に「/export:helloworld_setup」を入力します。
これは、「void helloworld_setup(void)」関数を公開するという意味のようですね。

コマンド ライン追加オプション

すべての設定が完了したので、[適用]ボタンをクリックし、[OK]ボタンをクリックします。

ソリューションのビルド

[ビルド]-[ソリューションのビルド]メニューをクリックする。

ソリューションのビルド

下の[出力]に下記が出力されていれば、成功です。

========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

pure dataで今回作成したhelloworld拡張オブジェクトを実際に使用する

「helloworld.c」などのソースコードが置かれているフォルダではなく、そこから一つ階層を上げたプロジェクトフォルダの中にある「Debug」フォルダに移動する。
「Debug」フォルダの中にある「helloworld.dll」をコピーし、pure dataでPlugin(プラグイン)を入れておくフォルダにペーストする。
もーりの場合、「\Documents\Pure Data\Plugins\○○」フォルダをつくりその中に入れています。

helloworld.dll

「pd-extended」を立ち上げます。(もちろん、pd-vanilla版でもかまいません。)
「helloworld.dll」をコピーしたフォルダを「pd-extended」に登録していない場合には、登録が必要になります。

[編集]-[環境設定]メニューをクリックします。

環境設定

[New]ボタンをクリックし、「helloworld.dll」をコピーしたフォルダを登録してください。
[適用]ボタンをクリックし、[OK]ボタンをクリックします。

Pluginフォルダ追加

[ファイル]-[新規](Ctrl+N)をクリックします。[配置]-[オブジェクトボックス](Ctrl+1)をクリックします。
「helloworld」と入力し、bangボタンを追加して、実行モードでbangボタンをクリックすると、pdウィンドウに「helloworld!!」と表示される。

helloworld

無事、Pure Dataの拡張オブジェクト(C言語)を作成し、実行できたでしょうか?
拡張オブジェクトを少しずつ作っていこうと思っています。

Love.
もーり

One Comment so far:

  1. […] 「Pure Dataの拡張オブジェクト(C言語)をWindowsで実現する方法」という記事を書いたので興味があれば、覗いてみてくださいね。 […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です