INDEX(各項目ごとの目次)

[HOME]  [Processing関係]  [Arduino関係]  [マテリアル関係]  [秋葉原工作マップ]

2008年用ですが、部分的に内容を更新しています(2010/06/14)。
また、[建築農業工作ゼミ2009-2010]とも連動していますので、そちらにも幾つかサンプルがあります。
:

8/09/2008

Processing Video (Webカメラ)

ProcessingのVideoライブラリを使用することで、パソコンに接続した(あるいは内蔵された)Webカメラからの映像を取り込むことができます。このライブラリを使用するには、パソコンにQuickTimeがインストールされている必要があるので、もしインストールされていない場合は、アップルのQuickTimeのサイトからダウンロード/インストールして下さい。
USB接続する外付けのWebカメラの場合は必要なドライバをメーカーのサイトなどからダウンロード/インストールして使用可能な状態にしておいて下さい。Webカメラがパソコンに内蔵されている場合は、そのまま使うことができるはずです。まずは、簡単な映像の取り込みかたから始めます。

*Windowsの場合、そのままの設定ではこのVideoライブラリを使用することができないことがあります。その場合、WinVDIG 1.0.1をインストールする必要があります。


//ライブラリの取り込み
import processing.video.*;
//キャプチャする映像のオブジェクトを用意
Capture myCapture;

void setup() {
size(200, 200);
//キャプチャする映像の設定
myCapture = new Capture(this, width, height, 30);
}

void draw() {
//映像を画面に配置
image(myCapture, 0, 0);
}

//映像の読み込み
void captureEvent(Capture myCapture) {
myCapture.read();
}

//クリックでカメラセッティング画面になる
void mousePressed(){
myCapture.settings();
}


上記プログラムでは、画面サイズが200×200の正方形であるため、Webカメラでキャプチャされた映像は縦長になってしまうかもしれません。通常画面の比率は4:3(横:縦)であるため、もし比率を合わせるのであれば、320×240(4:3)などに合わせてください。
Capture()によって、親オブジェクト(thisのままでよい)と映像の幅と高さ、フレームレートを設定できます。映像が滑らかに動かない場合は、フレームレートを下げるか、画像サイズを縮小して調整して下さい。
キャプチャされた映像は、毎フレームごとにimage()によって画面内に配置されます。image()の括弧内の数値は、配置するX座標、Y座標となります。上記プログラムでは0,0に設定されているので、左上角の座標を基準に映像が画面内に配置されます。
captureEvent()は、Webカメラから信号が送られてくる度に作動します。read()によって、毎回送られてくる映像信号を読み込んでいます。
今回は最後にクリックするとsettings()によって、カメラのセッティング画面(Webカメラ用の設定アプリケーション画面)が現れるようにしてあります。ここで、カメラの解像度やコントラストなどの設定を行うことができるはずです。

次に映像にフィルタをかけてみるプログラムをしてみます。
画像用のfilter()というコマンドがあり、
THRESHOLD 白黒ニ値化:0.0~1.0(黒〜白)/初期設定0.5
GRAY    グレースケール:パラメータなし
INVERT   反転色:パラメータなし
POSTERIZE ポスタライズ:2~255(各チャンネルの色数の限定)
BLUR    ぼかし:指定半径範囲でぼかす
それぞれをfilter()の括弧内に入れれば、映像にフィルタをかけることができます。フィルタの種類の後にパラメータを入れることで、フィルタのかかり具合を調整することができます。
複数のフィルタを重ねて使うこともできます。ただ、フィルタの種類(特にBLUR)によっては処理速度に影響がでる場合があるので、適宜フレームレートや画素数などを調整する必要がでてくるときがあります。
以下は、キャプチャした映像にぼかしをいれノイズを取払い、その後白黒でニ値化し、白黒の単純な映像に変換するサンプルです。尚、映像の比率は4:3にすることにします。


「フィルタ(ぼかし+白黒ニ値化)をかけた映像(上画像)」


//ライブラリの取り込み
import processing.video.*;
//キャプチャする映像のオブジェクトを用意
Capture myCapture;

void setup() {
size(320, 240);//比率4:3
//キャプチャする映像の設定
myCapture = new Capture(this, width, height, 30);
}

