SoundPool的安卓文档中写道:“该应用程序还可以通过实时调整多普勒或合成效果的回放速率来改变音高”。所以我试着这样做,使用setRate方法平滑地从一个音符变化到另一个音符,但结果很糟糕:声音变化非常粗糙。这是我尝试过的代码。请告诉我有没有更好的方法。
int streamId = soundPool.play (soundId, 1, 1, 1, 0, 1.0f);
for (float x = 0; x < 1; x += 0.005) {
SystemClock.sleep (10);
soundPool.setRate (streamId, 1 + x);
}发布于 2011-11-18 21:40:12
尽管Androids文档建议您可以使用setRate()来产生多普勒效果,但我不会依赖于在每个android设备上实现一个足够快或足够好的实现。
价格合理的音频IC需要44 ICs或48 ICs的固定采样率。因此,采样率转换(即音调修改)必须在软件中完成。因为这包括低级的数字运算,我确信这是由设备制造商实现的,而不是由Google实现的。鉴于Android设备制造商的种类繁多,而且通常使用的硬件成本较低,因此肯定有许多采样率转换实现方案。有些更快,有些更慢。有些很光滑,有些很粗糙。
播放过程中更改转换率会发生什么情况?如果算法不能精确地将这些片段匹配在一起,则可能会在音频播放中出现短暂的裂缝。您每10毫秒更改一次转换率。如果每10ms就有一条裂缝,那就相当于100赫兹的频率,这本身就是一个音调。这很可能就是你所听到的“参差不齐”。
总而言之,我认为不可能使用高级Android API在各种Android设备上实时模拟乐器。不过,本机应用程序可能已经足够快了。
发布于 2012-05-21 03:51:16
在尝试了所有方法之后,我决定使用SoundPool来改变音高,回放速率为2.0会使声音以原始频率的两倍播放,而回放速率为0.5会使声音以原始频率的一半播放。播放速率范围为0.5到2.0。但它确实适用于低于和高于0.5和2.0的频率。
我正在发布我的工作代码,
但由于它只是演示的目的,在这里你需要手动更改“播放速率”,每次你安装应用程序时,例如:“sp.play(爆炸性,1,1,0,0,1.5f)”这里的"1.5f“是播放速率。可以很容易地创建一个EditView,或者类似于在运行时设置播放速率的值的东西。
在这款应用程序中,你只需轻敲应用程序的屏幕,就可以按设定的播放速率播放音乐。
import java.io.IOException;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SoundPoolActivity extends Activity implements OnClickListener {
SoundPool sp;
int explosion = 0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View v = new View(this);
v.setOnClickListener(this);
setContentView(v);
sp = new SoundPool(1,AudioManager.STREAM_MUSIC,0);
//explosion = sp.load(this, R.raw.hh,0);
explosion = sp.load("/sdcard/hh.m4a",0);
}
public void onClick(View v){
if (explosion!=0){
sp.play(explosion, 1,1,0,0,2.3f);
}
}
}https://stackoverflow.com/questions/7939411
复制相似问题