25
作成 作成 P i 3 Practice 3 HARK グルHARK グル 武田 開発環境について OS: Ubuntu 10.04, etc… Editor: 任意(推奨 emacs, vi, eclipse) コンパイラ: gcc (主に g++) デバ db および そのフロントエンド(任意) デバ: gdb およびそのフロントエンド(任意)

HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

ノ ド 作成ノードの作成P i 3Practice 3

HARK グループHARK グル プ

武田 龍

開発環境について開発環境

OS: Ubuntu 10.04, etc…

Editor: 任意(推奨 emacs, vi, eclipse)d to 任意(推奨 e acs, , ec pse)

コンパイラ: gcc (主に g++)

デバ ガ db および そのフロントエンド(任意) デバッガ: gdb および、そのフロントエンド(任意)

Page 2: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

目次目次

前半 HARK ジ 説明前半:HARK モジュールの説明 FlowDesigner (FD) 用ソースファイルのフ FlowDesigner (FD) 用ソ スファイルのフォーマット概要を説明

後半:実際にモジュールを作成ソ スは途中までは作成済みで 穴埋め ソースは途中までは作成済みで、穴埋め・コンパイルを行う

HARK モジュール:ChannelSelector の説明

Page 3: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

その前に:準備そ 前 準備

ターミナル・エディタの起動タ ミナル エディタの起動

アプリケーション → アクセサリ → 端末

ディレクトリの移動

% cd ~/practice3/hark-dev/% cd /practice3/hark-dev/

エディタの立ち上げ

% emacs <FILENAME> &

or メモ帳 like % gedit <FILENAME> &or メモ帳 like % gedit <FILENAME> &

Flowdesigner の立ち上げg% flowdesigner &

その他そ 他

注意点:注意点:

書き込み・実行属性付与

% sudo chmodchmod ++wxwx <FILENAME><FILENAME>

具体的には具体的には具体的には具体的には

% % sudosudo chmodchmod 777 777 ––R *R *

管理者権限実行

%% sudosudo make installmake install%% sudosudo make installmake install

ウィンドウ切り替え

Alt + TabAlt + Tab

Page 4: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

ChannelSelector モジュールとはジM次元

M次元

Channel

Data1[0] Data1[1] …

Data2[0] Data2[1] …Data2[0] Data2[1] …

N次 K・

Selector

DataN[0] DataN[1] …DataN[0] DataN[1] …

次元

K次元

・・・

・・・

Data1 のデータ列はいらない

N*M Matrix K*M Matrix

[Data2 Data3 DataN]

デ デ

Data1 のデ タ列はいらない[Data2 Data3 … DataN]

チャンネル指定ベクトル(次元 K)

入力データ(行列形式)から不要なデータ(行)をのぞいて出力(行列形式)

必要なマイクチャンネルだけを取り出す時に利用

ChannelSelector のFD上の仕様仕様

機能

入力から必要なチャンネルのみを取り出して出力

仕様 仕様

入力: INPUT型 N*M次元 M t i <fl t>型: N*M次元 Matrix<float>

出力: OUTPUT型 * 次元 f型: K*M次元 Matrix<float>

パラメータ: SELECTOR

型: K次元 Vector<int>

必要なチャンネル番号(行番号). サイズが出力チャンネル数.

型は基本的に Flowdesigner内 で定義されたもの

Page 5: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

モジュール作成:通常のプログラムと異なる点

ジ 実装 モジュールクラスの実装 (通常)BufferedNode クラスを継承

コンストラクタ・calculate メソッドの実装 Flowdesigner は calculate を呼び出し実行

入出力ノードのオブジェクト取得(addInput,addOutput, getInput メソッド),モジュールパラメータの取得

FD で定義された型(クラス)の利用(Matrixなど).Matrix.h, Vector.h, Map.h 等をインクルードする.

DECLARE_NODE の記述 Flowdesigner モジュールの入出力ノード・パラメータのg宣言

モジュールクラスのイメージジ クラ イ ジ

BufferedNode Node クラス(親クラス)

ChannelSelector クラス

! データの ! デ タのBufferedNode, Node クラス(親クラス)

addInput メソッド addOutput メソッド

tI t メソ ド Buffer 領域

! デ タの入口を作る

! データの出口を作る

inputgetInput メソッド

calculate メソッド outputs[count]

Buffer 領域

INPUT OUTPUT

