楽器アプリを作ってみよう!③
どんな楽器アプリを考えているかというと、端末の傾きで音程を決めるアプリです。
左右に傾けて音程をコントロールできれば面白いかな? という単純な発想です。
さてさて、端末の傾きを調べるとなると....加速度センサーを使用する必要がでてきました。
とりあえず、実際に作って調べてみよう。
という事で、以下のコードを書いて動かしてみました。
package app.SensorTest;
import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
public class SensorTest extends Activity implements SensorEventListener {
private boolean registeredSensor = false;
private SensorManager sensorManager;
private MainView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
view = new MainView(this);
setContentView(view);
}
@Override
protected void onResume()
{
super.onResume();
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensors.size() > 0) {
Sensor sensor = sensors.get(0);
registeredSensor = sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
}
}
@Override
protected void onPause()
{
if (registeredSensor)
{
sensorManager.unregisterListener(this);
registeredSensor = false;
}
super.onPause();
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void onSensorChanged(SensorEvent event) {
view.setData(event.values);
view.invalidate();
}
}
package app.SensorTest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.*;
public class MainView extends View {
private float data[] = {0,0,0};
public MainView(Context context) {
super(context);
}
public void setData(float[] fdata)
{
data[0] = fdata[0];
data[1] = fdata[1];
data[2] = fdata[2];
}
protected void onDraw(Canvas Canvas)
{
Paint paint = new Paint();
paint.setColor(Color.WHITE);
Canvas.drawText(String.valueOf(data[0]), 0, 20, paint);
Canvas.drawText(String.valueOf(data[1]), 0, 40, paint);
Canvas.drawText(String.valueOf(data[2]), 0, 60, paint);
}
}
実際に調べてみると、机の上に置いているだけでも、かなり値が変化します。
ちょっと予想していなかったので、びっくりです。
移動平均等でデータの変化が緩やかになるようにしないと、楽器としてキビシイかな.....という感じでした。
実際に音程を決める処理を組むときには、工夫が必要です。
楽器アプリを作ってみよう!②
購入した、「Android2.1プログラミングバイブル」には、音楽ファイルの再生については記載されているものの、任意に発音する方法については、記載されていませんでした。
いろいろ調べてみると、AndroidでもPCM音源を制御できるらしいという事がわかりました。
使用するクラスは、「AudioTrack」です。
AudioTrackクラスにサンプリングレート、エンコードを設定して、波形データを入力する事で発音します。
まずは、ラの音を出すプログラムを作りました。
音色を決める波形 矩形波
ラの音の周波数 440Hz
滑り出しは、上々で上手く音が鳴りました。
キーボードの様に鍵盤を押し続けている間、音を鳴らし続けるには、発音の間入力した波形データを再生し続ける必要があるります。鍵盤の動きにリニアに反応させようとすると、短い時間の波形データを繰り返し再生する必要があります。
AudioTrackクラスを使いこなすには、Waveファイルフォーマットの知識が必要になってきましたので勉強して使いこなしたいと思います。
楽器アプリを作ってみよう!①
選んだプラットホームは、Android です。
この場で、開発経過等を書いて行きたいと思います。
さて、どんなアプリケーションにするかは、イメージが固まっているのですが、Androidの知識がない!
とりあえず本買って勉強しようという事で、「Android2.1プログラミングバイブル」を購入!
Android2.1プログラミングバイブル (2010/05) 布留川 英一 商品詳細を見る |
Javaに対しての知識はあるので、言語の敷居は低いのですが、Android の勉強してみると、かなり癖があるなぁという感想です。
少し、苦労しそうですが、頑張って完成させます!
完成したら、ここにでもアップしたいと思っています。
暖かく? 見守ってて下さい m(_"_)m