package jmslexamples.jsyn; import java.awt.BorderLayout; import java.awt.Label; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import com.softsynth.jmsl.*; import com.softsynth.jmsl.jsyn.JSynMusicDevice; import com.softsynth.jmsl.jsyn.SynthNoteAllPortsInstrument; import com.softsynth.jmsl.score.*; import com.softsynth.jsyn.AppletFrame; /** * Generate a JMSL Score algorithmically. Timbre changes from note to note. * * Key idea: build a double array and call score.addNote(dimensionNameSpace, doubleArray); * * @author Nick Didkovsky, copyright 2000 Nick Didkovsky */ public class AlgorithmicTimbreScoreDemo extends java.applet.Applet { Score score; ScoreFrame scoreFrame; int numStaves; MusicShape oofShape; SynthNoteAllPortsInstrument ins; Orchestra orch; public void start() { setLayout(new BorderLayout()); add("North", new Label("Multi timbral algorithmically generated score")); initMusicDevices(); buildInstruments(); buildOrchestra(); buildScore(); buildScoreFrame(); JMSL.setIsApplet(true); validate(); } private void buildScoreFrame() { String scoreFrameTitle = "Multi timbral algorithmically generated score, by Nick Didkovsky, copyright 2000 Nick Didkovsky"; scoreFrame = new ScoreFrame(scoreFrameTitle); scoreFrame.addScore(score); score.getScoreLayoutManager().setZoom(0.5); score.getControlPanel().setZoom(0.5); scoreFrame.setVisible(true); // force netscape to size window ok scoreFrame.setSize(score.getLayoutWidth() + 500, score.getLayoutHeight() + 100); } private void buildOrchestra() { orch = new Orchestra(); orch.addInstrument(ins, "Filtered Sawtooth BL"); orch.buildMixer(); } private void buildInstruments() { String synthNoteClassName = com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName(); ins = new SynthNoteAllPortsInstrument(); ins.setMaxVoices(8); ins.setSynthNoteClassName(synthNoteClassName); ins.buildFromAttributes(); } private void initMusicDevices() { JSynMusicDevice.instance().open(); JMSL.clock.setAdvance(1.0); } void buildScore() { int w = 800; int h = 300; numStaves = 1; String scoreTitle = "Multi timbral algorithmically generated score, by Nick Didkovsky, copyright 2000 Nick Didkovsky"; score = new Score(numStaves, w, h, scoreTitle); score.setOrchestra(orch); score.addMeasure(); DimensionNameSpace dimensionNameSpace = ins.getDimensionNameSpace(); for (int i = 0; i < 12; i++) { double[] dar = { 1.0, 60 + i, 0.5, 0.8 }; dar = new double[dimensionNameSpace.dimension()]; // specify dur, note, amp, hold dar[0] = 1.0; dar[1] = 60 + i; dar[2] = 0.5; dar[3] = dar[0] * 0.9; // specify values for dimensions higher than 3 by randomly // choosing a value between the dimension's low and high value for (int dim = 4; dim < dimensionNameSpace.dimension(); dim++) { double lowLimit = dimensionNameSpace.getLowLimit(dim); double highLimit = dimensionNameSpace.getHighLimit(dim); double value = JMSLRandom.choose(lowLimit, highLimit); dar[dim] = value; } Note n = score.addNote(dimensionNameSpace, dar); JMSL.printDoubleArray(dar); } } public ScoreFrame getScoreFrame() { return scoreFrame; } public void stop() { removeAll(); scoreFrame.setVisible(false); scoreFrame.dispose(); JMSL.closeMusicDevices(); } /* Can be run as either an application or as an applet. */ public static void main(String args[]) { AlgorithmicTimbreScoreDemo applet = new AlgorithmicTimbreScoreDemo(); AppletFrame frame = new AppletFrame("JScoreMultiTimbralGen Demo", applet); frame.setSize(800, 300); frame.show(); frame.test(); JMSL.setIsApplet(false); applet.getScoreFrame().addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JMSL.closeMusicDevices(); System.exit(0); } }); } }