2

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

我正在查看 JFugue 库来帮助解决这个问题,MusicXMLParser_J 类的描述如下。

解析 MusicXML 文件,并在解释令牌时为 ParserListener 接口触发事件。ParserListener 对生成的事件执行智能操作,例如创建音乐、绘制乐谱或转换数据。可以使用文件名、File、InputStream 或 Reader 调用 MusicXmlParser.parse。

但是,我不确定哪个实现 ParserListener 的类将允许绘制乐谱。任何帮助是极大的赞赏。

4

1 回答 1

1

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

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

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 版。

于 2021-04-25T03:18:16.610 回答