INDEX(各項目ごとの目次)

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

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

ラベル サウンド の投稿を表示しています。 すべての投稿を表示
ラベル サウンド の投稿を表示しています。 すべての投稿を表示

12/06/2008

スピーカ/音出力について

音を出力するものとしてコーンスピーカが一般的に使われますが、それ以外にも以下のようなものがあります。

・「圧電スピーカ」:パルスを送り振動させブザーのような音を鳴らす(「Arduino 圧電スピーカ」を参照)。
・「振動モータ」:偏心錘がついたモータによって振動させる(携帯電話のバイブレータなど)。
・「ソレノイド」:電磁石の力によって金属のシリンダーを往復運動させ、物体などをたたくことで音を出す。
・「パラメトリックスピーカ」:指向性スピーカ(超音波スピーカによる方向性/反射性のある音のビーム)。


・超磁歪素子という振動体を物体に接触させると、その物体がスピーカのように振動し音を出す機器として以下のようなものがあります。

どこでも伝導スピーカー ホワイト(p-0034-39)
ピーナッツクラブ
売り上げランキング: 7277

1550円

ピタッとスピーカー(ブルー)DN-A002BU
株式会社 StrapyaNext
売り上げランキング: 14047

2980円から。

何でもスピーカーGPECKER
日本電話施設株式会社
売り上げランキング: 12997

5500円。

エンティス デジタルサウンドジェネレーター Tunebug-Vibe Tunebug-vibe
エンティス (2009-12-18)
売り上げランキング: 3390

7971円。

DESIGN FACTORY どこでもスピーカー
㈱デザインファクトリー
売り上げランキング: 13234

4280円。

NIMZY VIBRO BLASTER SILVER
NIMZY VIBRO BLASTER SILVER
posted with amazlet at 09.07.29
海連 (2006-10-31)
売り上げランキング: 42650



デバイスネット ヨロズオーディオ DN-A001
デバイスネット (2008-12-05)
売り上げランキング: 19195

5577円。



また、音の入力装置(通常のマイク以外)として「ギター用ピックアップ」のように金属弦の振動を磁気的に拾いとる部品もあります。


あるいは磁気テープを読み取る場合、以下のような製品のヘッド部分を取り出して利用することもできます。
カセットテープヘッドについてのまとめ。

680円。
以下は改造例。

11/02/2008

Processing サウンド/Sonia JSynプラグイン

Processingのサウンドライブラリの「Sonia」を、MacOSX(Intel)で使用する場合、新たにJSynプラグインをインストールする必要があります。現ライブラリフォルダにはMacOSX(PowerPC版)のJSyncプラグインしか含まれていないようです。
ここをクリックすると、インストール画面に移動します。移動先のページ上の「Click Here to Install JSyn Plugin」のボタンを押して新しいバージョンのJSyncプラグインをインストールしてください。

関連:
Processing サウンド4/スクラッチ」--Soniaライブラリを使って曲をスクラッチ演奏する
Processing サウンド3/テンポ」--Soniaライブラリで音源再生のテンポ変換をする
Processing サウンド2/逆再生」--Soniaライブラリで逆再生の音源をつくる
Processing サウンド1/Sonia」--Soniaライブラリで音源の再生/停止/ポーズする

 iTunes Music Store(Japan)

10/03/2008

Processing FileChooser/ファイル選択画面の表示

通常Processingでは、プログラム上で使われる画像データや音源データなどは、スケッチフォルダ内のdataフォルダ内に入れておく必要があります。ProcessingはJavaでつくられているため、JavaのGUIライブラリであるSwingを使うことで、ファイルチューザーのダイアログ画面(ファイル選択画面)を表示し、パソコン上にある任意のファイルを選択し開くことができます(尚、この方法はProcessing/Hacks/filechooserで紹介されています)。
関連:「Processing FileChooser2」(Processing 146以降/selectInput()の使い方)


(Windows XPのファイルチューザー画面/ファイル選択ダイアログ)