calculate メソッド(再定義)

input output! コア処理

! データを引っ張ってくる ! 格納場所から

出力するデータへポインタを張るp pア処理

SELECTOR

コンストラクタ

ポインタを張る

SELECTORt メソ ド

引数: params(= parameters)

コンストラクタ

! パラメータを取ってくる

ParameterSet クラス

SELECTORget メソッド

Page 6: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

DECLARE NODE とは_ Flowdesigner 上で表示されるコンポーネント情報.以下を記述する以下を記述する. 入力ポート名, その型

出力ポート名 その型 出力ポート名, その型

モジュールのパラメータとその型, デフォルト値(任意)

性質 性質 プログラムのソースに記述する

モジュールのポート接続の際の簡易型チェックに利用 モジュ ルのポ ト接続の際の簡易型チェックに利用

ChannelSelector の処理の流れ処 流れ

• パラメータ: SELECTORの取得初期化

ラメ タ: SELECTORの取得• 入力ポート:INPUT のID取得(addInput)• 出力ポート:OUTPUT のID取得(addOutput)

初期化(コンストラクタで処理)

• 入力オブジェクト: input の取得(getInput)• 出力オブジェクト: output の生成(new)出力オブジェクト: output の生成(new)

コア処理• エラー等のチェック(説明は省略)

calculate メソッドに記述

• エラ 等のチェック(説明は省略)

• SELECTOR で指定されたチャンネルSELECTOR で指定されたチャンネルの値を input から output にコピー

output(i,*) = input(selector[i],*);

Page 7: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

ソ スファイル Ch lS l t のソースファイル ChannelSelector.cc の説明

ChannelSelector.cc をエディタで開いてくださいてください

% cd ~/practice3/hark-fd

% emacs ChannelSelector.cc &

or % gedit ChannelSelector.cc &

ChannelSelector: Source 1 必要なヘッダファイルをインクルード

定 BufferedNode, Buffer, Vector, Matrix は Flowdeigner で定義されたクラス.該当クラスを使用する場合にインクルード.

Namespace FD を宣言 Namespace FD を宣言/** Copyright 2008 Kyoto University and Honda Motor Co.,Ltd.* All rights reserved* All rights reserved.* HARK was developed by researchers in Okuno Laboratory* at the Kyoto University and Honda Research Institute Japan Co.,Ltd.*/

#include <iostream>#include "BufferedNode.h"#include "Buffer.h"#include "Vector h"

ヘッダーファイルをインクルード#include Vector.h#include "Matrix.h"#include <math.h>#include <assert.h>

Namespace を宣言using namespace std;using namespace FD;

Namespace を宣言.FD は “F”low “D”esigner の名前空間.

Page 8: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

ChannelSelector: Source 2 Flowdesigner ノード宣言(必須)

複数ある場合はその分だけ追加記述(ノ ド名以外) 複数ある場合はその分だけ追加記述(ノード名以外)class ChannelSelector;DECLARE_NODE(ChannelSelector);/*Node** @name ChannelSelector* @category HARK:MISC

ノード名とカテゴリ名の記述,コメント

* @description Select specified channels from multi-channel windowed PCM.** @input_name INPUT* @input_type Matrix<float>

入力ポート(名前+型)の記述,コメント

* @input_description Multi-channel windowed PCM.** @output_name OUTPUT* @output_type Matrix<float>

出力ポート(名前+型)の記述,コメント

* @output_description Multi-channel windowed PCM consisting of selected channel in the inputs.** @parameter_name SELECTOR* @parameter_type <Vector<int> >

パラメータ(名前+型)の記述,コメント

* @parameter_description Channel selection setting which is …*END*/

ChannelSelector: Source 3 クラス定義,コンストラクタ

B ff dN d を継承 ジ パラメ タの取得 BufferedNode を継承,モジュールパラメータの取得

