Java 将音频样本直接录制到Android上的音乐文件中

Java 将音频样本直接录制到Android上的音乐文件中,java,android,audio,sampling,Java,Android,Audio,Sampling,我正在制作一个android应用程序,我希望能够将一些在音轨上播放的音频录制到一个音乐文件中,对我来说,制作一个播放样本的ArrayList是个好主意,在播放时添加每个样本。我已经做了一些我希望能工作的东西,但之后在“音乐”应用程序下什么也没显示。请看一下我的代码,告诉我这是否是保存到音乐中的正确方法,以及我需要做些什么才能使其正常工作。请特别关注startRecord()和stopRecording() package com.example.test; 导入java.io.File; 导入j

我正在制作一个android应用程序,我希望能够将一些在音轨上播放的音频录制到一个音乐文件中,对我来说,制作一个播放样本的ArrayList是个好主意,在播放时添加每个样本。我已经做了一些我希望能工作的东西,但之后在“音乐”应用程序下什么也没显示。请看一下我的代码,告诉我这是否是保存到音乐中的正确方法,以及我需要做些什么才能使其正常工作。请特别关注startRecord()和stopRecording()

package com.example.test;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.graphics.Point;
导入android.media.AudioFormat;
导入android.media.AudioManager;
导入android.media.AudioTrack;
导入android.os.Bundle;
导入android.os.Environment;
导入android.os.Handler;
导入android.view.Display;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.EditText;
公共类Afspl扩展活动{
公众视野六;
私有点大小;
显示显示;
公共int宽、高、cx、cy;
布尔doPlay=false;
线声播放器;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
disp=getWindowManager().getDefaultDisplay();
试一试{
显示getSize(大小);
宽=尺寸x;
高=尺寸y;
}捕获(例外e){
wide=disp.getWidth();
高=显示getHeight();
}
cx=0;//跟踪鼠标x
cy=0;//跟踪鼠标y
vi=新的绘图视图(getApplicationContext());
setContentView(vi);
soundPlayer=新线程(新可运行(){
公开募捐{
整数计数=0;
while(true){
试一试{
睡眠((长)(持续时间*10));
}捕获(例外e){}
如果(!doPlay){
如果(count==1)跟踪.stop();
继续;
}
内部注释=cy*12/高;
如果(cx>宽/2)注释+=12;
intfreq=(int)(440*数学功率(1.059463,注));
系统输出打印项次(注+“,”+频率);
genTone(freq);
如果(计数=0){
handler.post(新的Runnable(){
公开募捐{
播放声音();
}
});
计数++;
}否则{
handler.post(新的Runnable(){
公开募捐{
track.release();
播放声音();
}
});
}
}
}
});
soundPlayer.start();
}
类DrawView扩展了视图{
油漆=新油漆();
公共绘图视图(上下文){
超级(上下文);
}
公共空白onDraw(画布c){
int red=256;
绿色整数=0;
int蓝色=0;
int-curInc=0;
对于(int i=0;i=256){
curInc=1;
}
}
else if(curInc==1){
红色-=256/2;
如果(红色=256){
curInc=3;
}
}
否则如果(curInc==3){
绿色-=256/2;
如果(绿色=256){
curInc=5;
}
}否则如果(curInc==5){
蓝色-=256/2;
}
整数宽度=宽;
int start=0;
如果(i=12){
星形=(i-12)*高度;
endy=(i-11)*高度;
}
c、 drawRect(起点、起点、宽度、终点、油漆);
}
油漆。设置颜色(颜色。白色);
c、 drawRect(宽-100,高-100,宽,高,油漆);
}
公共整数getColor(整数r、整数g、整数b){
系统输出println(r+,“+g+,”+b);
内部红色=(r高-50){
如果(!isRecording)startRecord();
否则停止录制();
}
返回true;
case MotionEvent.ACTION\u移动:
cx=(int)me.getX();
cy=(int)me.getY();
返回true;
违约:
返回super.onTouchEvent(我);
}
}
公共双倍持续时间=1;
公共int采样器=8000;
公共int numSamples=(int)持续时间*采样器;
公共最终双样本[]样本=新双样本[numSamples];
公共最终字节[]generatedSnd=新字节[numSamples*2];
public Handler=new Handler();
音轨;
公用电话(国际频率){
对于(int i=0;i>>8);
如果(isRecording){
toRec.add((字节)(val&0x00ff));
toRec.add((字节)((val&0xff00)>>>8));
}
}
}
公共空间播放声音(){
曲目=新的音频曲目(AudioManager.STREAM\u MUSIC、sampleRate、AudioFormat.CHANNEL\u OUT\u MONO、AudioFormat.ENCODING\u PCM\u 16位、generatedSnd.length、AudioTrack.MODE\u STATIC);
track.write(generatedSnd,0,generatedSnd.length);
track.play();
}
public List toRec=new ArrayList();
布尔值
package com.example.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

public class Afspl extends Activity {

    public DrawView vi;
    private Point size;
    Display disp;
    public int wide, high, cx, cy;
    boolean doPlay = false;
    Thread soundPlayer;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        disp = getWindowManager().getDefaultDisplay();
        try{
            disp.getSize(size);
            wide = size.x;
            high = size.y;
        }catch(Exception e){
            wide = disp.getWidth();
            high = disp.getHeight();
        }

