Android - 用于创建循环键盘的信息 - 音乐应用程序

时间:2015-10-22 00:27:20

标签: java android audio synchronization

我想创建一个音乐循环键盘,如下所示:https://www.youtube.com/watch?v=fwBPYwiYp-Y

loop pad 24

现在,我正在使用MediaPlayer播放声音。我有一个全局变量存储正在播放的第一个音频的当前时间(位置),当我按下另一个按钮时,相应的音频文件开始在全局变量给定的位置播放。

我的问题是:声音播放不同步。

你可以给我一些帮助吗?我该如何同步声音?喜欢这个应用程序https://www.youtube.com/watch?v=fwBPYwiYp-Y

你能指点一些关于如何创建循环板的信息或教程吗?

由于 Richardd

1 个答案:

答案 0 :(得分:2)

这样的编程比你想象的要难。要让声音同步播放,您必须执行以下两项操作:

  1. 确保你所有的声音都处于相同的速度,并且被正确裁剪 - 这意味着声音片段的开始和结束必须完全打败 - 另一个解决方案是存储开始和结束时间对于每个剪辑(使用OOP非常容易)

  2. 使用计时器确保声音开始播放。例如,如果您想让音乐以120 bpm的速度运行,则需要每隔500 ms启动一次计时器。

  3. 这是一些代码(只有概念,不会编译):

    Timer beatTimer;
    boolean isDrumLoopEnabled;
    boolean isDrumLoopCurrentlyPlaying;
    Sound drumloop;
    
    public void startMusic(){
        //prepare timer
        beatTimer=new Timer();
        beatTimer.interval=500;//for 120 bpm
        beatTimer.onTick+=onTickHandler;
    
        isDrumLoopPlaying=false;
        isDrumLoopCurrentlyPlaying=false;
    
        //load sounds
        Sound drumloop=new Sound("/storage/emulated/drumloop.ogg");
    
        //start music
        beatTiemr.start();
    }
    
    //this method will run on every beat:
    public void onTickHandler(){
        if(isDrumLoopEnabled){
            //make sure drum loop isn't already playing
            if(!isDrumLoopCurrentlyPlaying){
                //begin looping drumloop in background
                drumloop.startloop();
                isDrumLoopCurrentlyPlaying=true;
            }
        }else{
            if(isDrumLoopCurrentlyPlaying){
                //stop playing drumloop
                drumloop.stopPlaying();
            }
        }
    }
    
    //when the button is pressed...
    public void drumloop_buttonpressed(){
        //this will toggle whether to play the drum loop:
        isDrumLoopEnabled=!isDrumLoopEnabled;
    }