我想创建一个音乐循环键盘,如下所示:https://www.youtube.com/watch?v=fwBPYwiYp-Y
现在,我正在使用MediaPlayer播放声音。我有一个全局变量存储正在播放的第一个音频的当前时间(位置),当我按下另一个按钮时,相应的音频文件开始在全局变量给定的位置播放。
我的问题是:声音播放不同步。
你可以给我一些帮助吗?我该如何同步声音?喜欢这个应用程序https://www.youtube.com/watch?v=fwBPYwiYp-Y你能指点一些关于如何创建循环板的信息或教程吗?
由于 Richardd
答案 0 :(得分:2)
这样的编程比你想象的要难。要让声音同步播放,您必须执行以下两项操作:
确保你所有的声音都处于相同的速度,并且被正确裁剪 - 这意味着声音片段的开始和结束必须完全打败 - 另一个解决方案是存储开始和结束时间对于每个剪辑(使用OOP非常容易)
使用计时器确保声音开始播放。例如,如果您想让音乐以120 bpm的速度运行,则需要每隔500 ms启动一次计时器。
这是一些代码(只有概念,不会编译):
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;
}