dataフォルダ内のデータだけでなく、デスクトップ上にある画像データなどを読み込むことができるので、入れ替わりで画像表示させるときなどに便利です。
以下は、クリックするとファイルチューザー(ファイル選択画面)というダイアログ画面が現れ、コンピュータ上の任意の場所にある画像ファイル(jpeg、png、gif、tga)を取り込んで表示するサンプルです。


//JavaのSwingを取り込む
import javax.swing.*;

//画像インスタンスを用意
PImage pimage;

//選択ファイルを用意し
//ファイルを空にしておく
String getFile = null;

void setup(){
//とりあえず表示画面を400角に設定
size(400,400);
}

void draw(){
//選択ファイル名が空でないとき
if(getFile != null){
//ファイルを取り込む
fileLoader();
}
}

//マウスを押したら
void mousePressed(){
//選択ファイル取得処理
getFile = getFileName();
}

//ファイルを取り込むファンクション
void fileLoader(){
//選択ファイルパスのドット以降の文字列を取得
String ext = getFile.substring(getFile.lastIndexOf('.') + 1);
//その文字列を小文字にする
ext.toLowerCase();
//文字列末尾がjpg,png,gif,tgaのいずれかであれば
if(ext.equals("jpg") || ext.equals("png") || ext.equals("gif") || ext.equals("tga")){
//選択ファイルパスの画像を取り込む
pimage = loadImage(getFile);
//イメージ表示
image(pimage, 0, 0, pimage.width, pimage.height);
}
//選択ファイルパスを空に戻す
getFile = null;
}

//ファイル選択画面、選択ファイルパス取得の処理
String getFileName(){
//処理タイミングの設定
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
//ファイル選択画面表示
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
//「開く」ボタンが押された場合
if (returnVal == JFileChooser.APPROVE_OPTION) {
//選択ファイル取得
File file = fc.getSelectedFile();
//選択ファイルのパス取得
getFile = file.getPath();
}
}
//上記以外の場合
catch (Exception e) {
//エラー出力
e.printStackTrace();
}
}
}
);
//選択ファイルパス取得
return getFile;
}


選択ファイルが画像ファイルとして相応しいものであるかどうかを

if(ext.equals("jpg") || ext.equals("png") || ext.equals("gif") || ext.equals("tga")){...}

によって判別しています。選択したファイル名の「.」ドット以降が、「jpg」、「png」、「gif」、「tga」であれば、読み込み可能な画像フォーマットとして処理されます。以下の

String getFileName(){...}

以降はJavaのSwingによるファイルチューザーを呼び出して選択ファイルまでのパスを得るコードなので、そのままコピー&ペーストしても構わないでしょう。
PImageでは、jpg、png、gif、tgaの4種類が読み込み可能ですが、この部分を音源のファイルフォーマットに指定し、PImageのかわりにサウンドライブラリを使えば、音源の選択/読み込み/再生も可能になります。
ファイルチューザー画面を用いて、Processingのサウンドライブラリである「Ess」による音源再生のプログラムを以下に書きます。画面中央の白い正方形をクリックすれば、音源選択の画面が現れます。今回利用できる音源のフォーマットは、「wav」だけとします。dataフォルダの中にある音源だけでなく、iTuneなどの音楽ライブラリの中から曲を選ぶこともできるはずです。白い正方形以外の周辺の場所をクリックすれば、再度音源が再生されます。尚、「Ess」ライブラリをダウンロード+インストールしておく必要があります。また、曲などの大きな音源データの場合は、ProcessingのメニューバーからPreferencesあるいは環境設定で、メモリーを増やしておく必要があります(「Increase maximum available memory to [ ]MB」という欄にチェックを入れ、データ量に相当するメモリー数を記入して下さい)。


//Essサウンドライブラリの取り込み
import krister.Ess.*;
//音源インスタンスの用意
AudioChannel mySample;

//JavaのSwingライブラリの取り込み
import javax.swing.*;

String getFile = null;

void setup(){
size(200,200);
//Ess使用開始
Ess.start(this);
background(100,100,30);
rectMode(CORNER);
}

void draw(){
//画面中央白い正方形の描画
rect(width/2-25,height/2-25,50,50);
if(getFile != null){
fileLoader();
}
}