class ChannelSelector : public BufferedNode {int inputID; BufferedNode の継承int inputID;int outputID;Vector<int> selector;int num_chan;int length;

入出力ポートのID(Key) とモジュールパラメータ用の変数

BufferedNode の継承

int length;

public:ChannelSelector(string nodeName, ParameterSet params)

: BufferedNode(nodeName params)

モジュールパラメータ用の変数

: BufferedNode(nodeName, params){

inputID = addInput("INPUT");outputID = addOutput("OUTPUT");

IDの取得.引数の文字列はDECLARE_NODEに

記述したものと同一にする.

selector = object_cast<Vector<int> >(parameters.get("SELECTOR"));

inOrder = true;

記述したものと同 にする.

モジ ルパラメ タ用のオブジ クトを取得 型キ スト

スペースが必要

inOrder = true;}

モジュールパラメータ用のオブジェクトを取得.型キャスト.parameters = params とほぼ同じ(親クラスのメンバ変数)

Page 9: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

ChannelSelector: Source 4 calculate メソッドをオーバーライド

void calculate(int output_id, int count, Buffer &out) {RCPtr<Matrix<float> > input = getInput(inputID, count);

入力オブジ ク 取得スペ スが必要

RCPtr<Matrix<float> > output(new Matrix<float>(selector size()

getInput で入力オブジェクトの取得.Flowdesigner 用ポインタに代入.スペースが必要

スペースが必要

RCPtr<Matrix<float> > output(new Matrix<float>(selector.size(),input->ncols()));

(*(outputs[outputID].buffer))[count] = output;

出力オブジェクト(Matrix<float>)を生成 ポインタに代入

/* 中略 */for (int c = 0; c < selector.size(); c++) {

for (int j = 0; j < length; j++) {

出力オブジェクト(Matrix<float>)を生成.ポインタに代入.出力ポートのバッファに代入.

for (int j = 0; j < length; j++) {(*output)(c, j) = (*input)(selector[c], j);

}}

}ChannelSelector のコア処理.

必要な ネ だけ抜き出し ピ}};

必要なチャンネルだけ抜き出してコピー.

補足:DECLARE NODE補足 _

@input_type, @output_type, @parameter_type の種類@ p _ yp @ p _ yp @p _ yp単純型: int, float, bool

文字列: String

配列 Vector<T> Tは単純型,ソースに #include “Vector.h” が必要

V t d bl e.g Vector<double>

行列 Matrix<T> Tは単純型 ソースに #include “Matrix h” が必要 Tは単純型, ソースに #include “Matrix.h” が必要

e.g Matrix<float>

Map 型 Map<KEY,VALUE> p 型 p , #include “Map.h” が必要

e.g Map<String, int> KEYとVALUEのmapping

Page 10: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

補足:実装 (skip)補足 実装 ( p) RCPtr

Flowdesigner 用オブジェクトのスマートポインタ Flowdesigner 用オブジェクトのスマートポインタ getInput/Output で取得したオブジェクトを扱う

calculate 引数の out calculate 引数の out 出力が1つしかない場合に使用 out[count] はoutputs[outputID].buffer))[count] と同義[ ] p [ p ] ))[ ]

calculate 引数の count 基本的に Flowdesigner上で calculate が実行された

数g

回数 inOrder = true; とすると,calculate が呼び出される毎に count が順にインクリメント(count=0 1 2 3 4 )さに count が順にインクリメント(count=0,1,2,3,4,…)されていく.

1ループ前(今 count ループ目とする)データが欲しい前(今 目 する)デ タ 欲場合は getInput(ID, count-1) とすればよい

補足:その他 (skip)補足 そ 他 ( p)

上 ジ 間 線が赤色Flowdesigner 上でモジュール間の線が赤色

入出力の型が不一致が原因

コンストラクタの parameters ってなに

Node クラスのメンバ変数 params で初期化される Node クラスのメンバ変数.params で初期化される.

DECLRARE_NODE, @parameter におけるデフォルト値の設定フォルト値の設定

@parameter_value の後に記述

例: @parameter_type float

@parameter_value -20.0

Page 11: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

実装: ChannelSelector の改造

~ChannelSelector2 の作成~変更箇所を一通り説明その後実装

% emacs ChannelSelector2 cc &% emacs ChannelSelector2.cc &

or % gedit ChannelSelector2.cc &

ChannelSelector2 の実装実装

ゲインを変更する ChannelSelector: 仕様ゲインを変更する ChannelSelector: 仕様入力入力: 1入力: INPUT: Matrix<float>出力出力: 1出力: OUTPUT: Matrix<float>出力出力: 1出力: OUTPUT: Matrix<float>パラメータパラメータ: SELECTOR: Vector<int>ゲイン(GAIN): Vector<float> ここ変更ゲイン(GAIN): Vector<float>処理イメージ: OUTPUT[i] = INPUT[ SELECTOR[i] ]

