/** * InstrumentDemo.java * * This applet starts two MusicShapes in parallel. Each MusicShape has an * Instrument which interprets the MusicShape data as RGB color values. * * This demonstrates how to build an arbitrary custom instrument, which uses * JMSL's EventScheduler to post on/off events. * * * @author Nick Didkovsky */ /* * (C) 1997 Phil Burk and Nick Didkovsky, All Rights Reserved JMSL is based upon * HMSL (C) Phil Burk, Larry Polansky and David Rosenboom. */ package jmslexamples; import java.awt.*; import java.awt.event.*; import com.softsynth.jmsl.*; import com.softsynth.jmsl.view.*; public class InstrumentDemo extends java.applet.Applet implements ActionListener { ParallelCollection col; MusicShape s1; MusicShape s2; DrawingCanvas canvas1; // one for first shape to paint in DrawingCanvas canvas2; // one for second shape TextArea textArea; // to print hierarchy Button startButton; Button stopButton; public void init() { canvas1 = new DrawingCanvas(); canvas2 = new DrawingCanvas(); textArea = new TextArea(80, 30); setLayout(new GridLayout(0, 1)); add(canvas1); add(canvas2); add(textArea); Panel p = new Panel(); p.add(startButton = new Button("Start")); p.add(stopButton = new Button("Stop")); add(p); buildShapes(); buildCollection(); printInfo(); startButton.addActionListener(this); stopButton.addActionListener(this); } void buildCollection() { col = new ParallelCollection(s1, s2); col.setRepeats(200); JMSL.setSTDOut(new TextAreaOut(textArea)); } void niceNames(MusicShape s) { s.setDimensionName(0, "Dur"); // give dimensions human friendly names s.setDimensionName(1, "Red"); s.setDimensionName(2, "Green"); s.setDimensionName(3, "Blue"); s.setDimensionName(4, "Hold"); } void buildShapes() { s1 = new MusicShape(5); niceNames(s1); // dimensions are: duration, R, G, B, holdtime s1.add(1.0, 250, 250, 250, 0.50); s1.add(1.0, 200, 250, 200, 0.75); s1.add(1.0, 150, 250, 150, 0.75); s1.add(1.0, 100, 250, 100, 0.75); s1.add(1.0, 255, 255, 255, 0.50); s1.setInstrument(new ColorInstrument(canvas1)); s2 = new MusicShape(5); niceNames(s2); s2.add(1.5, 250, 250, 250, 0.50); s2.add(1.0, 250, 200, 150, 0.25); s2.add(1.0, 250, 150, 50, 0.25); s2.add(1.0, 250, 100, 0, 0.25); s2.add(1.0, 255, 255, 255, 0.50); s2.setInstrument(new ColorInstrument(canvas2)); } void printInfo() { col.printHierarchy(); JMSL.out.println("--------"); col.print(); JMSL.out.println("--------"); s1.print(); JMSL.out.println("--------"); s2.print(); } public void start() { synchronized (JMSL.class) { JMSL.clock = new DefaultMusicClock(); JMSL.scheduler = new EventScheduler(); JMSL.scheduler.start(); } } public void stop() { synchronized (JMSL.class) { col.finishAll(); try { col.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } JMSL.scheduler.stop(); JMSL.closeMusicDevices(); } } void handleStart() { col.finishAll(); try { col.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } col.launch(JMSL.now()); } void handleStop() { col.finishAll(); try { col.waitForDone(); } catch (InterruptedException e) { e.printStackTrace(); } } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == startButton) handleStart(); if (source == stopButton) handleStop(); } public static void main(String args[]) { InstrumentDemo applet = new InstrumentDemo(); Frame f = new Frame("Instrument Demo"); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); f.add(applet, BorderLayout.CENTER); applet.init(); applet.start(); f.setSize(800, 600); f.setVisible(true); } } /** * A new custom instrument, which has a canvas as an output device, and an * play() method that translates data into RGB colors */ class ColorInstrument extends InstrumentAdapter { DrawingCanvas myCanvas; ColorInstrument(DrawingCanvas can) { myCanvas = can; } public double play(double playTime, double timeStretch, double dar[]) { double dur = dar[0]; int red = (int) dar[1]; int green = (int) dar[2]; int blue = (int) dar[3]; double hold = dar[4]; String colorMsg = "Color = (" + red + ", " + green + ", " + blue + ")"; ColorEvent onEvent = new ColorEvent(myCanvas, colorMsg, new Color(red, green, blue)); ColorEvent offEvent = new ColorEvent(myCanvas, "off", Color.white); onEvent.setPlayTime(playTime); offEvent.setPlayTime(playTime + hold * timeStretch); JMSL.scheduler.post(onEvent); JMSL.scheduler.post(offEvent); return playTime + dur * timeStretch; } } class ColorEvent implements ScheduledEvent { double playTime; DrawingCanvas myCanvas; Color myColor; String myMsg; public ColorEvent(DrawingCanvas canvas, String msg, Color color) { myCanvas = canvas; myColor = color; myMsg = msg; } public void setPlayTime(double t) { playTime = t; } public double getPlayTime() { return playTime; } public void play() { myCanvas.setBackground(myColor); myCanvas.printMsg(myMsg, Color.black); } }