todojunの真理を追究する日々

日々考えていることなどを徒然と書いていきます。

 いろいろ

しばらく日記を更新していなかったので、その間の出来事などを少し振り返ってみます。今日は実験について書くことにします。実験というよりもプロジェクトと呼んだほうが正しいような気もしますが。
簡単な確認として、実験(プロジェクト)課題は「自律認識機械(を作る)」で、メンバーは僕も含めて4人。TAが1人います。
実験が始まったのが4月7日。まずアイディア出しだったのですが、体調が悪くまともに話に参加できませんでした。
14日は欠席。
21日はとりあえずやる内容(拍手のリズムに合わせて手作りの手を叩かせるという機械(装置?)をつくる)を聞き、秋葉原まで買出しに行く人と、音をパソコンに取り入れるところを担当するグループに分かれる。僕はまだ歩くのがきつかったのでもちろんパソコンの方へ。
28日。リアルタイムで音声を扱うには、DirectXの中のDirectSoundというのを使う必要があるということがわかったけれど、ネット上で色々調べてもよくわからない。というのも、DirectXはゲームプログラミングに使われることが多いので、DirectSoundもその観点から載っているのがほとんどだったから。大きな書店で書籍も調べてみたがやっぱり似た感じ。ちょっと難航。また、この頃から作業分担が明確になってくる。

  1. 拍手の音を拾ってそれを処理する
  2. 処理したところからシリアル通信でPICに情報を送る
  3. PICを作り、シリアル通信で送られた情報でステッピングモータを制御する
  4. 手の部分など実際に動く部分を作る

だいたいこんな感じですが、隣合っている番号の境界は結構あいまいで、協力して作業していることもかなりたくさんあります。僕の担当は1です。1と2が主にソフト、3と4が主にハードの部分を担当していると考えるとちょっとはわかりやすいかもしれません。
5月5日はゴールデンウィークで休み。
5月12日、リアルタイム音声処理にはASIOドライバを使うオーディオインターフェイスを用いると、PortAudioというところに強力なライブラリがあるからよいよ、というアドバイスを同学科のシステム情報工学コースの友達からもらっていた(前回の実験から今回までの間に)。プログラミングにはVisualC++を用いるので、その細かい設定などはその友達から教えてもらう。
19日。設定完了させて、サンプルプログラムを動かしてみる。がうまくいかない。どうやら、友達の貸与ノートパソコンにはASIOドライバが入っていてそのまま使えるということだったのですが、自分の貸与ノーパソにはASIOドライバ(とそれに対応するオーディオインターフェイス)が入っていない模様。ASIO対応のオーディオインターフェースを買った方がいいという友人の助言もあったが、かなり値が張るのでなんとか買わないでもできないかと粘ってみる。
26日。結局、オーディオインターフェースを注文することに。ASIOドライバに対応していて1番安かった(しかも小型)M-AUDIOの「TransitUSB」にしました。あとからわかったのですが、M-AUDIOはこっち方面ではかなり有名な会社らしく、次回の実験までの間に例の友達から借りたオーディオインターフェースM-AUDIOの製品でした。で、結局この日は特にやれることもなかったので、VisualC++のサンプルプログラムの理解に努めました。
6月2日。なんと、先週に助手が2週間かかると言っていた「TransitUSB」がすでに届いていて実験の部屋に置いてありました。開けてみるとめっちゃ小さい!!携帯サイズで重さは携帯の3分の1くらいでした。さっそくそれを使ってプログラムを動かしてみる。あれ、うまくいかないぞ。認識されていないようだ。で、友達に借りたほうで試してみるとうまくいくのです。うーん、どうすりゃいいのだろう。何回もお互いのやつを試していてやっと気がつきました。「TransitUSB」はきちんと認識されていて、「初期化できないので接続を確認してください」というような英語のメッセージを無視してキャンセルを押せばきちんと動作するのです。やったー。これで第1関門は突破しました。リアルタイムで音を取り込むところまでなんとかたどり着きました。恐ろしく高い壁だったので、かなりほっとしました。取り込んだ音データをそのまま出力させて、グラフにするところまではできました。
9日。パンパンと拍手をして、その音データを取り込み出力し、グラフに描いて分析することを続けました。音データの特徴から、どのようにして音がなったのを認識し、拍手しろーという関数を呼べばいいかを考えていました。いろいろと試していくうちに、かなりの精度で拍手に対して、拍手関数(造語)を呼べるようになりました。また、リズムを認識し、次の拍手のタイミングを予測する部分を考えました。
16日。先週の続き。リズム(音と音の間隔)を認識し予測するのに、前回は前までのいくつかの「間隔」の重みつき平均で考えていたのですが、それだと加速や減速する拍手に対応できないので、最小二乗法で求めた直線から予測しようと考えました。あと、拍手関数を呼んでしまうとその間には音が取り込みなくなってしまうので、Threadを使ってそれを回避しようと考えました。しかし、C++のThreadは、やったことのあるJAVAのThreadより難しいらしい。ネット上にも載ってないので先送り。PICが完成したのでそれを使ってみると、やったー、動いたー。拍手でステッピングモータが正しく動きました。でも、力がない+(作った)手が重い、ということで、手をつけるとちゃんと動かなくなってしまうのでした。
23日。先週なのにあまり覚えてないですが。。手が軽量化され、PICからの電流を増幅させる増幅回路も出来上がったということで、ちゃんと手が動くようになったのだったと思います。記憶があいまいになってきているのは、ここら辺りから平日も遅くまで残るようになっているからです。いままでは音にそのまま反応して手を叩くものだったのを、ちゃんと予測して叩かせるようにプログラムを改変したのが(マルチスレッド化含む)ここら辺だったと思います。
30日。今日ですね。メトロノームを使って一定の間隔で音を出し、それに合わせて拍手をさせました。で、かなりいい感じにできていたので、ビデオに取っておきました。手でもだいたい上手くいっていて、すこしずつ加速したり減速したりするのにも対応できています。今のところプログラムの問題は、たまに音を取り損ねてしまうということです。たとえば、1秒おきに鳴らしているのに、たまに音の間隔を(ほぼ)2秒にしてしまうのです。とりあえず対症療法を施して致命的にはならないようにしたのですが、そこのところをちゃんとしたいですね。あと、追いつけるリズムがだいたい1秒に1回くらいでそうとう遅いので、そこも工夫してもっと速い音にも対応できるようにしたいです。助手の人に促された発展的なものについてはそのあとですね。
だいたいこんな感じですか。