void mousePressed(){
//クリックの箇所が白い正方形以内なら
if(mouseX>width/2-25 && mouseX<width/2-25+50 && mouseY>height/2-25 && mouseY<height/2-25+50){
//選択ファイル所得処理
getFile = getFileName();
}
else{//白い正方形以外の箇所をクリックしたら
//音源ファイルが空ではないとき
if(mySample!=null){
//音源再生
mySample.play();
}
}
}

void fileLoader(){
String ext = getFile.substring(getFile.lastIndexOf('.') + 1);
ext.toLowerCase();
//選択したファイルが「wav」フォーマットなら
if(ext.equals("wav") ){
//音源ファイルの指定
mySample=new AudioChannel(getFile);
//音源再生
mySample.play();
}
getFile = null;
}

//ファイル選択画面、選択ファイルパス取得の処理
String getFileName(){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
getFile = file.getPath();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
);
return getFile;
}

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

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 サウンド1/Sonia

今回は、Processingを使ってサウンド制御をしてみます。「Sonia」という音のライブラリを使用します。音に関してはこの他に「Minim」や「Ess」というライブラリもあります。

Sonia」を利用するには、
・「Sonia」サイトへ行く。
・「download」をクリック。
・Sonia 2_9 for Processing V90 [ZIP]の[ZIP]部分をクリック。
・ダウンロードが開始され、デスクトップなどに展開する。
・展開したファイル(sonia_v2_9)をMacosXなら/Application/Processing0135/libraries内に入れる。
 WindowsならC:¥Program File¥processing-0135-expert¥libraries内に入れる。
JSynプラグインをインストールする(画面の指示に従って自動インストール)。

・インストール完了
*Processingを開いたままインストールした場合は、Processingを再起動すれば使うことができます。

「Sonia」では、wavまたはaiffのフォーマットを読み込むことができます。まず、これらのフォーマットの音源を用意します。今回はwavフォーマットを使用することにします。

wavフォーマットの音源がない場合は、既にiTunesに登録してある曲(音源)をwavフォーマットに変換し直して使用することができます。

iTuneで音源をwavフォーマットに変換する方法:

・iTunesを起動し、「iTunes/環境設定」を開く。
・環境設定ウィンドウ内の「詳細」をクリック。
・「詳細」設定の「読み込み」をクリック。
・「読み込み方法:」を「WAVエンコーダ」にする。
・「設定」は「自動」でも構いません。
・「OK」ボタンをクリック。
・iTunesのもとの画面に戻り、曲(音源)を選択する。
・メニューバー/詳細から「選択項目をWAVに変換」を選ぶ。

以上で選択した音源はwavフォーマットに変換され、iTunes内に保存されます。
iTunes外の音源も、一旦iTunesに取り込んで変換すれば使うことができます。

用意した音源は、プログラムを書いたファイルのsketchフォルダ内のdataフォルダ内(ない場合は新規作成)に入れておきます。(dataフォルダについては、以前の「Processing 文字と画像」を参照)。
新規sketchを開いたら、一旦保存して、そのsketch名が「sketch_08724a」なら、MacosXの場合/User/username/Documents/Processing/sketch_08724a内にdataフォルダを作成し音源を入れておく必要があります。Windowsの場合、C:¥Documents and Setting¥username¥My Documents¥Processing¥sketch_08724a内となります。

音源は各自用意するか、無料音源サイトなどからダウンロードして下さい。
無料音源サイト:音の杜 http://mmworks.info/otonomori/

まずは、単純に音源を再生するプログラムです。プログラムをランさせれば、音源が再生されます。
尚、プログラムをランさせた時に「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");
//音源の再生
tune.play();
}

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

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


