我目前正在开发一个视觉阅读应用程序,它需要显示音乐符号;我很难找到一种在JFrame中高效地绘制这一功能的方法。
我正在查看JFugue库来帮助解决这个问题,MusicXMLParser_J类的描述说明如下。
解析一个MusicXML文件,并在解释令牌时为ParserListener接口触发事件。ParserListener对产生的事件进行智能处理,例如创建音乐、绘制乐谱或转换数据。可以使用文件名、文件、InputStream或读取器调用MusicXmlParser.parse。
但是,我不确定实现ParserListener的哪个类将允许绘制单曲。任何帮助都是非常感谢的。
发布于 2021-04-25 03:18:16
JFugue不附带一个绘制单曲的ParserListener,但是您可以自己编写!另外,当您编写ParserListener时,它将适用于任何解析器,因此您还可以为MIDI文件和其他解析器所支持的文件类型绘制乐谱。如果您在这方面取得了很大进展,请考虑将其提交给下一个版本的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。
https://stackoverflow.com/questions/67190664
复制相似问题