package jmsltestsuite; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.io.*; import java.util.*; import javax.swing.JFrame; import javax.swing.JPanel; import com.didkovsky.portview.PVPanel; import com.didkovsky.portview.swing.ViewFactorySwing; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLRandom; import com.softsynth.jmsl.score.*; /** * * Test Music Curve Renderer which takes care of staff lines, ledger lines, ties, slurs, cresc, * decresc. This test implements MusicCurveRenderer and writes the data it receives to a log text * file. The idea is you would write your own curve & line routines. * * @see com.softsynth.jmsl.score.MusicCurveRenderer * * @author Nick Didkovsky 2009 */ public class MusicCurveRendererTest extends JPanel implements MusicCurveRenderer { Score score; int numStaves; PVPanel panel; PrintWriter log; public MusicCurveRendererTest() { super(); panel = JMSL.getViewFactory().createPanel(); int w = 900; int h = 600; numStaves = 2; setPreferredSize(new Dimension(w, h)); score = new Score(numStaves, w, h); // score.getScorePainter().se score.setMusicCurveRenderer(this); panel.setLayout(new BorderLayout()); PVPanel p = JMSL.getViewFactory().createPanel(); p.setLayout(new FlowLayout(FlowLayout.LEFT)); p.add(score.getControlPanel().getComponent()); panel.add("South", p.getComponent()); panel.add(score.getScoreCanvas().getComponent()); buildScore(); } public void buildScore() { score.addMeasure(); score.setName("OPUS 1"); score.setScoreSubtitle("for all my dear friends"); score.setComposer("Looey McPinsky"); boolean cresc = true; score.addNote(0.5, 0, 0, .2); /* * for (int staffNumber = 0; staffNumber < 2; staffNumber++) { * score.setCurrentStaffNumber(staffNumber); score.rewind(); double pitch = * NoteFactory.MIDDLE_C + 12 * staffNumber; for (int i = 0; i < 16; i++) { if * (JMSLRandom.choose() < 0.2) { pitch += JMSLRandom.choose(-3, 3); } Note n = * score.addNote(0.25, pitch, .5, 0.8); n.setBeamedOut(i % 4 != 3); * * if (JMSLRandom.choose() < 0.2) { n.setTiedOut(true); } * * if (JMSLRandom.choose() < 0.5) { n.setSlurredOut(true); } * * if (JMSLRandom.choose() < 0.3) { if (cresc) { n.setCrescOut(true); } else { * n.setDecrescOut(true); } } else { cresc = !cresc; } * * // System.out.println("pitch=" + pitch); } } */ } /** MusicGraphicsRenderer interface */ public void draw(Graphics g, String graphicsCommand, Hashtable properties) { log.println("MusicCurveRenderer.draw() Command: " + graphicsCommand); Enumeration keys = properties.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); log.println(key + ": " + properties.get(key)); } if (graphicsCommand.equalsIgnoreCase("StaffLine")) { handleStaffLine(properties); } else if (graphicsCommand.equalsIgnoreCase("Stem")) { handleStem(properties); } else if (graphicsCommand.equalsIgnoreCase("Beam")) { handleBeam(properties); } } private void handleStaffLine(Hashtable properties) { String zoom = ((Double) properties.get("zoom")).doubleValue() + ""; double x1 = ((Double) properties.get("x1")).doubleValue(); double y1 = ((Double) properties.get("y1")).doubleValue(); double x2 = ((Double) properties.get("x2")).doubleValue(); double y2 = ((Double) properties.get("y2")).doubleValue(); String staffLineIndex = ((Double) properties.get("StaffLineIndex")).intValue() + ""; Staff staff = (Staff) properties.get("staff"); String staffIndex = staff.getStaffIndex() + ""; String measureIndex = staff.getMeasure().getMeasureIndex() + ""; String selected = (String) (properties.get("selected")); ((Graphics2D) getGraphics()).draw(new Line2D.Double(x1, y1, x2, y2)); } private void handleStem(Hashtable properties) { String zoom = ((Double) properties.get("zoom")).doubleValue() + ""; double x = ((Double) properties.get("x")).doubleValue(); double y1 = ((Double) properties.get("y1")).doubleValue(); double y2 = ((Double) properties.get("y2")).doubleValue(); Note note = (Note) properties.get("note"); boolean isGraceNote = note.isGraceNote(); int graceNoteIndex = -1; if (isGraceNote) { Vector gracenotes = note.getGraceNoteHandle().getGraceNotes(); graceNoteIndex = gracenotes.indexOf(note); note = note.getGraceNoteHandle(); System.out.println(gracenotes.size() + " grace notes"); } Track t = note.getTrack(); Staff s = t.getStaff(); Measure m = s.getMeasure(); String measureIndex = m.getMeasureIndex() + ""; String staffIndex = s.getStaffIndex() + ""; String trackIndex = t.getTrackIndex() + ""; String noteIndex = note.getNoteIndex() + ""; log.println("Stem " + measureIndex + ", " + staffIndex + ", " + trackIndex + ", " + noteIndex + ", gracenote? " + isGraceNote + ", gracenoteindex=" + graceNoteIndex); ((Graphics2D) getGraphics()).draw(new Line2D.Double(x, y1, x, y2)); } private void handleBeam(Hashtable properties) { String zoom = ((Double) properties.get("zoom")).doubleValue() + ""; double x = ((Double) properties.get("x")).doubleValue(); double y = ((Double) properties.get("y")).doubleValue(); double w = ((Double) properties.get("width")).doubleValue(); double h = ((Double) properties.get("height")).doubleValue(); Note note1 = (Note) properties.get("note1"); String noteIndex = note1.getNoteIndex() + ""; String trackIndex = note1.getTrack().getTrackIndex() + ""; String staffIndex = note1.getTrack().getStaff().getStaffIndex() + ""; String measureIndex = note1.getTrack().getStaff().getMeasure().getMeasureIndex() + ""; Note note2 = (Note) properties.get("note2"); String noteIndex2 = note2.getNoteIndex() + ""; String trackIndex2 = note2.getTrack().getTrackIndex() + ""; String staffIndex2 = note2.getTrack().getStaff().getStaffIndex() + ""; String measureIndex2 = note2.getTrack().getStaff().getMeasure().getMeasureIndex() + ""; ((Graphics2D) getGraphics()).draw(new java.awt.geom.Rectangle2D.Double(x, y, w, h)); } public static void main(String args[]) { JMSLRandom.randomize(); JMSL.setViewFactory(new ViewFactorySwing()); final MusicCurveRendererTest st = new MusicCurveRendererTest(); try { st.log = new PrintWriter(new FileWriter(new File("logs/MusicCurveRendererTest.log")), true); st.log.println(new Date()); } catch (IOException e1) { e1.printStackTrace(); } ScoreFrame f = new ScoreFrame("Test MusicCurveRenderer"); f.addScore(st.score); f.pack(); f.setVisible(true); JFrame jf = new JFrame(); jf.add(st); jf.pack(); jf.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JMSL.closeMusicDevices(); st.log.close(); System.exit(0); } }); } }