[jmsl] Insertion index for Track...?
jmsl at music.columbia.edu
jmsl at music.columbia.edu
Fri Oct 24 23:55:32 EDT 2008
Hi Nick,
How does EditManager choose where in the track to insert to? I've
found methods for finding the nearest note to a clicked point, but
that is dependent on spacing, and a sparsely spaced measure would not
work well with this. Is there a convenience method that I'm missing
that does this? (I'm writing my own EditManager)
thanks,
Peter McCulloch
package com.petermcculloch.megalo.scratch;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JFrame;
import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.score.EditManager;
import com.softsynth.jmsl.score.EditStateProvider;
import com.softsynth.jmsl.score.Note;
import com.softsynth.jmsl.score.NoteFactory;
import com.softsynth.jmsl.score.Score;
import com.softsynth.jmsl.score.ScoreCanvas;
import com.softsynth.jmsl.score.Staff;
/**
* @author peter
*
*/
public class TestAddInterval extends EditManager {
Score score;
/**
* @param score
* @param esp
*/
public TestAddInterval(Score score, EditStateProvider esp) {
super(score, esp);
this.score = score;
}
/*
* (non-Javadoc)
*
* @see
*
com.softsynth.jmsl.score.EditManager#scoreCanvasClicked(com.softsynth
* .jmsl.score.ScoreCanvas, java.awt.Point, java.awt.event.MouseEvent)
*/
@SuppressWarnings("unchecked")
@Override
public void scoreCanvasClicked(ScoreCanvas canvas, Point p,
MouseEvent evt) {
Staff staff = findSelectedStaff(p);
score.setSelectedStaff(staff);
Note n = findClosestNote(p, EditManager.CURSOR_MODE);
if (n != null) {
int level = staff.getNearestLevel(p);
Note insNote =
NoteFactory
.makeNote(score.getEditManager().getEditStateProvider().getDuration(),
0, 0, Note.ACC_FLAT, level,
n.getScore().getMeasure(n.getMeasureIndex())
.getStaff(n.getStaffIndex()).getClef());
n.addInterval(insNote);
} else {
int level = staff.getNearestLevel(p);
Vector<Note> v =
staff
.getTrack
(score.getEditManager().getEditStateProvider().getActiveTrackIndex())
.getChildren();
boolean found = false;
// Is there a prettier way of doing this? It works, but...
for (Note iNote : v) {
if (iNote.getDrawingAnchor().x > p.x) {
if (!found) {
System.out.println("CHANGING INSERTION INDEX TO:\t" +
iNote.getNoteIndex());
staff.getTrack(
score.getEditManager().getEditStateProvider().getActiveTrackIndex())
.setInsertionIndex(iNote.getNoteIndex());
staff.setInsIndexSetByHand(true);
found = true;
}
}
}
Note insNote =
NoteFactory
.makeNote(score.getEditManager().getEditStateProvider().getDuration(),
score.getEditManager().getEditStateProvider().getTuplet(), score
.getEditManager().getEditStateProvider().getDots(),
score.getEditManager()
.getEditStateProvider().getAccidental(), level, staff.getClef());
staff
.getTrack
(score.getEditManager().getEditStateProvider().getActiveTrackIndex())
.insertNote(insNote);
}
score.render();
// super.scoreCanvasClicked(canvas, p, evt);
}
public static void main(String[] args) {
// JMSL.setViewFactory(new ViewFactorySwing());
Score score = new Score(2);
score.addMeasures(10);
TestAddInterval manager =
new TestAddInterval(score,
score.getEditManager().getEditStateProvider());
score.getScoreCanvas().removeAllScoreCanvasListeners();
score.getScoreCanvas().addScoreCanvasListener(manager);
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(score.getScoreCanvas().getComponent());
frame.addWindowStateListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
JMSL.closeMusicDevices();
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
}
More information about the jmsl
mailing list