お知らせ
もともとは、技術情報と普段の活動の内容を別々のblogに分けて書こうというもくろみだったのですが、あまりうまくいかなかったようです…
今後は、技術情報もまとめて、「かつてー」の方に書きます。
こちらで書いたポストのうち、使えるものは「かつてー」の方に移行させるつもりです。移行が終わり次第、こちらのサイトは閉鎖する予定でいます。
よろしくお願いします。
もともとは、技術情報と普段の活動の内容を別々のblogに分けて書こうというもくろみだったのですが、あまりうまくいかなかったようです…
今後は、技術情報もまとめて、「かつてー」の方に書きます。
こちらで書いたポストのうち、使えるものは「かつてー」の方に移行させるつもりです。移行が終わり次第、こちらのサイトは閉鎖する予定でいます。
よろしくお願いします。
もうすでに二度(1)(2)にわたって、書いているのだが、いまだに理解できていない部分があるので、再度まとめてみる。
Java Audio まとめ2 (書きかけメモ)でも図を書いて説明したjavax.sound.sampled.Clipについて。
Clipを使う手順
1. ファイルをAudioInputStreamとして開く.
2. AudioInputStreamから、オーディオのフォーマットを取り出して、(必要なら)フォーマットの変換を行う.
3. Clipを生成するために必要な情報を、フォーマットをもとに生成
DataLine.Info info = new DataLine.Info(Class.forName("javax.sound.sampled.Clip"), format);
4. 作ろうとしているDataLineがシステム上でサポートされているかチェック
if (!AudioSystem.isLineSupported(info)){ ... }
5. Clipを生成
Clip audioclip = (Clip)AudioSystem.getLine(info);
6. モニタリング開始。Clipの状態が変化したときにモニタしている側のupdate()が呼ばれる
audioclip.addLineListener(delegate);
7. InputStreamを開く
audioclip.open(stream);
詳しくは、サンプルコードを見てもらうとして、ここでは1.のファイルをAudioInputStreamで開く部分を詳しく取り上げる.
プロジェクト内のソースコードのファイル名をFinder等で変更したとき、名前を変更したソースコードのプロジェクトに登録し直した後でも、
Missing file or director: old file name
というエラーが出続けるときがある。
そんなときは、Groups & Files コラムの一番上のプロジェクトのアイコンを選択. Get Info … して、Generalタブの一番下, Rebuild Code Sense Indexをクリックして、インデックスし直すことで直せる。
java.lang.RuntimeクラスのtotalMemory()メソッドでこの特定のプロセスに割り当てられているトータルのメモリサイズをバイト単位で得られる.そのうち空いているメモリの量は,同じくjava.lang.RuntimeクラスのfreeMemory()メソッドで得られる.
freeMemory()の返り値が0になって,garbage collectorも新しいメモリを割り当てられなくなったら,Java VMはより下位のシステムにtotalMemory()を増やすようにリクエストする.下位のシステムもこれ以上VMにメモリを割り当てられないとなると,OutOfMemoryErrorがthrowされる.
ためしにクリックすると,サウンドが無駄にロードされるようにしてみた.クリックするごとにFree Memoryが減っていき,足りなくなったところでTotal Memoryの割当てが増えていくのが分かる.しかし,クリックし続けると新たにTotal Memoryを割り当てることが出来なくなり,最終的にはOut of memoryとなる.
JavaからMySQL,PostgreSQLなどのDBへのアクセスは,通常JDBC APIを使う. JDBCはあくまでもAPIであって,具体的な実装はさまざまであることに注意したい.以下では,DBとして,MySQLを使った場合について解説する.
MySQLのJDBCは,MySQL Connector/J というドライバで実装されている.ダウンロードして解凍すると,mysql-connector-java-(バージョン)-bin.jarというjarファイルがあるので,これをCLASSPATHに入れるか,コンパイル/実行時に -classpath オプションでこのjarファイルのパスを指定してやるとよい(ちなみに,通常jre/lib/extが標準のCLASSPATHだが, Mac OS Xの場合,/Library/Java/Home/lib/extがそれにあたる)
より詳しくは,“Java Enterprise: in a Nutshell (In a Nutshell)” (William Crawford, Jim Farley, Prakash Malani, John G. Norman, Justin Gehtland)にリファレンスとJDBCの詳細が載っている.
Javaの基本だけど,知らなかったので,メモ.
例えば,naotokui.jarというjarファイルにオーディオ周りのパッケージが入っているとする.AudioTest.javaの中で,import com.naotokui.audio.* でそのパッケージをimportして使いたいとき,コンパイル時には,
javac -classpath (naotokui.jarのパス) AudioTest.java
実行は
java -classpath (naotokui.jarのパス) AudioTest
classpathは,jarファイルが入っているディレクトリではなく,ファイルそのもののパスを指定しないといけない.jarファイルを解凍する(拡張子をzipに変えて解凍すると良い)と,中には,com/naotokui/audio/…. というディレクトリ構造が出来ているはず.すなわち,jarファイル自体がこのフォルダ構造を含むディレクトリのような位置づけになっていると考えると良い.
IBMのこのページが非常に分かりやすい >> Managing the Java classpath (UNIX and Mac OS X)
Developer ToolsのMallocDebugも使えるが,動作がかなり重い気がする.単純にMemory Leakを探したい場合は,そのまんま,”leaks”という名前のコマンドラインツールがある.使い方も簡単.
% leaks <プロセスのid>
そうすると,たとえばこんな感じの出力を返してくれる.mallocでallocateされた,メモリのうち,その領域に対するポインタがないものをリストアップしているそうだ.
Leak: 0x247c5f40 size=16 instance of 'NSCFString' 0xa080b260 0x0001078c 0x01004901 0x00010001 `........I...... Leak: 0x247c6020 size=16 instance of 'PZKeyCombo' 0x0075ae20 0x00000000 0x00758a0c 0x00000000 .u.......u.....
より詳しく知りたいときには,MallocStackLoggingという環境変数を設定したシェルから,アプリを立ち上げてleaksすると,メモリのallocationが行われたCallingスタックの情報まで表示してくれる.
% setenv MallocStackLogging 1
% ./my_app &
% leaks <my_appのpid>
詳細はAppleのドキュメント,Memory Usage Performance Guidelinesをチェックすること.
Ali Momeniが担当したコースが公開されてる.
彼らしいジェスチャーをつかったコントロールなどなど.
http://alimomeni.net/MMNS-2007
Technorati Tags: Max/MSP
ここまでの結果をまとめて,簡単なリズムマシン制作の練習.クリックした位置に,Beep音が置かれる.上の方に置くと音が大きくなるのは,先ほどのポストのControlのMASTER_GAINを使っている.
左のスライダーでBPMをコントロールできる.左下に実際に一小節にかかっている時間を元に計算したBPMを小さく表示している.これでみるかぎり,BPMをあげてもこの程度なら追従することがわかる.
Technorati Tags: applet, Java, Processing, sound
前回のポストで書いた,MixerとControlを使って,GainとPanをコントロールする.クリックした場所に応じて,GainとPanが変わる.我ながら相変わらずシンプルなサンプル
例えば,GainのControlをClipオブジェクトから取り出すのはこんな感じ.
if (_clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
_gainCtl = (FloatControl) _clip.getControl(FloatControl.Type.MASTER_GAIN); } で,実際にVolumeをセットするときは
float range = _gainCtl.getMaximum() - _gainCtl.getMinimum(); float gain = (range * vol) + _gainCtl.getMinimum(); _gainCtl.setValue(gain);
ちょっとトリッキーなのは,Panの方.J2SE 1.4までだと,PANというControlなのだが,1.5以降はBALANCEという名前になってる! それぞれの有無をチェックして,ある方を使うというふうにしてある.左下にJavaのヴァージョン,右に使っているControlの名前を書いたので,チェックしてみてほしい.