void draw() {
//映像を画面に配置
image(myCapture, 0, 0);
filter(BLUR,1.8);//ぼかし
filter(THRESHOLD,0.7);//白黒ニ値化
}

//映像の読み込み
void captureEvent(Capture myCapture) {
myCapture.read();
}


次に、映像のモザイク化のプログラムをしてみます。画面サイズを320×240とし、横を32分割、縦を24分割し、10×10のモザイク処理をすることにします。まずloadPixels()によって映像の全ピクセルを読み込み、pixels[]によって選択したピクセルの色を取得します。取得した色をもとにrect()でモザイクの矩形を描くことにします。モザイク化されるには、必要なキャプチャ映像は結果的に32×24の解像度があれば済むので、予め32×24のサイズでキャプチャすることにします。


「モザイク映像(上画像)」


//ライブラリの取り込み
import processing.video.*;
//キャプチャする映像のオブジェクトを用意
Capture myCapture;

void setup() {
size(320, 240);//比率4:3
//キャプチャする映像を32×24に設定
myCapture = new Capture(this, 32, 24, 30);
//noStroke(); //モザイクの黒枠をなしにする場合
}

void draw() {
//キャプチャ画像の各ピクセルの色を
//塗色に割当て、矩形を描く
for(int i=0;i<32*24;i++){
fill(myCapture.pixels[i]);
rect((i%32)*10,(i/32)*10,10,10);
}
}

//映像の読み込み
void captureEvent(Capture myCapture) {
myCapture.read();
}


最終的に32×24のモザイクになるので、キャプチャする画像も同様の解像度にしておけば、処理速度が遅くならなくて済みます。pixels[]によってキャプチャされた映像の各ピクセルの色を取得します。32×24なので合計768ピクセル分となります。rect()による矩形も768個必要になるので、まずfill()で塗色を指定してから描きます。pixel[i]のiは画面左上から数えていき最後は右下のピクセルの番号になります。pixel[i]のiは0~767(合計768個)までの連続した数値なので、「%」と「/」を使ってXとYの座標値に変換します。変換したXとYの座標値をrect()に代入することで、320×240の画面に10ピクセル単位で横方向と縦方向に32×24のモザイク矩形として配置されます。今回はnoStroke()を使っていないので、黒い枠のついたモザイク矩形にしています。


ドライバなしですぐにコンピュータに接続可能(UVC対応)なWebカメラとして以下のようなものがあります。
Macintosh/Windows兼用です。
      

関連:
Arduino+Processing マトリクスLED+Webカメラ」--Webカメラ映像をマトリクスLEDに映す。
Processing Webカメラを光センサとして使う」--点光源で画面内に線を描く。
Processing Webカメラ/定点記録画像」--Webカメラ映像を0.5秒おきに画像保存(JPEG)する。
Processing Webカメラ/カラートラッキング」--Webカメラを使い、色を手がかりに物体を追いかける。
Processing Webカメラ/モーショントラッキング」--Webカメラを使って動体検知する。

Arduino マトリクスLED2/MAX7219

以前の「Arduino マトリクスLED1」では、8×8のマトリクスLEDをArduino基盤に直接接続して点灯させましたが、今回はMAX7219というLEDディスプレイドライバICを使って点灯してみます。Arduino基盤にマトリクスLEDを直結すると16個の端子が必要でしたが、MAX7219を使えば5V電源とGND以外に3本の端子で制御することが可能になります。原理的には、シリアルデータを送り、マトリクスLEDを表示させることになりますが、ArduinoにはマトリクスLED用のライブラリ(Wiringのライブラリ)があるので今回はそれを使ってプログラムしてみます。今回使用する8×8のマトリクスLEDは、以前同様、秋月電子で購入したものです。
以下のように、マトリクスLEDの各端子とMAX7219の端子が対応します(マトリクスLEDモジュールの側面に小さな凹凸部があり、MAX7219には端部に半円状の凹部や小さな丸印があるので、それらを手掛かりに向きを合わせてください)。



