[jmsl] EditStateProvider bug?
jmsl at music.columbia.edu
jmsl at music.columbia.edu
Fri Jun 20 17:57:51 EDT 2008
Hi all,
I've extended EditStateProvider by adding setter methods. It seems
that EditStateProvider's getActiveTrackIndex() is not observed by the
EditManager. It looks like Staff.getActiveTrackIndex() is being
called instead.
To demonstrate:
Run ActiveTrackComboBox, then click to add notes. It should be
inputting eighth notes in track 1, but instead it is one track 0 (try
inserting notes between notes)
Changing the ActiveTrackIndex through the static
Staff.setActiveTrackIndex(trackNum) works (it's commented in the below
code), but I'd like to be able to have different ActiveTrackIndex
values with multiple scores open. Is ScoreEditPanel setting the
static variable?
thanks,
Peter McCulloch
-------------ActiveTrackComboBox----------------
package com.petermcculloch.megalo.gui.viewer;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import com.petermcculloch.megalo.MegaloEditStateProvider;
import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.score.EditManager;
import com.softsynth.jmsl.score.Note;
import com.softsynth.jmsl.score.NoteFactory;
import com.softsynth.jmsl.score.NumTracksPerStaffChangedListener;
import com.softsynth.jmsl.score.Score;
import com.softsynth.jmsl.score.Staff;
public class ActiveTrackComboBox extends JComboBox implements
NumTracksPerStaffChangedListener {
Score score;
MegaloEditStateProvider mesp;
public ActiveTrackComboBox(Score score, MegaloEditStateProvider mesp) {
this.score = score;
this.mesp = mesp;
configureComboBox(score);
}
/**
*@paramscore
*/
private void configureComboBox(Score score) {
String[] names = new String[score.getNumTracksPerStaff()];
for (int i = 0; i < names.length; i++) {
names[i] = "Track " + (i + 1);
}
this.setModel(new DefaultComboBoxModel(names));
this
.setSelectedIndex
(score.getEditManager().getEditStateProvider().getActiveTrackIndex());
this.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
updateTrackNumber(((JComboBox) e.getSource()).getSelectedIndex());
}
});
}
private void updateTrackNumber(int trackNum) {
System.out.println("Setting to track number: " + trackNum);
// This works but is just using the static access method to
Staff.setActiveTrackIndex(trackNum)
// for (int i = 0; i < score.getNumStaves(); i++) {
// score.getMeasure(0).getStaff(i).setActiveTrackIndex(trackNum);
// }
mesp.setActiveTrackIndex(trackNum);
// ComboBox only works if this is uncommented!
// Staff.setActiveTrackIndex(trackNum);
}
/**
*@paramargs
*/
public static void main(String[] args) {
JFrame frame = new JFrame();
Score score = new Score(2, 900, 300);
score.addMeasures(5, 3, 4);
MegaloEditStateProvider mesp = new MegaloEditStateProvider();
// // remove old editManager
score
.getScoreCanvas().removeScoreCanvasListener(score.getEditManager());
// // add new editManager
score.getScoreCanvas().addScoreCanvasListener(new EditManager(score,
mesp));
score.getEditManager().setEditStateProvider(mesp);
mesp.setActiveTrackIndex(0);
// Verify that we have the correct EditStateProvider and Track
System.out.println("EditStateProvider:\t"
+ score.getEditManager().getEditStateProvider().toString() +
"\tActive Track PRE:\t"
+
score.getEditManager().getEditStateProvider().getActiveTrackIndex());
for (int i = 0; i < 8; i++) {
score.addNote(NoteFactory.makeNote(1, 60 + (i * 2), 1., 0.8));
}
// We should now be inputting EighthNotes on Track 1
mesp.setActiveTrackIndex(1);
mesp.setDuration(Note.EIGHTH);
// Verify that we have the correct EditStateProvider and Track
System.out.println("EditStateProvider:\t"
+ score.getEditManager().getEditStateProvider().toString() +
"\tActive Track POST:\t"
+
score.getEditManager().getEditStateProvider().getActiveTrackIndex());
frame.setLayout(new BorderLayout());
ActiveTrackComboBox actb = new ActiveTrackComboBox(score, mesp);
frame.getContentPane().add(score.getScoreCanvas().getComponent(),
BorderLayout.CENTER);
frame.getContentPane().add(actb, BorderLayout.SOUTH);
frame.addWindowStateListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
JMSL.closeMusicDevices();
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
@Override
public void notifyNumTracksPerStaff(Score score) {
configureComboBox(score);
}
}
-------------MegaloEditStateProvider-------------
package com.petermcculloch.megalo;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import com.softsynth.jmsl.score.EditStateProvider;
import com.softsynth.jmsl.score.Note;
/**
* @author peter This class provides an implementation of
EditStateProvider that
* is also editable.
*/
public class MegaloEditStateProvider implements EditStateProvider {
private static final String ACCIDENTAL = "accidental";
private static final String ACTIVE_TRACK_INDEX = "activeTrackIndex";
private static final String DURATION = "duration";
private static final String DOTS = "dots";
private static final String EDIT_MODE = "editMode";
private static final String NOTE_ELSE_REST = "noteElseRest";
private static final String TUPLET = "tuplet";
private static final String TO_STRING = "MegaloEditStateProvider";
int accidental, activeTrackIndex, dots, duration, editMode,
tuplet;
boolean noteElseRest;
Preferences prefs =
Preferences.userNodeForPackage(this
.getClass());
public MegaloEditStateProvider() {
accidental = prefs.getInt(ACCIDENTAL, Note.ACC_NATURAL);
activeTrackIndex = prefs.getInt(ACTIVE_TRACK_INDEX, 0);
dots = prefs.getInt(DOTS, 0);
duration = prefs.getInt(DURATION, Note.QUARTER);
editMode = prefs.getInt(EDIT_MODE, 1);
tuplet = prefs.getInt(TUPLET, 0);
noteElseRest = prefs.getBoolean(NOTE_ELSE_REST, true);
}
public int getAccidental() {
return accidental;
}
public void setAccidental(int accidental) {
this.accidental = accidental;
prefs.putInt(ACCIDENTAL, accidental);
flush();
}
public int getActiveTrackIndex() {
System.out.println("getActiveTrackIndex called!");
return activeTrackIndex;
}
public void setActiveTrackIndex(int activeTrackIndex) {
this.activeTrackIndex = activeTrackIndex;
}
public int getDots() {
return dots;
}
public void setDots(int dots) {
this.dots = dots;
prefs.putInt(DOTS, dots);
flush();
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
prefs.putInt(DURATION, duration);
flush();
}
public int getEditMode() {
return editMode;
}
public void setEditMode(int editMode) {
this.editMode = editMode;
prefs.putInt(EDIT_MODE, editMode);
flush();
}
public int getTuplet() {
return tuplet;
}
public void setTuplet(int tuplet) {
this.tuplet = tuplet;
prefs.putInt(TUPLET, tuplet);
flush();
}
public boolean isNoteElseRest() {
return noteElseRest;
}
public boolean getNoteElseRest() {
return isNoteElseRest();
}
public void setNoteElseRest(boolean noteElseRest) {
this.noteElseRest = noteElseRest;
prefs.putBoolean(NOTE_ELSE_REST, noteElseRest);
}
public Preferences getPrefs() {
return prefs;
}
public void setPrefs(Preferences prefs) {
this.prefs = prefs;
}
public void flush() {
try {
prefs.flush();
} catch (BackingStoreException e) {
JOptionPane.showMessageDialog(new JFrame(), "Error: No backing
store");
e.printStackTrace();
}
}
public String toString() {
return TO_STRING;
}
}
More information about the jmsl
mailing list