package jmsltestsuite; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLRandom; import com.softsynth.jmsl.score.*; import com.softsynth.jmsl.score.util.RenderedMessageBean; import com.softsynth.jmsl.score.util.SimpleGraphicsRenderedMessageListener; /** * * Add RenderedMessageBean to measure, staff, and notes. * * A RenderedMessageBean executes when the object is drawn, as a very last step. * It is drawn relative to the drawing anchor of the object and is scaled by the * current zoom. * * So a command to draw a line from (0, 0) to (10, 20) will draw a line from * (drawingAnchor.x, drawingAnchor.y) to (drawingAnchor.x + 10 * zoom, * drawingAnchor.y + 20 * zoom) * * The drawing interpretation however, is completely dependent on the * RenderedMessageListener that is in the Score. See the line below, * score.addUserBean(new SimpleGraphicsRenderedMessageListener()); * * RenderedMessageBean save and load to/from score files, as they are * implemented as userbeans * * @author Nick Didkovsky, copyright 2010 Nick Didkovsky */ public class RenderedMessagesTest { static String makeDrawlineCmd(int p1X, int p1Y, int p2X, int p2Y) { return "drawline " + p1X + " " + p1Y + " " + p2X + " " + p2Y; } /** Adapted from Ralph Morelli, Ralph Walde, Beryl Hoffman, David G. Cooper */ private static void drawGasket(Note n, int lev, int p1X, int p1Y, int p2X, int p2Y, int p3X, int p3Y) { n.addUserBean(new RenderedMessageBean(makeDrawlineCmd(p1X, p1Y, p2X, p2Y))); n.addUserBean(new RenderedMessageBean(makeDrawlineCmd(p2X, p2Y, p3X, p3Y))); n.addUserBean(new RenderedMessageBean(makeDrawlineCmd(p3X, p3Y, p1X, p1Y))); if (lev > 0) { // If more levels, draw 3 smaller gaskets int q1X = (p1X + p2X) / 2; int q1Y = (p1Y + p2Y) / 2; int q2X = (p1X + p3X) / 2; int q2Y = (p1Y + p3Y) / 2; int q3X = (p2X + p3X) / 2; int q3Y = (p2Y + p3Y) / 2; drawGasket(n, lev - 1, p1X, p1Y, q1X, q1Y, q2X, q2Y); drawGasket(n, lev - 1, p2X, p2Y, q1X, q1Y, q3X, q3Y); drawGasket(n, lev - 1, p3X, p3Y, q2X, q2Y, q3X, q3Y); } } public static void main(String args[]) { int w = 900; int h = 550; int numStaves = 1; Score score = new Score(numStaves, w, h, "RenderedMessageBeans render when the object is rendered"); score.addUserBean(new SimpleGraphicsRenderedMessageListener()); Measure m = score.addMeasure(); Note n1 = score.addNote(1.0, 60, 0.5, 0.8); Note n2 = score.addNote(1.0, 82, 0.5, 0.8); Note n3 = score.addNote(1.0, 63, 0.5, 0.8); Note n4 = score.addNote(1.0, 85, 0.5, 0.8); // draw line RenderedMessageBean lineDrawingCommand = new RenderedMessageBean(); lineDrawingCommand.setMessage("drawline 0 0 30 50"); // or use one step constructor with command as arg RenderedMessageBean lineDrawingCommand2 = new RenderedMessageBean("drawline 20 0 0 20"); // set color RenderedMessageBean blackCommand = new RenderedMessageBean("setcolor 0 0 0"); RenderedMessageBean redCommand = new RenderedMessageBean("setcolor 255 0 0"); RenderedMessageBean orangeCommand = new RenderedMessageBean("setcolor 255 150 0"); // drawArc(int x, int y, int width, int height, int startAngle, int // arcAngle) String arcCommandString = "drawArc 0 0 40 20 90 270"; // m.addUserBean(lineDrawingCommand); m.addUserBean(redCommand); for (int i = 0; i < 30; i++) { RenderedMessageBean arcCommand = new RenderedMessageBean(arcCommandString); double xOffset = i * 5; arcCommand.setXoffset(xOffset); arcCommand.setYoffset(xOffset / 5 * xOffset / 5); // m.addUserBean(arcCommand); } int p1X = 10; int p1Y = 10; int p2X = 390; int p2Y = 10; int p3X = 100; int p3Y = 390; n1.addUserBean(blackCommand); drawGasket(n1, 2, p1X, p1Y, p2X, p2Y, p3X, p3Y); n2.addUserBean(orangeCommand); drawGasket(n2, 3, p1X, p1Y, p2X, p2Y, p3X, p3Y); n3.addUserBean(redCommand); drawGasket(n3, 4, p1X, p1Y, p2X, p2Y, p3X, p3Y); drawGasket(n4, 5, p1X, p1Y, p2X, p2Y, p3X, p3Y); m.getStaff(0).addUserBean(redCommand); m.getStaff(0).addUserBean(lineDrawingCommand2); m.getStaff(0).addUserBean(blackCommand); ScoreFrame scoreFrame = new ScoreFrame(); scoreFrame.addScore(score); scoreFrame.setVisible(true); scoreFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JMSL.closeMusicDevices(); System.exit(0); } }); } }