* GAIN[i]

ここ変更

GAIN[i]

ファイル ChannelSelector2.cc モジュ ル群 HARK TEST に追加 モジュール群 HARK_TEST に追加

ノード名は ChannelSelector2 とする

ChannelSelector2 cc sample は完成済み ChannelSelector2.cc.sample は完成済み

Page 12: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

とりあえずの実行りあ ず 実行

完成ChannelSelector2.cc.sample は完成したファイル.

できなかった場合に利用.

% cp ChannelSelector2 cc sample ChannelSelector2 cc% cp ChannelSelector2.cc.sample ChannelSelector2.cc

% ./configure --prefix=/usr

% make

% sudo make install

% flowdesigner net_tutorial3.n

ChannelSelector2 の処理の流れ処 流れ• パラメータ: SELECTORの取得•• パラメータ:パラメータ: GAINGAIN の取得の取得 初期化パラメ タ:パラメ タ: GAIN GAIN の取得の取得• 入力ポート:INPUT のID取得(addInput)• 出力ポート:OUTPUT のID取得(addOutput)

初期化(コンストラクタで処理)

• 入力オブジェクト: input の取得(getInput)• 出力オブジェクト: output の生成(new)出力オブジェクト: output の生成(new)

コア処理• エラー等のチェック(説明は省略)

calculateメソッドに記述

• エラ 等のチェック(説明は省略)

• SELECTOR で指定されたチャンネルの値をSELECTOR で指定されたチャンネルの値をinput から output にコピー

•• ただし,ただし,GAIN[GAIN[ii] ] の値を掛けるの値を掛けるoutput(output(ii *) = input(selector[*) = input(selector[ii] *) * GAIN[] *) * GAIN[ii];];

追加部分output(output(ii, ) = input(selector[, ) = input(selector[ii], ) GAIN[], ) GAIN[ii];];

Page 13: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Step1: DECLARE_NODEp _class ChannelSelector2;DECLARE_NODE(ChannelSelector2);/*Node** @name ChannelSelector2* @category HARK_DEV:misc* @description Select some channels from windowed PCM and change their gains.** @input_name INPUT* @input_type Matrix<float>* @input_description Multi-channel windowed PCM.** @output_name OUTPUT* @output_type Matrix<float>* @output_description Selected channel of windowed PCM.** @parameter_name SELECTOR* @parameter_type Vector<int>* @parameter_description Flags for channel selection** @parameter_name GAIN* @parameter_type Vector<float>* @ d i i G i f l d h l E l V fl 1 0 1 0 1 0

新たなパラメータ「GAIN」を追加

* @parameter_description Gains for selected channels. Example, <Vector<float> 1.0 1.0 1.0>.*END*/

Step2: コンストラクタp ラクタ

クラス定義,コンストラクタ

パラメータ GAIN を取得する処理を追加

class ChannelSelector2 : public BufferedNode {i t i tIDint inputID;int outputID;Vector<int> selector;Vector<float> gain;i t h

GAIN を格納する変数を宣言

int num_chan;int length;

public:Ch lS l t 2( t i d N P t S t )ChannelSelector2(string nodeName, ParameterSet params)

: BufferedNode(nodeName, params){

inputID = addInput("INPUT");t tID ddO t t("OUTPUT")outputID = addOutput("OUTPUT");

selector = object_cast<Vector<int> >(parameters.get("SELECTOR"));gain = object_cast<Vector<float> >(parameters.get("GAIN"));

inOrder = true;}

GAIN パラメータを取得.(すでに追加済み)

Page 14: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Step3: calculate メソッドp ソッ

calculate メソッドをオーバーライド

ゲインを掛ける処理を追加.

void calculate(int output_id, int count, Buffer &out) {RCPtr<Matrix<float> > input = getInput(inputID, count);RCPtr<Matrix<float> > output(new Matrix<float>(selector.size(),

input->ncols()));(*(outputs[outputID].buffer))[count] = output;

/* 中略 */

for (int c = 0; c < selector.size(); c++) {for (int j = 0; j < length; j++) {

(*output)(c, j) = (*input)(selector[c], j) * gain[c];}

}}

};出力を gain[c] 倍する.Selector は出力すべきチャネル番号が格納されている.

モジュールの確認ジ 確認

コンパイルとインストール

% ./configure --prefix=/usr/% make パスワード聞かれた場合は% sudosudo make install