まず、ライブラリを取り込んで、音源のオブジェクト名tune(名前は任意)を設定します。setup(){...}内で、Soniaの使用開始をしたら、tune = new Sample("music.wav");で、予め用意しておいたdataフォルダ内の音源を指定します。Sample()の括弧内に音源名を「"」マークで両端を括っていれておきます。tune.play()で音源の再生をします。今回の場合はsetup(){...}内にtune.play()が書かれているので、プログラムをランさせると同時に再生が開始されます。画面表示は特に使わないので、とりあえず200ピクセル角に設定してあります。最後のpublic void stop(){...}は、ウィンドウを閉じたときにSoniaの使用を停止するプログラムです。これを書いておかなければ、ウィンドウを閉じてもSonia自体のプログラムはランし続けてしまうことがあるので、忘れずに書いておいてください。

次に、クリックしたら再生し、もう一度クリックしたら停止するプログラムを書いてみます。


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

//再生/停止の切替フラグを用意
//falseの時停止、trueの時再生とする
boolean start=false;

void setup() {
//とりあえず画面を200角に設定
size(200,200);
//Sonia開始
Sonia.start(this);
//音源名を指定し設定する
tune = new Sample("music.wav");
}

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

//クリックした場合
void mousePressed(){
if(start==false){//フラグが停止の時
start=true; //フラグを再生にする
tune.play(); //音源再生

}else{ //フラグが再生に時
start=false; //フラグを停止にする
tune.stop(); //音源停止
}
}

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


再生と停止を切り替えるためにboolean型の変数(フラグ)start(名前は任意)を用意し、falseなら停止、trueなら再生という状態をクリックするごとに記憶させておきます。同時にそれに応じて停止/再生をtune.stop()とtune.play()で設定します。
ただ、このままでは再生する度に音源の冒頭部分に戻ってしまいます。効果音のような短い音源の場合なら、この設定でもいいのですが、曲にようにもう少し長い音源の場合は、ポーズ(一時停止)させたほうがいいかもしれません。
以下では、クリックして停止したときに、曲の停止箇所を記憶させておき、もう一度クリックした時に、その続きから再生されるようにしてみます。


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

//再生/停止の切替フラグを用意
//falseの時停止、trueの時再生とする
boolean start=false;

//音源全体の長さの変数
int totalFrames;
//再生箇所(停止箇所)の変数
int playHead;

void setup() {
//とりあえず画面を200角に設定
size(200,200);
//Sonia開始
Sonia.start(this);
//音源名を指定し設定する
tune = new Sample("music.wav");
//音源の長さを取得する
totalFrames=tune.getNumFrames();
}

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

//クリックした場合
void mousePressed(){
if(start==false){//フラグが停止の時
start=true; //フラグを再生にする

//再生箇所指定で音源再生
tune.play(playHead,totalFrames);

}else{ //フラグが再生に時
start=false; //フラグを停止にする

//停止箇所を記憶させる
playHead=tune.getCurrentFrame();
tune.stop(); //音源停止
}
}

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


音の場合、通常サンプルレートと呼ばれる数値でデータ量が扱われます。CDなどの場合44100Hzであり、1秒間に44100個の信号が扱われます。2秒ならその倍の88200個の信号になるので、基準のサンプルレートが44100Hzであれば、その数値を数えれば、再生時間(サンプル数)が計算できます。上のプログラムでは、まずtotalFramesという変数を用意して、getNumFrames()という関数で音源全体の時間の長さ(サンプル数)を取得しておきます。10秒間の音源であれば、44100×10=441000となります。そして、playHeadという一時停止させる箇所を記憶させておく変数を用意し、getCurrentFrame()によって、現在の再生箇所を取得します。つまり、マウスをクリックして停止するときに、その停止箇所を記憶させることになります。つぎに、tune.play(playHead,totalFrames)というように括弧内に再生開始箇所と終了箇所を指定して再生させます。こうすることで、クリックで停止させるごとに、停止箇所を記憶しておき、もう一度再生させるときに、前回の停止箇所から再生させることが可能になります。

関連:
Processing サウンド4/スクラッチ」--曲をスクラッチ演奏する
Processing サウンド3/テンポ」--音源再生のテンポ変換をする
Processing サウンド2/逆再生」--逆再生の音源をつくる

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

 iTunes Music Store(Japan)

5/26/2008

Arduino 圧電スピーカ