その他のMAX7219の端子については、
DIN:Arduinoからのシリアルデータ入力端子
DOUT:複数のMAX7219を接続する端子
VCC:5V電源
I_SET:接続する抵抗によって輝度を変えます
GND:AduinoのGNDと共有
LOAD:Arduinoからのデータ入力のロード用端子
CLK:Arduinoからのクロック信号入力端子

Arduino基盤との接続は以下のようになります。I_SETとLOAD端子には、10KΩの抵抗を接続して下さい(I_SETの抵抗値を上げれば暗くなり、下げれば明るくなります)。画像をクリックすれば大きくなります。



既存のサンプルを使って点灯実験してみます。Arduinoの画面からFile>Sketchbook>Examples>Library-Matrix>hello-matrixを選ぶと、プログラムが現れますが、ピン設定に少し変更を加えます。
既存サンプルでは、

pin 0: data (din)
pin 1: load (load)
pin 2: clock (clk)

となっていますが、0番ピンと1番ピンは使わず、

pin 2: data (din)
pin 3: load (load)
pin 4: clock (clk)

に変更することにします。こうすることで、プログラムのデータをアップロードする時やシリアル通信の際に信号が干渉されずにすみます。


//ライブラリを取り込む
#include <Sprite.h>
#include <Matrix.h>

//各ピンの設定
//pin 2: DIN
//pin 3: LOAD
//pin 4: CLK
Matrix myMatrix = Matrix(2, 4, 3);

void setup(){
}

void loop(){
myMatrix.clear(); //表示内容をクリアする

delay(1000);

//ピクセルを指定し表示する
myMatrix.write(1, 5, HIGH);
myMatrix.write(2, 2, HIGH);
myMatrix.write(2, 6, HIGH);
myMatrix.write(3, 6, HIGH);
myMatrix.write(4, 6, HIGH);
myMatrix.write(5, 2, HIGH);
myMatrix.write(5, 6, HIGH);
myMatrix.write(6, 5, HIGH);

delay(1000);
}


以下のように表示(1秒おきに点滅)されれば、配線などに問題ないことになります。write()で、X座標(0〜7)とY座標、ならびにHIGHかLOW(あるいは1か0)を代入し個々のLEDの点灯/消灯を指定します。



最初のArduino側のピンの設定(既存サンプルのコードに変更を加える)と、配線を間違わなければ、座標指定で点灯/消灯を制御できるので、それほど難しくはないと思います。今回のマトリクスLED用のライブラリを使うには、メニューバーのSketch>Import Library>MatrixとSpriteを選択すればインクルードされます。

次は、Spriteという基準となる絵柄を設定し、それが動く(横に流れる)表示方法を行います。Arduinoの画面からFile>Sketchbook>Examples>Library-Matrix>sprite-animationを選択し、このサンプルを使うことにします。前回同様、ピン設定は、

pin 0: data (din)
pin 1: load (load)
pin 2: clock (clk)

となっていますが、0番ピンと1番ピンは使わず、

pin 2: data (din)
pin 3: load (load)
pin 4: clock (clk)

に変更します。


//ライブラリを取り込む
#include <Sprite.h>
#include <Matrix.h>

//各ピン設定
//DIN:2
//LOAD:3
//CLK:4
Matrix myMatrix = Matrix(2, 4, 3);//DIN,CLK,LOAD

//スプライトの指定
//幅、高さ、絵柄を二進数で指定
Sprite wave = Sprite(
8, 4,
B00011000,
B00100100,
B01000010,
B10000001
);

void setup()
{
}

//X座標の変数を用意
int x = 0;

void loop(){
//スプライトの配置
myMatrix.write(x, 2, wave);
//もうひとつのスプライトの配置
myMatrix.write(x - 8, 2, wave);
//点灯時間設定
delay(75);
//画面をクリア
myMatrix.clear();

//アニメーション(カスケーディング)
if(x == 8){//8になったら0に戻す
x = 0;
}
x++;//X座標の変数を増加させる
}