モジュールの確認

パスワ ド聞かれた場合はharkuser とタイプ

モジュ ルの確認 HARK_TEST 以下に ChannelSelector2 が出現

Page 15: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

実装してください

質問はTA等にお聞きください

ある程度時間が経ったら,モジ ルのテストネ トワ クモジュールのテストネットワークを作成しますを作成します

ChannelSelector2.cc.sample と

net tutorial3.n は完成済みファイルです.net_tutorial3.n は完成済みファイルです.

動作確認(実装は説明後)動作確認(実装 説明後)

作成するネットワークの概要 定数行列をChannelSelector2に入力 定数行列は Constant で定義 定数行列は Constant で定義

出力する行とそのゲインをパラメータで指定

出力される行列の値を確認 出力される行列の値を確認 Flowdesigner 上に標準出力

定数行列を入力Flowdesigner 上に出力Flowdesigner 上に出力

4131

2.11.1

4.13.1

期待される動作

2,3列目を抜粋3列目を2倍

6.15.1

4.13.1

2.33

期待される動作

Page 16: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Constant ノード

右クリック: General Constant を選択

Constant をダブルクリック

Type を object にして,Value を埋めるyp を j にして, を埋める

<Matrix <rows 3> <cols 2> <data 1.1 1.2 1.3 1.4 1.5 1.6> >

スペースが必要

変更箇所

ChannelSelector2 ノード

2つのパラメータを埋める

SELECTOR: type object: <Vector<int> 1 2>

GAIN: type object: <Vector<float> 1 0 2 0> GAIN: type object: <Vector<float> 1.0 2.0>

変更箇所変更箇所

Page 17: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

実行実行

Flowdesigner の実行ボタンを押す

下のメッセージボックスに結果(Matrix 型)が出力下の ッセ ジボックスに結果( a 型)が出力

2, 3列目が抜き出され,3列目の要素が2倍になっている

動作確認してください

質問はTA等にお聞きください

早くできた方は Appendix を読み進めて,新たなジ 作成に取り組ん み くださモジュール作成に取り組んでみてください

net_practice3.n は完成済みファイルです.

Page 18: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

その他、発展そ 他、発展

型の変更 型の変更

Map 型等の利用

複数の入力 出力ポ トの追加 複数の入力・出力ポートの追加

もうひとつモジュールを HARK_TEST に追加

Flowdesigner, HARK のソース・ノードの活用

今回作成した ChannelSelector2.cc はHARKモジュ今回作成した は ジール ChannelSelector の改造

ファイルやマイクからの入力サポート ファイルやマイクからの入力サポ ト

ノード同士の接続では型に注意

Appendixpp

新規 ジ 追 Appendix1: 新規モジュールの追加

Appendix2: ライブラリの利用ppe d ライブラリの利用

Appendix3: SaveWavePCM の作成

Page 19: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix1: 新規モジュールの追加pp 新規 ジ 追加

Case 1: 新たな FD ライブ Case 2: FD ライブラリにラリの作成 新たなモジュールを追加

モジュールファイル “xxx.cc” を作成 モジュールファイル“xxx2.cc” を作成

C. “Makefile.am” を編集“libfdt t l SOURCES” の 後に

A. “Makefile.am” を作成

モジュ ルファイル xxx.cc を作成 モジュ ルファイル xxx2.cc を作成

“libfdtest_la_SOURCES” の 後に追加するファイル名を記述するのみ

B. “configure.in” を編集

% autoconf-2.61% automake-1 10

% automake-1.10% /configure% automake-1.10

% ./configure% make % sudo make install

% ./configure% make % sudo make install

% sudo make install

Appendix1:新規モジュールの追加1/3ppA. “Makefile.am” の作成

“t t” という名前の FD ライブラリを追加 “test” という名前の FD ライブラリを追加 初のモジュールファイルは “xxx.cc” とする

“Makefile.am” を作成.(元はサンプルをコピーすればよい) Makefile.am を作成.(元はサンプルをコピ すればよい) 赤字の部分赤字の部分を必要なら変更する

override includedir=${prefix}/lib/flowdesigner/toolbox/fdtest$override datadir=${prefix}/lib/flowdesigner/toolbox/fdtest

override libdir=${prefix}/lib/flowdesigner/toolbox/fdtest

