package jmslexamples.jsyn2; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import com.softsynth.jmsl.DimensionNameSpace; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLRandom; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.jsyn2.JSynMusicDevice; import com.softsynth.jmsl.jsyn2.JSynUnitVoiceInstrument; import com.softsynth.jmsl.score.Note; import com.softsynth.jmsl.score.Orchestra; import com.softsynth.jmsl.score.Score; import com.softsynth.jmsl.score.ScoreFrame; /** * Generate a JMSL Score algorithmically. Timbre changes from note to note. * * Key idea: build a double array and call score.addNote(dimensionNameSpace, * doubleArray); * * JSyn adaptation Dec 2016 * * @author Nick Didkovsky, copyright 2000 Nick Didkovsky */ public class AlgorithmicTimbreScoreDemo { Score score; ScoreFrame scoreFrame; int numStaves; MusicShape oofShape; JSynUnitVoiceInstrument ins; Orchestra orch; public void start() { initMusicDevices(); buildInstruments(); buildOrchestra(); buildScore(); buildScoreFrame(); } 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 unitVoiceClassName = com.softsynth.jmsl.jsyn2.unitvoices.FilteredSawtoothBL.class.getName(); ins = new JSynUnitVoiceInstrument(); ins.setPolyphony(8); ins.setUnitVoiceClassName(unitVoiceClassName); 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"; score = new Score(numStaves, w, h, scoreTitle); score.setComposer("Nick Didkovsky"); score.setCopyright("(c) 2016 Nick Didkovsky"); 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; } /* Can be run as either an application or as an applet. */ public static void main(String args[]) { AlgorithmicTimbreScoreDemo demo = new AlgorithmicTimbreScoreDemo(); demo.start(); demo.getScoreFrame().addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { JMSL.closeMusicDevices(); System.exit(0); } }); } }