如何从 Java 中的 MusicXML 中提取 sheet 音乐?

How could one draw sheet music from MusicXML in Java?

我目前正在开发一款需要显示乐谱的视奏应用;我正在努力寻找一种在 JFrame 中有效绘制它的方法。

我正在查看 JFugue 库以帮助解决此问题,class MusicXMLParser_J 的描述如下。

Parses a MusicXML file, and fires events for ParserListener interfaces when tokens are interpreted. The ParserListener does intelligent things with the resulting events, such as create music, draw sheet music, or transform the data. MusicXmlParser.parse can be called with a file name, File, InputStream, or Reader.

但是,我不确定实现 ParserListener 的 class 是否允许绘制 sheet 音乐。非常感谢任何帮助。

JFugue 没有附带绘制 sheet 音乐的 ParserListener,但您可以编写自己的!另外,当您编写 ParserListener 时,它将适用于 any 解析器,因此您还可以为 MIDI 文件和人们拥有的其他文件类型绘制 sheet 音乐解析器。如果你在这方面有很大的进步,请考虑提交给下一个版本的 JFugue。

这是一种编写您自己的 sheet 音乐解析器侦听器的方法:

public class ArunavSheetMusicParserListener extends JPanel implements ParserListener {
    private List<ThingToDraw> thingsToDraw;

    public ArunavSheetMusicParserListener() { 
        super();
        this.thingsToDraw = new ArrayList<>();
    }

    @Override
    public void paint(Graphics g) {
        super(g);
        for (ThingToDraw thingToDraw : thingsToDraw) {
            thingToDraw.draw(g);
        }
    }

    @Override
    public void onNoteParsed(Note note) {
        thingsToDraw.add(new NoteDrawing(note));
    }

    ...and so on for the other events from ParserListener that you wish to draw...
}

public interface ThingToDraw {
    public void draw(Graphics g);
}

public class NoteDrawing implements ThingToDraw {
    private Note note;

    public NoteDrawing(Note note) {
        this.note = note;
    }

    public void draw(Graphics g) {
        // look at the methods of the note to determine
        // how to draw it:
        //   - note.getDuration()
        //   - note.getValue()
    }
}

并对您打算绘制的其他内容执行此操作。

请注意:MusicXMLParser 由用户社区提供,维护得不如 JFugue 库的其他部分。在将时间投入到您自己的 ParserListener 之前,请确保 MusicXMLParser 正在按预期工作。并且,请确保您使用的是最新版本的 JFugue,此时版本为 5.0.9。