lib LTLIBRARIES libfdt t llib_LTLIBRARIES = libfdtest.la

install-data-local:mkdir p $(datadir)mkdir -p $(datadir)(if [ -f $(libdir)/libfdtest ]; then cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest

fdtest.tlb; else cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest.so fdtest.tlb; fi)(cd $(top srcdir); info2def pl * cc * h > $(datadir)/fdtest def)(cd $(top_srcdir); info2def.pl .cc .h > $(datadir)/fdtest.def)

libfdtest_la_SOURCES = xxx.cc

Page 20: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix1:新規モジュールの追加 2/3ppB. “configure.in” の編集

編集 “configure.in” の編集

赤字の部分を作成したファイル名にする

dnl Process this file with autoconf to produce a configure script. -*-m4-*-

AC_INIT(xxx.cc)

dnl Stolen from gtk+:dnl Stolen from gtk :

includedir=$includedir/flowdesignerdatadir=$datadir/flowdesigner$ glibdir=$datadir/lib...

Appendix1:新規モジュールの追加 3/3ppC. “Makefile.am” の編集

“M k fil ”を編集し “ 2 ”を追加記述 “Makefile.am”を編集し,“xxx2.cc”を追加記述 2つ目以降のモジュールファイルは “xxx.cc” の後に追加していくだけで良い加していくだけで良い

override includedir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride datadir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride datadir=${prefix}/lib/flowdesigner/toolbox/fdtestoverride libdir=${prefix}/lib/flowdesigner/toolbox/fdtest

lib LTLIBRARIES = libfdtest.lalib_LTLIBRARIES libfdtest.la

install-data-local:mkdir -p $(datadir)p $( )(if [ -f $(libdir)/libfdtest ]; then cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest

fdtest.tlb; else cd $(libdir); rm -f fdtest.tlb; ln -s libfdtest.so fdtest.tlb; fi)(cd $(top_srcdir); info2def.pl *.cc *.h > $(datadir)/fdtest.def)

libfdtest_la_SOURCES = xxx.cc xxx2.cc

Page 21: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix2: ライブラリの利用pp ライ ラリ 利用

外部ライブラリを利用したい場合 外部ライブラリを利用したい場合

例: 音ファイルを扱うライブラリ <sndfile.h> を利用

-lsndfile オプションを付ける必要がある

Makefile.am の libfdtest_la_LIBADD にオプションを追 ば追加すれば良い

.libfd l SOURCES S W PCMlibfdtest_la_SOURCES = SaveWavePCM.cc

libfdtest_la_LDFLAGS = -release $(LT_RELEASE) \'fl d i fi lib fi libfl ''flowdesigner-config --libs config libflow'

INCLUDES = `flowdesigner-config --cflags libflow`

libfdtest_la_LIBADD = -lsndfile

Appendix3: SaveWavePCM の作成pp 作成

な 保存 Raw ではなく Wave ファイルで保存したい

SaveRawPCM はヘッダなしファイル

WAV 形式は チャンネル数,サンプリング周波数,データ長(バイト)などの情報をヘッダに格納

SaveWavePCM の改造

機能: ヘッダなし 16bit PCM 波形を出力 機能: ヘッダなし,16bit PCM 波形を出力

ヘッダ書きこみを行えば WAV 形式に

ダ情報書き込み 自作 ライブラリの利用 ヘッダ情報書き込み: 自作 or ライブラリの利用

<sndfile.h> のインクルード,-lsndfile のリンク

Page 22: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説

ド 説 ソースコードの説明

動的型判別: 入力型に Map<int,ObjectRef>, p jMatrix<float> の両方を扱うことが可能

バイト/型変換

変更すべき点

ofstream クラスに相当する wav 形式を扱うクラスを ofstream クラスに相当する wav 形式を扱うクラスを作れば楽

sndfile ライブラリを使う場合: sndfile h をインクルー sndfile ライブラリを使う場合: sndfile.h をインクルー

ドすると,ヘッダ書きこみ関数や波形書きこみ関数を利用可能利用可能

Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説

