如果这是重复的话,我道歉,但我在这里找到的任何内容似乎都无效。我正在使用libGDX开发基于Java的桌面和Android游戏。我通过在我的核心模块中使用接口添加了MIDI支持,该接口在特定于平台的模块中实现。这是界面:
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之间的浮点数,这样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
没有人奏效。
答案 0 :(得分:0)
如果MIDI文件已经存在,则发送您自己的Channel Volume消息并不是很有用。
如果合成器支持Master Volume messages,您可以尝试发送filterWhere()
。
Java合成器没有与MIDI输入分开的音量控制器。如果MIDI信息不起作用,你必须直接进入音频设备(没有好办法找出合成器使用的是哪一个)。