processingで音声ファイルを再生するには、minimライブラリを使えば良いみたい。
下記のブログを参考にさせていただきました。
Processingのminimライブラリで音楽を停止するとき | Morikuma Works
注意点としては、mp3ファイルを再生する際にIDタグ(タイトルやアルバム名など)が入っているとエラーが出てしまうということ。
wavファイルをmp3にタグ無しで変換するのが良さそう。
processingで音声ファイルを再生するには、minimライブラリを使えば良いみたい。
下記のブログを参考にさせていただきました。
Processingのminimライブラリで音楽を停止するとき | Morikuma Works
注意点としては、mp3ファイルを再生する際にIDタグ(タイトルやアルバム名など)が入っているとエラーが出てしまうということ。
wavファイルをmp3にタグ無しで変換するのが良さそう。
microSDを1GBにしたら動いたので、コードを見てみる。
やりたいこととしては、
・センサの入力値に合わせて再生する曲を選択する
というのがある。
なので、毎ループごとに呼ばれている箇所を探してそこにセンサの値を読む処理を割りこませる必要がある。
調べてみると、player.cppのAvailableProcessorTime()という関数のdo while文が毎回呼ばれていることがわかった。
また、ここでMusicShieldについているスイッチの入力を見るためのCheckKey()という関数を呼んでいる。
CheckKey()では入力に合わせて音量や選曲の処理を行なっているようなので、ここを参考にすれば良いみたい。
読むと、playingStateという変数をPS_NEXT_SONGにすると次の曲へ、PS_PREVIOUS_SONGにすると前の曲が再生されるようになっている。
今日はひとまずここまで。
センサを読むところを加えて、playingStateの状態を変更してやればあとは勝手にやってくれそうだ。
しかし、任意の曲番号を指定して再生するのはどうする・・・?
[追記]
なんだかまだ全然良くわかってないけど、PlayCurentFile()という関数の最後に曲を流し終わった時の処理を書くとうまくいけそうなことがわかった。
サンプルコードのままだと
・1曲再生し終わった時、SDカード内の次の曲を再生する。
という処理になっているが、
・1曲再生し終わった時に一時停止し、次に再生する曲はSDカード内の3番目の曲にする。
という処理にしたい場合は下記のように書くと良い。
/* player.cpp */ void PlayCurrentFile() { char c, nFragments; /* 中略 */ SendZerosToVS10xx(); // After finishing normally default to requesting to play next song //playingState = PS_NEXT_SONG; //サンプルコードだとここがアクティブになっているのでコメントアウト // ここに曲を流し終わったときの処理をどうするか書く! playingState = PS_NORMAL; // 単曲再生(次の曲へ進まない) playStop = 0; // 一時停止する(1にするとループ再生) currentFile = 3; // 次に再生する曲の番号 }
AvailableProcessorTime()でやればいいのか、PlayCurentFile()でやればいいのかわからないが、ひとまず
・playingState = PS_NORMALで固定
・playStopを0にしたら停止、1にしたら再生しっぱなし
・currentFileを再生したいファイル番号にする
というように適宜変更してやれば良さそう。
Windowsに慣れてしまっているので、どうにもfinderには慣れない・・・。
特にエクスプローラみたいにパスを直接入力出来ないのがもどかしい(出来るかもしれないけど・・・無知)。
下記のソフトをインストールすることで解決した。
FinderPath
「Command+G」でウィンドウ上部にアドレスバーが出てきて入力出来る。
Tabで補完もしてくれて捗る!
※Mac OS X Lionで動作しました。
Arduinoから音声を再生したかったので、下記のシールドを購入した。
Seeed Studio INT109B2P Music Shield
インストール方法は下記に書いてある。
Music Shield - Wiki
ひとまずwikiの手順に従いMusic v1 14.zipとNewSoftSerial.zipをダウンロード。
で、..\arduino-0022\librariesに置くらしいが・・・どこやねん。
macだとよくわからなかった。調べてみたら、
/Applications/Arduino.app/Contents/Resources/Java/libraries
でいいみたいだ。
ディレクトリをコピーするとArduinoのIDE上でSketch→Import Library...にmusicとNewSoftSerialが追加される。
あとportpins.hの書き換えも必要なので、
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/include/avr
にあるportpins.hを上書きする。
コンソール開いてmvやらcpやらで書き換えました。
で、サンプルスケッチを走らせたものの・・・コンパイルは通ったのに再生されない!
よく見たらmicroSDはSDHC(4GB以上)をサポートしてないのね・・・。
ひとまずAmazonで手頃な1GBのをポチってみた。
到着しだい試してみる予定。ちゃんと動くといいけど・・・。
[追記]
1GBのmicroSDで動いた!やはりmicroSDHCは非対応。
NyARToolkitでARマーカに画像を重畳したい。
なのでARマーカに合わせてCGで正方形を描画し、任意の画像をテクスチャとして貼ってみる。
下記のコードで動いた。
import processing.video.*; import jp.nyatla.nyar4psg.*; Capture cam; MultiMarker nya; // image setting PImage t_image; // texture image int t_image_l = 160; // marker and texture size // display setting int DISPLAY_W = 640; // display width int DISPLAY_H = 480; // display height void setup() { size(DISPLAY_W, DISPLAY_H, P3D); // Setup for NyARToolkit. colorMode(RGB, 100); println(MultiMarker.VERSION); cam=new Capture(this, DISPLAY_W, DISPLAY_H); nya=new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG); nya.addARMarker("patt.hiro", t_image_l); // Setup texture t_image = loadImage("hoge.jpg"); } void draw() { if (cam.available() !=true) { return; } cam.read(); nya.detect(cam); background(0); nya.drawBackground(cam);//frustumを考慮した背景描画 if((!nya.isExistMarker(0))){ return; } nya.beginTransform(0); beginShape(); texture(t_image); vertex(t_image_l/2*(-1), t_image_l/2*(-1), 0, t_image_l); vertex(t_image_l/2, t_image_l/2*(-1), t_image_l, t_image_l); vertex(t_image_l/2, t_image_l/2, t_image_l, 0); vertex(t_image_l/2*(-1), t_image_l/2, 0, 0); endShape(); nya.endTransform(); }
vertexで指定している、4つの引数が謎。
1番目はx座標、2番目がy座標であることはわかるが、3番目と4番目はなんだろう・・・?
テクスチャの幅・高さだろうか。
NyARToolkitの「withOpenGL」というサンプルコードを実行しようとしたが出来ない。
まさに下記の状況が起きた。
processingで描画モードをOPENGLにして,Captureとか使うときの注意 - いつきの技的日記
processingで,
size(width, height, OPENGL);
こんな感じに描画モードをOPENGLにして,そこでvideoとか使いたくて,
Capture video;
video = new Capture(this, width, height);
と,した時に,環境によって動かない時があるっぽい.どうなるかというと,実行は出来てウィンドウは出るんだけど,そこで何も表示されないままフリーズ.
エラーや警告文は無し.stopボタン押せば消えるけど.
自分の開発環境は
・Max OS X Lion
・Processing 1.5.1(1.2.1でも発生)
メモ書き。
あまりに重い動画を再生しようとするとメモリを確保出来ずエラーが出たり落ちる。
NyARToolKitと組み合わせて動画を再生するなら、OpenGLを使うのが良さそう。
下記のエントリが参考になりそうだ。
Processingで手抜きプロジェクションマッピング - Imaginable Reality
モバイルプロジェクタを使ってみるのも面白いかも。目新しいし。
[追記]
メモリ不足で落ちる問題、IDEのメモリ使用量を増やす設定をしないとダメかも。
下記を参考にやってみよう。
Reco memo: Processing: IDEからアプリ実行時のメモリ確保量の変更
[追々記]
メモリ容量、1.5.1だとテキストファイルではなくメニューから設定出来るようになってた。
ひとまず1024MBを設定してみた。落ちなくなったみたい。