【发布时间】:2014-02-20 15:38:32
【问题描述】:
我目前正在为 Android 中的示例音序器编写一些代码。我正在使用 AudioTrack 类。有人告诉我,获得准确计时的唯一正确方法是使用 AudioTrack 的计时。 EG 我知道如果我将 X 个样本的缓冲区写入以每秒 44100 个样本的速率播放的 AudioTrack,则写入时间将是 (1/44100)X 秒。
然后您使用该信息来了解何时应该编写哪些示例。
我正在尝试使用这种方法来实现我的第一次尝试。我只使用了一个样本,并以 120bpm 的速度将其写为连续的 16 分音符。但由于某种原因,它以 240bpm 的速度播放。
首先,我检查了我的代码,以得出速度 X 的第 16(纳秒)音符的时间。它检查出来。
private void setPeriod()
{
period=(int)((1/(((double)TEMPO)/60))*1000);
period=(period*1000000)/4;
Log.i("test",String.valueOf(period));
}
然后我验证了我的代码以纳秒为单位以 44100khz 播放缓冲区的时间,这是正确的。
long bufferTime=(1000000000/SAMPLE_RATE)*buffSize;
所以现在我认为音轨的播放速度与 44100 不同。也许是 96000khz,这可以解释速度加倍的原因。但是当我实例化 audioTrack 时,它确实设置为 44100khz。
最终 int SAMPLE_RATE 设置为 44100
buffSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffSize,
AudioTrack.MODE_STREAM);
所以我很困惑为什么我的节奏会加倍。我运行了一个调试来比较经过时间的 audioTrack 与经过的系统时间,并且似乎音轨的播放速度确实是应有的速度的两倍。我很困惑。
只是为了确保,这是我的播放循环。
public void run() {
// TODO Auto-generated method stub
int buffSize=192;
byte[] output = new byte[buffSize];
int pos1=0;//index for output array
int pos2=0;//index for sample array
long bufferTime=(1000000000/SAMPLE_RATE)*buffSize;
long elapsed=0;
int writes=0;
currTrigger=trigger[triggerPointer];
Log.i("test","period="+String.valueOf(period));
Log.i("test","bufferTime="+String.valueOf(bufferTime));
long time=System.nanoTime();
while(play)
{
//fill up the buffer
while(pos1<buffSize)
{
output[pos1]=0;
if(currTrigger&&pos2<sample.length)
{
output[pos1]=sample[pos2];
pos2++;
}
pos1++;
}
track.write(output, 0, buffSize);
elapsed=elapsed+bufferTime;
writes++;
//time passed is more than one 16th note
if(elapsed>=period)
{
Log.i("test",String.valueOf(writes));
Log.i("test","elapsed A.T.="+String.valueOf(elapsed)+" elapsed S.T.="+String.valueOf(System.nanoTime()-time));
time=System.nanoTime();
writes=0;
elapsed=0;
triggerPointer++;
if(triggerPointer==16)
triggerPointer=0;
currTrigger=trigger[triggerPointer];
pos2=0;
}
pos1=0;
}
}
}
【问题讨论】:
标签: android audio signal-processing audiotrack vst