圧電スピーカは、ブザー(音が鳴る)として機能する一種のスピーカです。圧電スピーカについている2本の線に、そのまま電気を流しても音は鳴りません。音を出すためには、高速でオンとオフを繰り返し(パルス)、内部の金属板を振動させます。プログラム上では、digitalWrite()を用いてHIGHとLOWの切替を行い、delay()によってオン/オフの時間の間隔(周波数)をつくりだすことで制御することができます。
以下では、前回使用した可変抵抗器を用いて、可変的に周波数をつくりだし、圧電スピーカを鳴らす実験をしてみます。

Arduinoのプログラム:
int val=0;

void setup(){
pinMode(13,OUTPUT);
}

void loop(){
val=analogRead(0);
digitalWrite(13,HIGH);
delay(val);
digitalWrite(13,LOW);
delay(val);
}

音はでますが、あまりいい音ではないので、周波数を細かくするために、delay()のかわりにdelayMicroseconds()を用いて同様にテストしてみます。delayMicroseconds()は、delay()の1/1000の時間、つまり1マイクロ秒(1/1000000秒)が単位となります。高音領域が高周波になりすぎないように、valに予め+500のオフセットを設け、500〜1523までの値がdelayMicroseconds()に入ることにします。ちなみに、Arduinoサイトの説明によると、delayMicroseconds()の()内に入れられる数値は、最大で「16383」であり、delayMicroseconds(0)というように()内に「0」を入れると0秒ではなく、それよりも長い時間(~1020マイクロ秒)ディレイしてしまうと書いてあります。設定するときは注意して下さい。

int val=0;

void setup(){
pinMode(13,OUTPUT);
}

void loop(){
val=analogRead(0)+500;
digitalWrite(13,HIGH);
delayMicroseconds(val);
digitalWrite(13,LOW);
delayMicroseconds(val);
}

圧電スピーカは、音を鳴らす以外にセンサとして使うこともできます。圧電スピーカとLEDを直結し、圧電スピーカを指先でたたいて衝撃を与えると電源がなくてもLEDが一瞬発光します。

この発電原理を利用して、圧電スピーカをマイクのような衝撃センサとして用いることが可能となります。圧電スピーカからの電圧をanalogRead()で読み取って、どの程度の値が得られるかテストしてみます。
読み取り値などを画面に出力するには、シリアル通信機能を用いて以下のようなプログラムを付け足し、プログラムが開始したら、Arduinoの画面上のSerial Monitorボタンを押します。

初期設定のSerial.begin(9600)は、通信速度を9600に設定し、シリアル通信を開始するという意味です。Serial.println(val)は、モニタリングするためにvalの値をシリアル通信を用いて出力します。Serial.println()は、データを毎回改行しながら出力します。もうひとつSerial.print()という、改行せずにそのままデータを送り出すものもあります。今回はモニタリングするために、改行して出力したほうが見やすいので、Serial.println()の方を使います。

圧電スピーカに衝撃を与えると値が変化することが確認できます。出力される値が10以上であれば、衝撃を加えたことに反応しているとみなすこととします。以下に、圧電スピーカからの衝撃によってオン/オフするLEDのプログラムを書きます。boolean型の変数を用いて、以前Processingで用いたトグルスイッチのプログラムを付け足します。boolean型の変数checkがfalseの時はLEDがオフの状態、checkがtrueの時はオンの状態とします。
int val=0;
boolean check=false;

void setup(){
//13番ピンをLEDの出力に設定
pinMode(13,OUTPUT);
}

void loop(){
//圧電スピーカ0番ピンの読み取り値
val=analogRead(0);
//読み取り値が10以上の場合
if(val>10){
if(check==false){ //LEDオフ状態の場合
digitalWrite(13,HIGH); //オンに切替
check=true; //オンの状態として記憶
}else{ //LEDオン状態の場合
digitalWrite(13,LOW); //オフに切替
check=false; //オフの状態として記憶
}
}
delay(100);
}


Arduinoのサイト内のLearning/Examples/SoundページにもPlay Melodies with a Piezo Speakerという名前で、圧電スピーカのサンプルが掲載されています。


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