HARK FORUM › HarkDataStreamSenderによる音源定位結果の出力について › Reply To: HarkDataStreamSenderによる音源定位結果の出力について
お問い合わせありがとうございます。
HarkDataStreamSenderノードはsocket通信のTCP/IPプロトコルで バイナリデータ を送信します。バイナリデータですので、toStringやUTF-8変換などを行っては いけません のでご注意ください。
データ構造につきましては下記URL(HARK-Documentのノードリファレンス、HarkDataStreamSenderの項)の「データ送信の詳細」以降に記載しております。
https://www.hark.jp/document/hark-document-ja/subsec-HarkDataStreamSender.html
記載している情報ですが、C/C++の型情報に基づいておりますのでnode.js上でのデータの扱い方を簡単に書かせて頂きます。node.jsでは特定のモジュールを使用しなければ64bit整数を扱えないようですが、下記のような構造ですので時間情報が必要な場合でも、精度の高い時間情報が不要でしたらフレーム数(sampling=16kHz、advance=160の場合1フレームあたり10ms)から算出する事が可能です。
buf = new Buffer([0x04, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00 ... 受信データ ...]);
// ---
hdh_type = buf.readInt32LE(0); // HD_Header (type) : SRC_INFOを意味する 0x00000004
hdh_advance = buf.readInt32LE(4); // HD_Header (advance) : ADVANCE=160を意味する 0x000000a0
hdh_sec = buf.readInt32LE(8);
hdh_sec *= (2 ** 32); // 恐らくモジュールを追加しなければオーバーフローします
hdh_sec += buf.readInt32LE(12); // HD_Header (tv_sec) : 1960/01/01 00:00:00 からの秒数
hdh_usec = buf.readInt32LE(16);
hdh_usec *= (2 ** 32); // 恐らくモジュールを追加しなければオーバーフローします
hdh_usec += buf.readInt32LE(20); // HD_Header (tv_usec) : 同上からのマイクロ秒(秒数未満)
// ---
srcs = buf.readInt32LE(24); // Sources : 音源数(下記HDH_SrcInfoの個数)
// ---
for(var i = 0; i < srcs; i++){
src_id[i] = buf.readInt32LE(28+i*20+0); // HDH_SrcInfo (src_id) : 音源iのid
src_x[i] = buf.readFloatLE(28+i*20+4); // HDH_SrcInfo (x[0]) : 音源iのx座標
src_y[i] = buf.readFloatLE(28+i*20+8); // HDH_SrcInfo (x[1]) : 音源iのy座標
src_z[i] = buf.readFloatLE(28+i*20+12); // HDH_SrcInfo (x[2]) : 音源iのz座標
src_pow[i] = buf.readFloatLE(28+i*20+16); // HDH_SrcInfo (power) : 音源iのMUSIC power
}
// ---
毎フレーム上記のようなデータが届きます。また、音源数 i は定位した音源が無ければ 0 となる事もあります。その場合はループ内のデータ構造(HDH_SrcInfo)部分は受信しません。
デカルト座標から極座標に変換される場合は、下記URLの座標系の説明をご参照ください。
https://www.hark.jp/document/hark-document-ja/sect0030.html
以上、ご参考になれば幸いです。
- This reply was modified 6 years ago by Masayuki Takigahira.
- This reply was modified 6 years ago by Masayuki Takigahira.