[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