如何将模式更改保存到已加载的Midi?

问题描述

我正在从事一个学校编码项目,该项目涉及使用Java中的jfugue库。但是,将加载和编辑的模式保存到文件时,我遇到了很大的困难。到目前为止,我已经尝试了player.saveMidi(无法识别)和MidiFileManager.savePatternToMidi函数,但是所做的修改没有保存。

以下是上述代码的片段:

Pattern pattern = new Pattern(MidiFileManager.loadPatternFromMidi(new File(filePath.getText()))); 
  
TextField midiData = new TextField(pattern.toString());                                             
midiData.setFont(Font.font(14));                                                                    
pattern = new Pattern(midiData.getText());                                                          

Button save = new Button("Save Edits");
Pattern finalPattern = pattern;                                                             

save.setonAction(e -> {
    try {
        MidiFileManager.savePatternToMidi(finalPattern,new File(filePath.getText()));      
        Load.playAndEdit(filePath);
    } catch (Exception ex) {                                                                
        ex.printstacktrace();
    }
});

任何帮助都将不胜感激!

解决方法

尽管您怀疑这是JFugue的问题,但潜在的问题在于代码的JavaFX部分。

主要问题是代码的编写方式,似乎期望显示TextField,用户将进行更改,并且代码将记住“ pattern = new Pattern(midiData .getText())”。 JavaFX TextField不是这样工作的。 UI元素不是像这样的顺序。而是使用动作(或在JavaFX中,您可以将UI组件的值与数据元素“绑定”)。如果您在用户按下“保存”按钮时触发的操作中从“文本字段”中获取文本,则将获得来自文本字段的最新数据。在编写代码时,用户的更改永远不会放入变量中。

另外两个注意事项:

  1. 在第一行中,MidiFileManager.loadPatternFromMidi返回一个模式,因此您无需将其放入“ new Pattern()”。

  2. 无需说“模式finalPattern =模式”。这只是创建一个新变量,该变量指向与现有变量相同的数据。您可以只保存“模式”,如果它具有您希望从文本字段中获得的信息(但是,再次说,这不是正确的位置,因此它不会具有您期望的信息)。 / p>

测试这不是JFugue问题的一种方法是创建一个简单的程序,例如:

Pattern pattern = MidiFileManager.loadPatternFromMidi(new File(filePath.getText())); 
pattern.add(" C D E");
MidiFileManager.savePatternToMidi(pattern,new File(filePath.getText())); 

然后您将看到生成的模式在末尾添加了三个新注释。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...