JFugue:加载的MIDI文件没有使用正确的乐器演奏

3

我使用以下代码使用JFugue加载和播放MIDI文件:

import java.io.File;

import org.jfugue.Pattern;
import org.jfugue.Player;

public class PlayMidiFromFile {

    public static void main(final String[] args) {
        try {
            final Player player = new Player();
            final Pattern pattern = player.loadMidi(new File("sample.mid"));
            player.play(pattern);
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
}
该文件是使用ChordPulse生成的,其他程序播放正常。它包含多个轨道,每个轨道都有不同的乐器,但播放器只使用钢琴,并且似乎缺少一些轨道。

如何解决?是否存在某些MIDI消息,解析器无法识别?歌曲如何使用轨道和通道或其他已知限制或必要的初始化步骤是否存在先决条件?


1
你确定这个播放器支持多种乐器吗?并不是所有的都支持。 - keshlam
JFugue的内部表示(称为“MusicString”)确实如示例所示。但是我不确定MIDI文件解析器。 - Jens Piegsa
顺便说一下,我目前正在使用JFugue 4.0.3。我会尝试使用JFugue 5 Beta。 - Jens Piegsa
@keshlam 正在思考正确的事情 - 并非所有 MIDI 合成器都支持完整的 MIDI 规范。没有看到 Jens 的 MIDI 文件,很难知道问题所在。幸运的是,在 JFugue 5 中从 MIDI 文件中读取的功能得到了改进,正如 Jens 对自己问题的回答所反映的那样! - David Koelle
1个回答

2

除此之外,beta版本5中MIDI支持明显得到了提高,但是低音大号部分仍由钢琴演奏。

上面代码片段的更新(反映API更改):

import java.io.File;

import org.jfugue.midi.MidiFileManager;
import org.jfugue.pattern.Pattern;
import org.jfugue.player.Player;

public class PlayMidiFromFile {

    public static void main(final String[] args) {
        try {
            final Player player = new Player();
            final Pattern pattern = MidiFileManager.loadPatternFromMidi(new File("sample.mid"));
            player.play(pattern);
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
}

1
是的,改进对现有MIDI文件的读取支持是我在编写JFugue 5时一直努力追求的。很高兴你找到了答案! - David Koelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接