Java android中用于节拍器的高分辨率计时器

Java android中用于节拍器的高分辨率计时器,java,android,timer,high-resolution,Java,Android,Timer,High Resolution,我正在尝试为Android创建一个节拍器,我编写了这段代码,使用声音池以300BPM的速度播放嘟嘟声,但它有时会跳过节拍并产生延迟。我已经研究过了,所有我找到的答案都不能解决我的问题。当我尝试加快bpm计数或使用八分音符而不是四分之一(双倍)时,尤其会发生这种情况。有没有人能指导我朝着正确的方向尽可能准确地做这件事?延迟/节拍跳过是不可接受的。谢谢 final SoundPool sndPool = new SoundPool(3, AudioManager.STREAM_MUSIC,

我正在尝试为Android创建一个节拍器,我编写了这段代码,使用声音池以300BPM的速度播放嘟嘟声,但它有时会跳过节拍并产生延迟。我已经研究过了,所有我找到的答案都不能解决我的问题。当我尝试加快bpm计数或使用八分音符而不是四分之一(双倍)时,尤其会发生这种情况。有没有人能指导我朝着正确的方向尽可能准确地做这件事?延迟/节拍跳过是不可接受的。谢谢

     final SoundPool sndPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
     final int sndHigh = sndPool.load(this, R.raw.high, 1);
     setVolumeControlStream(AudioManager.STREAM_MUSIC);
     Thread th = new Thread(new Runnable(){
          public void run() {
            while(true){
                sndPool.play(sndHigh, 1f, 1f, 1, 0, 1f);
                //Log.d("asd", "beep");
                LockSupport.parkNanos(((240000/300)/4)*1000000); //300bpm
            }
          }
     });
     th.setPriority(Thread.MAX_PRIORITY);
     th.start();

解决方案是根本不使用计时器或声音池。取而代之的是使用一个低水平的音轨,你可以不断地管理它。您必须在缓冲区的适当位置将适当的样本插入音轨,以合成蜂鸣声或咔哒声或其他任何声音。只需在谷歌上搜索AudioTrack,就可以找到如何使用它的示例。

300 BPM?你确定那才是你真正需要的吗?是的。但想想第八个音符。那等于300英镑。所以它需要走得更快。最多六个元组。你在问题中提到了“节拍器”。作为一名音乐家(其父亲是一名音乐教师),我被教导节拍器“通常”是用来测量四分之一音符的(尽管根据作曲可能略有不同)。事实上,在像D'n'B这样的速度为150bpm时,鼓手实际上可能每分钟敲鼓300次,但他们不需要听到节拍器每分钟300次的嘟嘟声。事实上,一个好的鼓手应该能够听75bpm的节拍器(例如),并且仍然能够协调每分钟300次的鼓点。谢谢,但这不是我想要的。我在大学学习音乐理论已有几年了。你能提供一半有用的东西吗?“你能提供一半有用的东西吗?”-不太可能。我怀疑问题很可能是硬件延迟。我唯一的建议是播放更长的声音片段。例如,记录一个4拍条,可能有一个下拍,例如,哔…哔…哔…哔。将其用作声音剪辑,而不是以每分钟75次的速度循环
SoundPool
300次。每个环路将播放4个节拍,但如果它只需要每800毫秒而不是每200毫秒重新启动一次环路,则可能会减少声音硬件和软件的负载。在下一篇评论中继续。。。