Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事にトラックバックする(FC2ブログユーザー)
http://garlicg.blog92.fc2.com/tb.php/5-d7f8e818

トラックバック

コメント

[C57] ほげー

audioData[B]で配列の7番目を指定してるが
byte[][] audioData = new byte[7][];なので
0~6までしか使えないからIndexOutになってしまう?
  • 2011-12-25 23:37
  • ほげ
  • URL
  • 編集

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

AudioTrackで効果音

AudioTrackはハードウェア寄りの処理ができるクラスで、バイト配列を直接書き込むことができる。
予め音データを作成してから再生するSTATICモードと、音を逐一書き込んで再生するSTREAMモードがある。
音リソースなしでソースで効果音を作成・再生したかったんだけど、なかなか難しい。
色々ごにょったのをとりあえず貼り付け。

public class GAudioTrackActivity extends Activity{
    final int C = 1, D = 2 ,E = 3 , F = 4  , G = 5 ,  A = 6 , B = 7;
    // オーディオデータ
    byte[][] audioData = new byte[7][];
    // ボタン
    Button[] mButton5 = new Button[7];
    // サンプルレート
    final int SAMPLE_RATE = 44100; //44.1KH 
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        createDatas();
        setContentView(createMyLayout());
    }
    
    // 音声データ作成
    void createDatas(){
        audioData[C] = createSquareWave(523.25); 
        audioData[D] = createSquareWave(587.33); 
        audioData[E] = createSquareWave(659.26); 
        audioData[F] = createSquareWave(698.456); 
        audioData[G] = createSquareWave(783.991); 
        audioData[A] = createSquareWave(880.000); 
        audioData[B] = createSquareWave(987.767); 
    }
    
    // 矩形波作成 
    private byte[] createSquareWave(double frequency) {
        byte[] b = new byte[SAMPLE_RATE];
        for (int i = 0; i < b.length; i++) {
            double r = i / (SAMPLE_RATE / frequency);
            b[i] = (byte)((Math.round(r) % 2 == 0) ? 100 : -100);
        }
        return b;
    }
    
    // レイアウト作成メソッド
    // ボタンにリスナー付けた。色々ぐだってるが気にしない。
    private LinearLayout createMyLayout(){
        LinearLayout lay = new LinearLayout(this);
        lay.setOrientation(LinearLayout.VERTICAL);
        for(int i = 0 ; i < mButton5.length ; i++){
            mButton5[i] = new Button(this);
            mButton5[i].setText(String.valueOf(i));
            final int a = i;
            mButton5[i].setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    write(a);
                }
            });
            lay.addView(mButton5[i]);
        }
        return lay;
    }
    
    // 書き込み
    void write(final int code){
         new Thread( new Runnable( ) 
         {
            public void run( )
            {           
                // AudioTrackの作成
                AudioTrack track = new AudioTrack(
                        AudioManager.STREAM_MUSIC,              //streamType
                        SAMPLE_RATE,                            //sampleRateInHz:サンプリング周波数
                        AudioFormat.CHANNEL_CONFIGURATION_MONO, //channelConfig(モノラル指定)
                        AudioFormat.ENCODING_PCM_16BIT,         //audioFormat
                        8000,                                   //bufferSizeInBytes:バッファサイズ
                        AudioTrack.MODE_STREAM);                //mode(STREAMモード指定)
                
                //  再生するよ!!
                track.play();
                
                // AudioTrackに音データを書き込み・再生終わったら破棄
                track.write(audioData[code], 0, audioData[code].length);
        track.stop();
        track.release();

            }
         } ).start();
    }
}


青いとこ以外はお好みで。
楽器みたいなノリで同じ音を再生したかったので、結局スレッド走らせてインスタンス生成した。
音の再生が終わったら使い捨て(笑
ちなみにmainスレでやると、再生中mainスレが止まる。

STATICモードは先にデータ書き込んで再生するだけだから早いのかなーと思ったけど、再度再生するにはreloadStaticData()が必要で、これがちょっと時間かかってる気がした。

・STREAMモードの場合
AudioTrack作成 → play() → write() 

・STATICモードの場合
AudioTrack作成 → write() → play() → stop() → reloadStaticData() → play() → stop() → reloadStaticData() …

STREAMモードの方が音の遅延は少なかったが、遅延は存在。
機会があればもう少し弄ってみたい。



参考。お世話になりました。
にュウさいと
夢見る少女の開発メモ
Frequencies for equal-tempered scale

音声録音&再生とかが向いてるのかな。
N.Yamazaki's blog
NASKIT
この記事にトラックバックする(FC2ブログユーザー)
http://garlicg.blog92.fc2.com/tb.php/5-d7f8e818

トラックバック

コメント

[C57] ほげー

audioData[B]で配列の7番目を指定してるが
byte[][] audioData = new byte[7][];なので
0~6までしか使えないからIndexOutになってしまう?
  • 2011-12-25 23:37
  • ほげ
  • URL
  • 編集

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。