How can I save pattern changes to a loaded midi?

95 views Asked by At

I am working on a school coding project, which involves using the JFugue library in Java. However, I am having significant difficulty saving loaded and edited patterns to a file. So far, I have tried both the player.saveMidi (which is not recognized) and MidiFileManager.savePatternToMidi functions, but the edits do not save.

Here is a snippet of the aforementioned code:

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();
    }
});

Any help would certainly be appreciated!

1

There are 1 answers

1
David Koelle On

Although your suspicion is that this is an issue with JFugue, the underlying issue is in the JavaFX pieces of the code.

The main issue is that the way the code is written, it looks like the expectation is that the TextField will be displayed, the user will make a change, and the code will remember that change in "pattern = new Pattern(midiData.getText())". That's not how the JavaFX TextField works. UI elements are not sequential like this; instead, they work with actions (or in JavaFX, you can "bind" the value of a UI component with a data element). If you get the text from the TextField in the action that triggers when the user presses the Save button, you will have the most recent data from the text field. As the code is written, the user's change is never placed into a variable.

Two other notes:

  1. In your first line, MidiFileManager.loadPatternFromMidi returns a Pattern, so you don't need to put it into a "new Pattern()".

  2. There is no need to say "Pattern finalPattern = pattern". That just creates a new variable that points to the same data as the existing variable. You can just save "pattern", if it has the information you expect from the text field (but again, this isn't the right place to say it, so it won't have the information that you're expecting).

One way to test that this is not a JFugue issue is to create a simple program that does, for example:

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

Then you would see that the resulting pattern has three new notes added to the end.