Libgdx,改变音乐的音调

Ste*_*veL 2 android libgdx

我想实现一个很酷的效果,当爆炸时,音乐会稍微变慢一些.

Music类libgdx的不允许改变声音的音高,我尝试使用Sound类,而不是Music玩我的音乐,但它在加载文件很慢(5秒为5 MB的文件,在桌面上!).

所以,问题是如果有办法解决这个问题,或者是否有一个外部库,它可以在桌面和Android上运行,并且可以与libgdx一起使用.

Ste*_*veL 7

经过一些搜索,我找到了一种编辑libgdx源代码的方法.

您需要使用该AudioDevice对象按样本播放音乐样本,为此,您需要包含libgdx的音频扩展名.

我们将编辑libgdx源代码,因此您需要下载它并用正确的libgdx项目替换gdx.jar,gdx-backend-android.jar和gdx-backend-lwjgl.jar(它们具有相同的名称而没有jar扩展名)

1)编辑gdx项目的com.badlogic.gdx.audio包中的AudioDevice.java

在界面中添加以下代码

public void setSpeed(float val);
Run Code Online (Sandbox Code Playgroud)

2)编辑gdx-backend-android项目的com.badlogic.gdx.backends.android包中的AndroidAudioDevice.java

AudioDevice类的Android端依赖于Android sdk的AudioTrack类,这个类有一个setPlaybackRate(..)方法.

在类中添加以下代码

@Override
public void setSpeed (float speed) {
    track.setPlaybackRate((int)(track.getSampleRate()*speed));
}
Run Code Online (Sandbox Code Playgroud)

3)编辑gdx-backend-lwjgl项目的com.badlogic.gdx.backends.lwjgl.audio包中的OpenALAudioDevice.java

AudioDevice的桌面端依赖于OpenAL(音频的opengl),它具有方便的设置间距方法

在类中添加以下内容

@Override
public void setSpeed (float speed) {
    alSourcef(sourceID, AL_PITCH, speed);
}
Run Code Online (Sandbox Code Playgroud)

4)播放音频

这是加载和播放声音文件的代码

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.audio.io.Mpg123Decoder;
import com.badlogic.gdx.files.FileHandle;

public class MusicBeat {

static short[] samples = new short[2048];
Mpg123Decoder decoder;
AudioDevice device;
static FileHandle externalFile;
public boolean playing=true;
public MusicBeat(String name )
{
        FileHandle file=Gdx.files.internal(name);
        FileHandle external=Gdx.files.external("myappname/"+name);
        if(!external.exists())file.copyTo(external); //copy the file to the external storage only if it doesnt exists yet
        decoder = new Mpg123Decoder(external);
        device = Gdx.audio.newAudioDevice(decoder.getRate(),decoder.getChannels() == 1 ? true : false);
        playing=false;
        externalFile=file;
}

void play()
{
    playing=true;
    Thread playbackThread = new Thread(new Runnable() {
        @Override
        public synchronized  void run() {
            int readSamples = 0;
            while ( playing) {
                if(decoder!=null){
                    if((readSamples = decoder.readSamples(samples, 0,samples.length))<=0){
                        decoder.dispose();
                        decoder = new Mpg123Decoder(externalFile);
                        playing=false;
                    }
                    device.writeSamples(samples, 0, readSamples);
                }
            }
        }
    });
    playbackThread.setDaemon(true);
    playbackThread.start();
}

public void stop(){
    playing=false;
    decoder.dispose();
}
public void setVolume(float vol){
    device.setVolume(vol);
}
public void setSpeed(float speed){
    device.setSpeed(speed);
}
Run Code Online (Sandbox Code Playgroud)

}

哪里可以获得音频扩展?(AudioDevice需要)

音频扩展似乎已被弃用,并且容易找到罐子,我已将它们上传到这里,它是旧版本但应该可以正常工作.

更简单的方法?

如果您的游戏只打算在桌面上运行,那么桌面上的libgdx音乐类再次依赖于OpenAL,它可以提供播放音高的功能,因此您只需要编辑音乐界面(桌面上的OpenALMusic)而不是不幸的是,因为dawez说Android上的Music类依赖于MediaPlayer而不是给我们提供音高变换选项,所以AudioDevice并通过样本事物得出整个播放样本.

结论:这种方法对我来说似乎并不好看.如果你的游戏真的需要音高的东西,没有它就没有意义,那就去吧,否则它只是为了这么小的细节而付出了太大的努力.