うみの河童

Androidで波形を音に

今やりたいことがあって、
そのために必要になったから調べてみた。

こちらのサイトを参考にさせていただきました!
ありがとうございます。

夢見る少女の開発メモさん

にュウさいとさん

八角研究所さん

このサンプルでのミソは
波形を生成して配列で返している
createSquareWave関数

音の波形(523.25とか)を
サンプリング周波数(44100)に合わせて、、、
って言っても理解できるまでに時間がかかってしまったんだけど(笑)

音の周波数の1波を表すのに、
サンプリング周波数の1波がいくつ必要なのか??
というのを出しているんじゃないかな?と。

上のサイトさんのサンプルを自分なりにコメントつけたり
書き換えたりしました。

これで
やりたいことに1歩近づいたぜ!!!

せぃせぃ

[java]
package jp.main.umikappa;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;

public class BeepTest extends Activity
{

static int SAMPLING_RATE = 44100;

AudioTrack track;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

track = new AudioTrack(
//streamType どの音を出すかってこと?
AudioManager.STREAM_MUSIC,
//AudioManager = Androidで音量を調節するもの
//音楽音量(STREAM_MUSIC)
//詳しくはhttp://techbooster.jpn.org/andriod/device/1253/

//sampleRateInHz:サンプリング周波数
SAMPLING_RATE,

//channelConfig(モノラル指定)
AudioFormat.CHANNEL_CONFIGURATION_MONO,

//audioFormat
AudioFormat.ENCODING_DEFAULT,

//bufferSizeInBytes:バイト単位のバッファサイズ
//サンプリングレートが44100でバッファサイズが44100なので、
//このAudioTrackには1秒分の音声データを格納することができます。
44100,

//mode(STREAMモード指定)
AudioTrack.MODE_STREAM
);

//再生
track.play();

//音声データ作成
byte[] audioData_C = createSquareWave(523.25); //C
byte[] audioData_D = createSquareWave(587.33); //D
byte[] audioData_E = createSquareWave(659.26); //E

//音声データの書き込み
//2引数 再生書き込みを開始する位置
//3引数 書き込むバイト長
track.write(audioData_C, 0, audioData_C.length);
track.write(audioData_D, 0, audioData_D.length);
track.write(audioData_E, 0, audioData_E.length);
}

//アプリ中断時の処理
@Override
protected void onStop()
{
track.stop();
track.release();
super.onStop();
}

//サンプリング周波数に合わせて波形を作る
private byte[] createSquareWave(double frequency)
{
//frequency = 周波数(1秒あたり何回繰り返すか)

byte[] b = new byte[SAMPLING_RATE];

int r;

for (int i = 0; i < b.length; i++)
{
r = (int) Math.round(i / (SAMPLING_RATE / frequency));

if(r % 2 == 0)
{
b[i] =(byte)100;
}
else
{
b[i] =(byte)-100;
}
}

return b;
}
}
[/java]