        cx = 0; //tracks mouse x
        cy = 0; //tracks mouse y
        vi = new DrawView(getApplicationContext());
        setContentView(vi);
        soundPlayer = new Thread(new Runnable(){
            public void run(){
                int count = 0;
                while(true){
                    try{
                    Thread.sleep((long)(duration * 10));
                    }catch(Exception e){}
                    if(!doPlay){
                        if(count==1)track.stop();
                        continue;
                    }
                    int note = cy * 12 / high;
                    if(cx > wide/2)note+=12;
                    int freq = (int)(440 * Math.pow(1.059463, note));
                    System.out.println(note + ", " + freq);
                    genTone(freq);
                    if(count==0){
                    handler.post(new Runnable(){
                        public void run(){
                            playSound();
                        }
                    });
                    count++;
                    }else{
                        handler.post(new Runnable(){
                            public void run(){
                                track.release();
                                playSound();
                            }
                        });
                    }
                }
            }
        });
        soundPlayer.start();
    }

    class DrawView extends View{
        Paint paint = new Paint();

        public DrawView(Context context){
            super(context);
        }

        public void onDraw(Canvas c){
            int red = 256;
            int green = 0;
            int blue = 0;
            int curInc = 0;
            for(int i=0; i<24; i++){
                if(curInc==0){
                    green += 256/2;
                    if(green>=256){
                        curInc = 1;
                    }
                }
                else if(curInc == 1){
                    red -= 256/2;
                    if(red<=0){
                        curInc = 2;
                    }
                }
                else if(curInc == 2){
                    blue += 256/2;
                    if(blue >= 256){
                        curInc = 3;
                    }
                }
                else if(curInc == 3){
                    green -= 256/2;
                    if(green<=0){
                        curInc = 4;
                    }
                }
                else if(curInc == 4){
                    red += 256/2;
                    if(red>=256){
                        curInc = 5;
                    }
                }else if(curInc == 5){
                    blue -= 256/2;
                }
                int width = wide;
                int start = 0;
                if(i<12){
                    width/=2;
                }
                else{
                    start = width/2;
                    if(red==0){
                        red = 128;
                    }
                    if(green == 0){
                        green = 128;
                    }
                    if(blue == 0){
                        blue = 128;
                    }
                }

                paint.setColor(getColor(red, blue, green));
                int height = high / 12;
                int starty = i * height;
                int endy = (i+1) * height;
                if(i>=12){
                    starty = (i-12) * height;
                    endy = (i-11) * height;
                }
                c.drawRect(start, starty, width, endy, paint);
            }
            paint.setColor(Color.WHITE);
            c.drawRect(wide-100, high-100, wide, high, paint);
        }
        public int getColor(int r, int g, int b){
            System.out.println(r + "," + g + "," + b);
            int red = (r << 16) & 0x00ff0000;
            int green = (g << 8) & 0x0000ff00;
            int blue = b & 0x000000ff;
            return 0xff000000 | red | green | blue;
        }
    }

    public boolean onTouchEvent(MotionEvent me){
        int type = me.getActionMasked();
        switch(type){
        case MotionEvent.ACTION_DOWN:
            cx = (int)me.getX();
            cy = (int)me.getY();
            doPlay = true;
            return true;
        case MotionEvent.ACTION_UP:
            doPlay = false;
            if(cx > wide-50 && cy > high-50){
                if(!isRecording)startRecord();
                else stopRecording();
            }
            return true;
        case MotionEvent.ACTION_MOVE:
            cx = (int)me.getX();
            cy = (int)me.getY();
            return true;
        default:
            return super.onTouchEvent(me);
        }
    }

    public double duration = 1;
    public int sampleRate = 8000;
    public int numSamples = (int)duration * sampleRate;
    public final double[] samples = new double[numSamples];
    public final byte[] generatedSnd = new byte[numSamples * 2];
    public Handler handler = new Handler();
    AudioTrack track;


    public void genTone(int freq){
        for(int i = 0; i<numSamples; i++){
            samples[i] = Math.pow(-1, (float)(i / (sampleRate/freq)));
        }
        int idx = 0;
        int volume = 32767 * cx/wide;
        for (final double dVal : samples) {
            final short val = (short) ((dVal+1) * volume);

            generatedSnd[idx++] = (byte) (val & 0x00ff);
            generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
            if(isRecording){
                toRec.add((byte)(val & 0x00ff));
                toRec.add((byte)((val & 0xff00) >>> 8));
            }
        }
    }


    public void playSound(){
        track = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC);
        track.write(generatedSnd, 0, generatedSnd.length);
        track.play();
    }

    public List<Byte> toRec = new ArrayList<Byte>();
    boolean isRecording = false;

    public void startRecord(){
        isRecording = true;
        toRec.clear();
    }

    String name;
    public void setName(String str){
        name=str;
    }

    public void stopRecording(){
        Byte[] samplesNew = toRec.toArray(new Byte[toRec.size()]);
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Song Name");
        alert.setMessage("Enter Song Title");
        final EditText input = new EditText(this);
        alert.setView(input);
        final String name = "";

        alert.setPositiveButton("OK", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int inter){
                setName(input.getText().toString());
            }
        });

        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int inter){

            }
        });

        alert.show();

        setName(name + ".mp3");

        File writeTo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), "name");
        if(!writeTo.mkdirs()){
            System.out.println("Dir not created");
        }

        FileOutputStream stream = null;

        try {
            stream = new FileOutputStream(writeTo);
            for(Byte b : samplesNew){
                stream.write(b);
            }
            stream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }



    }

}