java - 桌面上的 libGDX Midi 音量控制

标签 java libgdx midi

如果这是重复的,我深表歉意,但我在这里发现的任何东西似乎都不起作用。我正在使用 libGDX 用 Ja​​va 开发一款桌面和 Android 游戏。我通过使用核心模块中的接口(interface)添加了 MIDI 支持,该接口(interface)在特定于平台的模块中实现。这是该界面:

public interface Midi {
    void setLooping(boolean looping);
    void pause();
    void stop();
    void setPosition(int pos);
    void dispose();
    long getPosition();
    boolean isLooping();
    void setVolume(float volume);
    void onPause();
    void onResume();
}

我在桌面和 Android 项目中的实现完美地加载和播放 midi 文件。在Android版本中,我什至可以轻松设置音量。但是我不知道如何在桌面上实现该卷。我希望能够将轨道的音量设置为 0 到 1 之间的 float ,这样 0 是完全安静的,1 是最响亮的。这是我当前在桌面上实现的 MIDI 播放器:

public class MidiPlayer implements Midi {

    /**
     * The sequencer to play the midi track.
     */
    private Sequencer sequencer;
    /**
     * Whether or not the track is looping.
     */
    private boolean looping;

    public MidiPlayer(FileHandle fileHandle) {
        try {
            sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequencer.setSequence(fileHandle.read());
            sequencer.setMicrosecondPosition(0);
            sequencer.setLoopStartPoint(0);
            sequencer.setLoopEndPoint(-1);
            looping = false;
        } catch (MidiUnavailableException | InvalidMidiDataException | IOException e) {
            Gdx.app.error(getClass().getName(), e.getMessage(), e);
        }
    }

    @Override
    public void play() {
        sequencer.start();
    }

    @Override
    public void setLooping(boolean looping) {
        this.looping = looping;
        if(!looping) {
            sequencer.setLoopCount(0);
        } else {
            sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
        }

    }

    @Override
    public void pause() {
        sequencer.stop();
    }

    @Override
    public void stop() {
        sequencer.stop();
        sequencer.setMicrosecondPosition(0);
    }

    @Override
    public void setPosition(int pos) {
        sequencer.setMicrosecondPosition(pos);
    }

    @Override
    public void dispose() {
        sequencer.close();
    }

    @Override
    public long getPosition() {
        return sequencer.getMicrosecondPosition();
    }

    @Override
    public boolean isLooping() {
        return this.looping;
    }

    @Override
    public void setVolume(float volume) {
        //I have tried several things here and none have worked
    }

    @Override
    public void onPause() {
        //ANDROID ONLY
    }

    @Override
    public void onResume() {
        //ANDROID ONLY
    }
}

我尝试了很多不同的方法,我尝试了以下解决方案: http://www.java2s.com/Code/Java/Development-Class/SettingtheVolumeofPlayingMidiAudio.htm

What's the method to control volume in an MIDI sequencer?

How to control the MIDI channel's volume

但都没有奏效。

最佳答案

如果 MIDI 文件已包含您自己的 channel 音量消息,则发送这些消息并不是很有用。

您可以尝试发送Master Volume messages ,如果该合成器支持它们。

Java 合成器没有与其 MIDI 输入分开的音量 Controller 。如果 MIDI 消息不起作用,您必须直接转到音频设备(并且没有好方法来找出合成器使用哪一个)。

关于java - 桌面上的 libGDX Midi 音量控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46508689/

相关文章:

java - 如何在Android中获取所选单选按钮的id

java - LibGDX Box2DLights 在渲染时抛出错误

java - 如何将附加纹理链接到着色器中。 LibGDX

没有 MidiMessage 的 Java MIDI

java - Java 音库

Java:在线程中执行一条语句

java - 在 SQL Server 数据库中查找名称与某些字符串相似的表?

java - Clover:检测后附加不需要的代码

android - 将信息传递给渲染器

midi - 将 MIDI 文件转换为带有长度和开始时间的音符列表