void calculate(int output_id, int count, Buffer &out){

ObjectRef in = getInput(inputID, count);if ( id(*i ) id(M i Obj R f )) {if (typeid(*in) == typeid(Map<int, ObjectRef>)) {

RCPtr<Map<int, ObjectRef> > input = in;Map<int, ObjectRef>::iterator it = input->begin(); Typeid で型が

同じがどうか判定typeid で型が

同じがどうか判定for (; it != input->end(); ++it) {

Vector<float>& x = object_cast<Vector<float> >(it->second);<中略>}

同じがどうか判定同じがどうか判定

}}else if (typeid(*in) == typeid(Matrix<float>)) {

Matrix<float>& x = object cast<Matrix<float> >(in);Matrix float & x object_cast Matrix float (in);<中略>

}else {中略<中略>

}}

Page 23: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix3: SaveWavePCM の作成: pp 作成SaveRawPCM の概説

for (; it != input->end(); ++it) {Vector<float>& x = object_cast<Vector<float> >(it->second);

h d f fshared_ptr<ofstream> fout;if (streams.find(it->first) == streams.end()) {

ostringstream name_str;name str << basename << it->first << ".sw"; convertBitFormat はname_str << basename << it >first << .sw ;fout.reset(new ofstream(name_str.str().c_str()));streams[it->first] = fout;

tBitF t( b f 0 i ())

float から2 byte or 3byte 整数に型変換する関数.

配列の何処からどこまでを変換するかが異なるconvertBitFormat(x, buf, 0, x.size());

}else {

convertBitFormat(x, buf, x.size() - advance, x.size());

変換するかが異なる.

convertBitFormat(x, buf, x.size() advance, x.size());fout = streams[it->first];

}fout->write((char*)&buf[0], buf.size());f t fl h()

オーバラップ処理をしている場合,新規入力部分だけ

fout->flush();}

変換対象になる.

Appendix3: SaveWavePCM の作成: pp 作成ライブラリ libsndfile interface基 数を ば良 基本的に以下の関数を用いれば良い.

リファレンスはローカルリファレンスは カル~/practice3/libsndfile.html にあります.

SNDFILE* sf open (const char *path int mode SNDFILE sf_open (const char path, int mode, SF_INFO *sfinfo) ;

int sf close (SNDFILE *sndfile) ; int sf_close (SNDFILE sndfile) ;

sf_count_t sf_write_short (SNDFILE *sndfile, short *ptr sf count t items) ;ptr, sf_count_t items) ;

int sf_command (SNDFILE *sndfile, int cmd, void *data int datasize) ;data, int datasize) ;

Page 24: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

Appendix3: SaveWavePCM の作成: pp 作成SaveWavePCM のサンプル

プ パ サンプルのコンパイル

試作品は SaveWavePCM.cc.samplep1) リネーム: mv SaveWavePCM.cc.sample SaveWavePCM.cc

2) Makefile.am の libfdtest_la_SOURCES に SaveWavePCM を追加加

3) Makefile.am の libfdtest_la_LIBADD に –lsndfile を追加

4) automake configure4) automake configure

net_appendix.n がネットワークファイル

wavesufer sep 0 wav 等で波形を確認可能 wavesufer sep_0.wav 等で波形を確認可能

SaveRawPCM を使った場合と比較

その他:デバッグの方法 (skip)そ 他 デ ッグ 方法 ( p) -g –ggdb オプションつきでコンパイル(Makefile.amに

AM CXXFLAGS= g ggdb を追加)AM_CXXFLAGS= -g –ggdb を追加) gdb /path/flowdesigner ブレークポインタ設定

b VAdd::calculate (関数名で設定) b vadd.c:62 (行番号で設定) ブレークポインタ確認 ブレ クポインタ確認

i b (info breakpoints) 条件設定 #はブレークポインタの番号

Condition # i > 1 (iが1より大きい時に#番のブレークポインタが有効になる) Condition # i > 1 (iが1より大きい時に#番のブレ クポインタが有効になる)

実行 r (run)

( ti ) c (continue)

その他 適宜 printf デバックp

Page 25: HarkTutorial2010 Japan Practice3-WOLwinnie.kuis.kyoto-u.ac.jp/members/okuno/tmp/HARK10/Hark...ノド作成ノードの作成 Pi3Practice 3 HARK グルグル プープ 武田龍 開発環境について

まとめま

新規 ド 新規ノード開発

DECLARE_NODE: /*NODE … END*/

コンストラクタ,calculate メソッド

Makefile.am の編集、コンパイル Makefile.am の編集、コンパイル

ChannelSelector の実装

モジ ルパラメ タの追加 モジュールパラメータの追加

ネットワーク Constant でのパラメータ設定