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);
}
});
}
}