Sprite()で、絵柄の幅、高さを指定し、二進数で点灯させる絵柄(0は消灯箇所、1は点灯箇所)をつくり設定します。write()で、絵柄の配置座標(左上の座標)と絵柄のオブジェクトを指定し表示させます。write()の括弧内のX座標やY座標は変数を用いて変化させることができるので、カスケーディング(絵柄が流れて表示される)の制御も簡単にできます。このサンプルでは、8コマ前にもうひとつの同じ絵柄を用意しておき、二つの絵柄を使用して途切れなく連続して絵柄が流れていくように表示しています。

また以下のようにSpriteを複数用意しておけば、入れ替わりで異なる絵柄を表示できます。


//ライブラリを取り込む
#include <Sprite.h>
#include <Matrix.h>

//各ピンの設定
//pin 2: DIN
//pin 3: LOAD
//pin 4: CLK
Matrix myMatrix = Matrix(2, 4, 3);

//スプライトの指定
//幅、高さ、絵柄を二進数で指定
Sprite pattern1 = Sprite(
8, 8,
B11111111,
B00000000,
B11111111,
B00000000,
B11111111,
B00000000,
B11111111,
B00000000
);

Sprite pattern2 = Sprite(
8, 8,
B10101010,
B10101010,
B10101010,
B10101010,
B10101010,
B10101010,
B10101010,
B10101010
);

Sprite pattern3 = Sprite(
8, 8,
B11110000,
B11110000,
B11110000,
B11110000,
B00001111,
B00001111,
B00001111,
B00001111
);

Sprite pattern3 = Sprite(
8, 8,
B00001111,
B00001111,
B00001111,
B00001111,
B11110000,
B11110000,
B11110000,
B11110000
);


void setup()
{
}

//X座標の変数を用意
int x = 0;

void loop(){
//スプライトの配置
myMatrix.write(0, 0, pattern1);
//点灯時間設定
delay(200);
//画面をクリア
myMatrix.clear();

myMatrix.write(0, 0, pattern2);
delay(200);
myMatrix.clear();

myMatrix.write(0, 0, pattern3);
delay(200);
myMatrix.clear();

myMatrix.write(0, 0, pattern4);
delay(200);
myMatrix.clear();
}


関連:
・「Arduino マトリクスLED1」(ICを使わずマトリクスLEDを制御する方法)
MAX7219データシート(MAXIM JAPAN)

7/30/2008

Processing サウンド4/スクラッチ

前回までSoniaライブラリを使って、音源の再生、逆再生ならびにテンポ(スピード)変換をしました。これらを組み合わせると、スクラッチ(ターンテーブルやCDJ)のようなことができるので、応用としてプログラミングしてみたいと思います。マウスを上下(Y座標)にドラッグすることで、スクラッチすることにします。画面下方へドラッグすれば順方向へ、画面上方へドラッグすれば逆方向へ曲が再生されるようにします。そのとき、ドラッグした量に比例して再生される速度も変化するようにします。スクラッチ中やスクラッチを解除したときに、ターンテーブルの回転数の立ち上がりを少し鈍くするために、テンポの変化にフィルターをかけることにします。
*音源データは予め用意して、スケッチフォルダ内のdataフォルダ内にいれておいて下さい(方法については、「Processing サウンド1/Sonia」を参照)。


//ライブラリを取り込む
import pitaru.sonia_v2_9.*;

//順再生と逆再生のオブジェクトを用意
Sample tuneFW;
Sample tuneRV;
//音源データの長さの変数
int dataLength;
//順再生の再生位置の変数
int currentFrameFW;
//逆再生の再生位置の変数
int currentFrameRV;
//テンポの変数
float tempo=0;
//フィルター付きテンポの変数
float tempoFiltered;

void setup() {
size(200,200);
//Soniaの使用開始
Sonia.start(this);
//音源の指定
tuneFW = new Sample("music.wav");
//音源の全フレーム数を調べておく
dataLength=tuneFW.getNumFrames();

//逆再生用のデータを作成
tuneRV= new Sample(dataLength);
float[] forward=new float[dataLength];
tuneFW.read(forward);
float[] backward=new float[dataLength];
backward=reverse(forward);
tuneRV.write(backward);

//念のため、順再生/逆再生のフレームレートを調べる
println(tuneFW.getRate()+":"+tuneRV.getRate());

//順再生する
tuneFW.play();
//テンポを1.0倍(標準)にしておく
tempo = 1.0;
}

void draw(){
background(0);
//テンポに少し反応を鈍くするフィルターをかける
tempoFiltered+=(tempo-tempoFiltered)/4;
//テンポ設定
tuneFW.setSpeed(tempoFiltered);
tuneRV.setSpeed(tempoFiltered);

//それぞれの再生位置を取得する
if(tuneFW.isPlaying()){//順再生の時
//順再生の再生位置を記憶させておく
currentFrameFW = tuneFW.getCurrentFrame();
//逆再生の再生位置を全フレーム数から
//順再生の再生位置を差し引いて計算しておく
currentFrameRV = dataLength-currentFrameFW;
}
else{//逆再生の時
//逆再生の再生位置を記憶させておく
currentFrameRV = tuneRV.getCurrentFrame();
//順再生の再生位置を全フレーム数から
//逆再生の再生位置を差し引いて計算しておく
currentFrameFW = dataLength-currentFrameRV;
}
}

//ドラッグしたとき(スクラッチ中)
void mouseDragged(){
//前回と今回のマウスY座標値の差を求める
int difY=mouseY-pmouseY;

if(difY>=0){//差がプラスなら(下向きにドラッグした時)
//再生位置から順再生させる
tuneFW.play(currentFrameFW,dataLength);
//逆再生停止
tuneRV.stop();
}
else{//差がマイナスなら(上向きにドラッグした時)
//再生位置から逆再生させる
tuneRV.play(currentFrameRV,dataLength);
//順再生停止
tuneFW.stop();
}
//差の絶対値を4で割った値をテンポにする
tempo=abs(difY)/4;
}

//マウスを放した時(スクラッチ解除時)
void mouseReleased(){
//再生位置からテンポを1.0倍にして順再生させる
tempo=1.0;
tuneFW.play(currentFrameFW,dataLength);
//逆再生停止
tuneRV.stop();
}

public void stop(){
Sonia.stop();
super.stop();
}

ここをクリックでサンプルのサイトへ移動します。
*MacOSX(Intel)の場合、新たにJSynプラグインをインストールする必要があります。ここをクリックすると、インストール画面に移動します。移動先のページ上の「Click Here to Install JSyn Plugin」のボタンを押してインストールしてください。


スクラッチによって曲が行ったり来たりするので、順再生と逆再生の二つの音源を別々に用意し、交互に切り替えて再生させています(逆再生の音源のつくりかたは「Processing サウンド2/逆再生」を参照)。まずsetup(){...}内の「dataLength=tuneFW.getNumFrames()」によって、曲の全フレーム数を調べておきます。全フレーム数から順再生された分のフレーム数を差し引けば、次に逆再生のされるときの再生箇所が導きだされます。そのため、draw(){...}内で毎回現在順再生か逆再生かをisPlaying()によって判別し、もし順再生なら「currentFrameFW = tuneFW.getCurrentFrame()」で現在の再生位置を調べておき、同時に次に逆再生されるときの再生位置を「currentFrameRV = dataLength-currentFrameFW」で計算して記憶させておきます。
念のために、setup(){...}内の「println(tuneFW.getRate()+":"+tuneRV.getRate())」で、順再生と逆再生のサンプルレートを調べておきます。同じ値ならいいのですが、もし異なる場合は、順再生と逆再生の再生速度が変わってしまうので、draw(){...}内のsetSpeed()で片方のスピード値を半分にするなどしてください。
スクラッチは前回と今回のマウスのY座標の差分をテンポに反映させて再生させています。大きくドラッグすれば、早回しで再生されることになります。ただし音が早回りしすぎるときがあるので、「tempo=abs(difY)/4」というように、値を4で割ってスケールダウンしています(4以外の数値を入れて調整してみてください)。ここで得られたテンポの値は、draw(){...}内の「tempoFiltered+=(tempo-tempoFiltered)/4」に代入され、テンポの変化が少し鈍く反映されるようにフィルターをかけています。ここでも4で割っていますが、もう少し反応を鈍くさせたい場合は4より大きい値で割ってください(少し反応を鈍くさせたほうが、スクラッチらしい音になるので、そうしています)。abs()は絶対値に変換する関数です。最終的にテンポに代入される値はプラスなので、差分がマイナスの場合にプラスになるように調整しています。
マウスを放したときは、スクラッチを止めた時なので、もともとの順再生の状態に戻るようにし、逆再生は停止させます。その時のテンポも標準の再生スピードになるように1.0に戻しておきます。

