package jmsltestsuite; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Enumeration; import java.util.Vector; import com.didkovsky.portview.PVFrame; 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.*; import com.softsynth.jmsl.score.util.SAPScoreWriter; import com.softsynth.jmsl.util.HailstoneSequence; import com.softsynth.jmsl.util.Oof; /** * Exercise Score. Generate a variety of melodies from simple algorithms and * notate them.
* Top Staff uses a 1/F generator
* Middle Staff uses a white noise generator
* Bottom Staff uses a HailstoneSequence generator
* Write out a file readable by San Andreas Press's SCORE Music Typography * System JMSL Notation Project
* * @author Nick Didkovsky and Phil Burk, copyright 2000 Nick Didkovsky and Phil * Burk */ public class ScoreTest { Score score; int numStaffs; PVPanel panel; public ScoreTest() { panel = JMSL.getViewFactory().createPanel(); int w = 1300; int h = 750; numStaffs = 3; score = new Score(numStaffs, w, h); 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()); build(); } public PVPanel getPanel() { return panel; } public void build() { double epsilon = 0.0001; JMSLRandom.randomize(); Oof oofGen = new Oof(5); // generate melody for top staff HailstoneSequence hailGen = new HailstoneSequence(); oofGen.randomize(); hailGen.randomize(); score.addMeasure(); score.getMeasure(0).getStaff(2).setClef(Clef.BASS_CLEF); for (int measureNumber = 0; measureNumber < 10; measureNumber++) { score.addMeasure(); score.setCurrentMeasureNumber(measureNumber); // addNote() later // adds to // currentMeasureNumber for (int staff = 0; staff < numStaffs; staff++) { score.setCurrentStaffNumber(staff); // fill up each 4/4 measure with algorithmically generated notes for (int beat = 0; beat < 4;) { // System.out.println("beat=" + beat); // First create a Vector of Durations that add up to one or // two beats Vector durations = new Vector(); double numBeatsToFill = 1; if (JMSLRandom.choose(6) == 0) numBeatsToFill = 2; if ((beat + numBeatsToFill) > 4) numBeatsToFill = 1; double[] tuplets; if (numBeatsToFill == 1.0) { tuplets = new double[5]; tuplets[0] = 2; tuplets[1] = 3; tuplets[2] = 5; tuplets[3] = 3.5; tuplets[4] = 5.5; } else { tuplets = new double[1]; tuplets[0] = 3; } double tuplet = tuplets[JMSLRandom.choose(tuplets.length)]; double durTotal = 0; while ((numBeatsToFill - durTotal) > epsilon) { double dur = numBeatsToFill / (tuplet * Math.pow(2, JMSLRandom.choose(2))); while (((dur + durTotal) - numBeatsToFill) > epsilon) { // overflow? // choose // again! dur = numBeatsToFill / (tuplet * Math.pow(2, JMSLRandom.choose(2))); } durations.addElement(new Double(dur)); durTotal += dur; // System.out.println("Added dur=" + dur + ", durTotal=" // + durTotal); } // Now run through the Vector of durations and give them // picthes from one of three // algorithmic methods for (Enumeration e = durations.elements(); e.hasMoreElements();) { double dur = ((Double) e.nextElement()).doubleValue(); // System.out.println("Gen pitch for dur=" + dur); double pitch; switch (staff) { case 0: pitch = oofGen.next() + NoteFactory.MIDDLE_C; break; case 1: pitch = JMSLRandom.choose(32) + NoteFactory.MIDDLE_C; break; case 2: pitch = (hailGen.next() % 32) + NoteFactory.MIDDLE_C; break; default: pitch = NoteFactory.MIDDLE_C; } // switch score.addNote(dur, pitch, 127, dur * 0.80); // dur note // vel hold score.getLastAddedNote().setBeamedOut(true); } score.getLastAddedNote().setBeamedOut(false); Note note = score.getLastAddedNote(); // System.out.println("Note's measure index is " + note.getMeasureIndex()); beat += (int) numBeatsToFill; } } } score.getScoreLayoutManager().setZoom(0.5); score.getControlPanel().setZoom(0.5); try { java.io.PrintWriter out = new java.io.PrintWriter(new java.io.BufferedOutputStream( new java.io.FileOutputStream("scoreout.txt"))); SAPScoreWriter scoreWriter = new SAPScoreWriter(score, out, "orch.tpl", "opus-"); scoreWriter.write(); out.close(); } catch (java.io.IOException e) { System.out.println("Error creating score file " + e); } } public static void main(String args[]) { // Score.setTempoVisible(false); JMSL.setViewFactory(new ViewFactorySwing()); ScoreTest st = new ScoreTest(); PVFrame f = JMSL.getViewFactory().createFrame(); f.add(st.getPanel().getComponent()); f.pack(); f.setVisible(true); f.setTitle("JMSL Score Project, close to exit"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }