package jmslexamples.jsyn;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import com.softsynth.jmsl.EventScheduler;
import com.softsynth.jmsl.JMSL;
import com.softsynth.jmsl.jsyn.JSynMusicDevice;
import com.softsynth.jmsl.jsyn.SynthNoteAllPortsInstrument;
import com.softsynth.jmsl.score.*;
import com.softsynth.jsyn.AppletFrame;
import com.softsynth.jsyn.Synth;
/**
* Score with a SynthNoteAllPortsInstrument orchestra
*
* Double click on a note to edit its timbre
* This instrument takes a SynthNote class name and max voices in its
* constructor, and will make each input port editable
*
*
*
* @author Nick Didkovsky, copyright 2000 Nick Didkovsky
*/
public class PolyTimbralScoreDemo extends java.applet.Applet {
Score score;
ScoreFrame scoreFrame;
Orchestra orch;
public void init() {
}
public void start() {
initMusicDevices();
initJMSL();
buildOrchestra();
buildScore();
buildScoreFrame();
}
private void buildScoreFrame() {
scoreFrame = new ScoreFrame("PolyTimbral JMSL Score JSyn Demo by Nick Didkovsky, copyright 2000 Nick Didkovsky");
scoreFrame.addScore(score);
// force netscape to size window ok
scoreFrame.setSize(score.getLayoutWidth() + 100, score.getLayoutHeight() + 100);
scoreFrame.setVisible(true);
}
private void buildScore() {
int w = 1000;
int h = 700;
int numStaves = 4;
score = new Score(numStaves, w, h, "JMSL Score JSyn Demo by Nick Didkovsky, copyright 2000 Nick Didkovsky");
score.addMeasure();
score.setOrchestra(orch);
score.getScoreLayoutManager().setZoom(0.5);
score.getControlPanel().setZoom(0.5);
}
private void buildOrchestra() {
orch = new Orchestra();
String synthNoteName = com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName();
orch.addInstrument(new SynthNoteAllPortsInstrument(8, synthNoteName), "Bob");
orch.addInstrument(new SynthNoteAllPortsInstrument(8, synthNoteName), "Fran");
orch.addInstrument(new SynthNoteAllPortsInstrument(8, synthNoteName), "Jimbo");
orch.addInstrument(new SynthNoteAllPortsInstrument(8, synthNoteName), "Toots");
orch.getJMSLMixerContainer().panAmpChange(2, 0.1, 0.9);
}
private void initJMSL() {
JMSL.clock.setAdvance(0.1);
JMSL.clock.setAdvance(1.0);
JMSL.scheduler = new EventScheduler();
JMSL.scheduler.start();
JMSL.setIsApplet(true);
}
private void termJMSL() {
JMSL.scheduler.stop();
JMSL.closeMusicDevices();
}
private void initMusicDevices() {
JSynMusicDevice.instance().open();
}
public ScoreFrame getScoreFrame() {
return scoreFrame;
}
public void stop() {
removeAll();
scoreFrame.setVisible(false);
scoreFrame.dispose();
Synth.stopEngine();
}
public void paint(Graphics g) {
g.drawString("Your score has been opened in a Frame outside this browser", 20, 20);
g.drawString("Add notes, double click on a note and change its timbre", 20, 50);
}
/* Can be run as either an application or as an applet. */
public static void main(String args[]) {
PolyTimbralScoreDemo applet = new PolyTimbralScoreDemo();
AppletFrame frame = new AppletFrame("PolyTimbralScoreDemo", applet);
frame.setSize(500, 200);
frame.show();
/*
* Begin test after frame opened so that DirectSound will use Java
* window.
*/
frame.test();
JMSL.setIsApplet(false);
applet.getScoreFrame().addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
JMSL.closeMusicDevices();
System.exit(0);
}
});
}
}