関連:
Processing サウンド3/テンポ」--音源再生のテンポ変換をする
Processing サウンド2/逆再生」--逆再生の音源をつくる
Processing サウンド1/Sonia」--音源の再生/停止/ポーズする

今回のプログラムのサンプルサイトへのリンク

*MacOSX(Intel)の場合、新たにJSynプラグインをインストールする必要があります。Windowsの場合も、上記サンプルサイトをオンラインで視聴するためにプラグインが必要となります。ここをクリックすると、インストール画面に移動します。移動先のページ上の「Click Here to Install JSyn Plugin」のボタンを押してインストールしてください。

 iTunes Music Store(Japan)

7/28/2008

Processing サウンド3/テンポ

引き続きSoniaライブラリでの音の制御についてです。今回は曲や音源のスピード(テンポ)を変えてみたいと思います。Soniaでは、setRate()もしくはsetSpeed()で、容易に動的にテンポを変換できます。setRate()の場合は括弧内に0~88200までの値が入ります。その音源の基準のサンプルレートが44100であれば、22050を代入すると半分のスピードになり、88200で2倍のスピードになります。基準のサンプルレートを調べるにはgetRate()を用います。通常なら44100あたりに設定されていると思います。setSpeed()の場合は、0~2.0までの小数点が括弧内に入ります。0.5で半分のスピード、2.0で2倍のスピードになります。今回はsetSpeed()を用いて、マウスを上下(Y軸方向)にドラッグするとテンポが動的に変化するプログラムにします。

*音源データは、前回書いたようにスケッチフォルダ内にdataフォルダを作成し、その中に入れておいて下さい。
*プログラムをランさせた時に「Exception in thread "Thread-2" java.lang.OutOfMemoryError:...」のような赤文字のエラーが出たら、メモリーが足りないということなので、MacosXの場合はメニューバーのProcessing>環境設定を選択し(ウィンドウが現れる)、「Set maximum available memory to ... MB」の欄に256MBなど充分なメモリー(曲や音源のサイズ)を記入し、チェック欄にチェックを入れて下さい。Windowsの場合は、File>Preferencesを選択し、同様に充分なメモリー数を記入しチェックを入れて下さい。


//ライブラリを取り込む
import pitaru.sonia_v2_9.*;
//音源tune(名前は任意)を用意
Sample tune;

void setup() {
//とりあえず画面を200角に設定
size(200,200);
//Sonia開始
Sonia.start(this);
//括弧内に音源名を指定し設定する
tune = new Sample("music.wav");
//音源のサンプルレートを調べる
println(tune.getRate());
//音源の再生
tune.play();
}

void draw(){
//特になし
}

//マウスをドラッグしたとき
void mouseDragged(){
//マウスY座標値を0~2.0の範囲で割り当てる
float tempo=map(mouseY,0,height,0,2.0);
//テンポ(スピード)設定
tune.setSpeed(tempo);
}

//Soniaの使用停止
public void stop(){
Sonia.stop();
super.stop();
}


map()には、1つ目の値が元となるマウスY座標値を入れ、2つ目の値にはその最小値、3つ目がその最大値、4つ目は変換された後の最小値、5つ目が変換された後の最大値を入れます。変化する値をスケーリングしたりオフセットを設けたりして変換させるときに使うと便利です。setSpeed()は0~2.0の値が入るので、マウスY座標値を0~2.0の範囲で変換させるということになります。

関連:
Processing サウンド4/スクラッチ」--曲をスクラッチ演奏する
Processing サウンド2/逆再生」--逆再生の音源をつくる
Processing サウンド1/Sonia」--音源の再生/停止/ポーズする

*MacOSX(Intel)の場合、新たにJSynプラグインをインストールする必要があります。ここをクリックすると、インストール画面に移動します。移動先のページ上の「Click Here to Install JSyn Plugin」のボタンを押してインストールしてください。

 iTunes Music Store(Japan)

7/24/2008

Processing サウンド2/逆再生

前回は音源を用意し再生/停止(ポーズ)のプログラムをしました。今回もまた「Sonia」ライブラリを使用しますが、用意した音源を逆再生するプログラムをしてみます。前回少し触れたように、音源データはフレームレートの数値で再生箇所や経過時間などを制御できます。時間の経過に合わせて、連続する音のデータを次々と読み込んで再生していく仕組みになっています。逆再生の場合は、配列を用意し音源データの最終フレームから先頭フレームまでを読み込んで、逆方向に配置されたデータをつくり、それを再生させます。

クリックで順再生と逆再生が切り替えられるプログラムを以下に書きます。音源は予め用意して、sketchフォルダ内のdataフォルダ(なければ新規作成)にいれておいて下さい。
尚、プログラムをランさせた時に「Exception in thread "Thread-2" java.lang.OutOfMemoryError:...」のような赤文字のエラーが出たら、メモリーが足りないということなので、MacosXの場合はメニューバーのProcessing>環境設定を選択し(ウィンドウが現れる)、「Set maximum available memory to ... MB」の欄に256MBなど充分なメモリー(曲や音源のサイズ)を記入し、チェック欄にチェックを入れて下さい。Windowsの場合は、File>Preferencesを選択し、同様に充分なメモリー数を記入しチェックを入れて下さい。


//ライブラリの取り込み
import pitaru.sonia_v2_9.*;

//順再生/逆再生の二つのオブジェクトを用意
Sample forwardTune;
Sample reverseTune;

//順再生/逆再生の切替フラグを用意
//trueで順再生、falseで逆再生
boolean direction=true;

void setup() {
size(200,200);

Sonia.start(this);

//使う音源を指定する
forwardTune = new Sample("music.wav");
//音源データの全体の長さ(フレーム数)を取得する
int dataLength=forwardTune.getNumFrames();

//順再生データ用の配列を全データの長さ分だけ用意
float[] forwardArray=new float[dataLength];
//順再生データを配列として読み込む
forwardTune.read(forwardArray);

//逆再生データ用の配列を全データの長さ分だけ用意
float[] backwardArray=new float[dataLength];
//順再生データを逆配列に置き換える
backwardArray=reverse(forwardArray);

//逆再生音源を用意
reverseTune= new Sample(dataLength);
//逆再生データを逆再生音源として書き出す
reverseTune.write(backwardArray);

//まず順再生音源を再生
forwardTune.play();
}

void draw(){
//特になし
}

void mousePressed(){
if(direction==false){
direction=true;
reverseTune.stop();//逆再生停止
forwardTune.play();//順再生
}else{
direction=false;
forwardTune.stop();//順再生停止
reverseTune.play();//逆再生
}
}

public void stop(){
Sonia.stop();
super.stop();
}


手順としては、用意した音源をSample()で指定し、全体のフレーム数(全データの長さ)をgetNumFrames()で数えます。データを変換するために順再生と逆再生の二つの配列を用意します。全体のフレーム数だけ配列のデータが必要になります。read()を用いて配列として全データを読み込みます。読み込んだ全データをreverse()で逆方向の配列に置き換えます。置き換えられた配列をwrite()で書き出し、逆再生の音源として取り込みます。今回は使いませんでしたが、getCurrentFrame()を用いて、反転する箇所のフレーム数を記憶させておけば、クリックするごとに行ったり来たりするような再生が可能になります。

関連:
Processing サウンド4/スクラッチ」--曲をスクラッチ演奏する
Processing サウンド3/テンポ」--音源再生のテンポ変換をする
Processing サウンド1/Sonia」--音源の再生/停止/ポーズする

*MacOSX(Intel)の場合、新たにJSynプラグインをインストールする必要があります。ここをクリックすると、インストール画面に移動します。移動先のページ上の「Click Here to Install JSyn Plugin」のボタンを押してインストールしてください。

 iTunes Music Store(Japan)


[目次:Processing関係]  [HOMEへ戻る]  [目次:Arduino関係]