/* * Created on May 14, 2004 * */ package jmsltutorial; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Hashtable; import com.softsynth.jmsl.*; import com.softsynth.jmsl.jsyn.JSynInsFromClassName; import com.softsynth.jmsl.jsyn.JSynMusicDevice; import com.softsynth.jmsl.util.WeightedObjectChooser; import com.softsynth.jmsl.view.JMSLScrollbar; import com.softsynth.jmsl.view.JMSLScrollbarProcessor; /** * Plays a SequentialCollection which has a WeightedObjectChooser as its * Behavior. The MusicShapes are added to the WeightedObjectChooser, and * scrollbars are provided to set their relative weights (ie probabilities of * being chosen).
* Thanks to Larry Polansky for suggesting WeightedObjectChooser. * * @author Nick Didkovsky, email: didkovn@mail.rockefeller.edu, (c) 2004 Nick * Didkovsky, all rights reserved. * */ public class WeightedObjectToot extends java.applet.Applet implements ActionListener, JMSLScrollbarProcessor { SequentialCollection seq; MusicShape triller; MusicShape chorder; MusicShape arpeggio; JMSLScrollbar trillerWeightSB; JMSLScrollbar chorderWeightSB; JMSLScrollbar arpeggioWeightSB; WeightedObjectBehavior weightedObjectBehavior; Button startButton; Button stopButton; JMSLMixerContainer mixer; Hashtable composableTextFieldHashtable = new Hashtable(); JSynInsFromClassName ins; public void init() { JMSLRandom.randomize(); } public void start() { JMSL.clock.setAdvance(0.1); JSynMusicDevice.instance().open(); ins = new JSynInsFromClassName(8, com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName()); mixer = new JMSLMixerContainer(); mixer.start(); mixer.addInstrument(ins); buildComposables(); buildGUI(); } void buildComposables() { triller = new MusicShape(4); triller.add(0.125, 80, 0.2, 0.1); triller.add(0.125, 93, 0.2, 0.1); triller.setRepeats(5); triller.setInstrument(ins); chorder = new MusicShape(4); chorder.add(0, 40, 0.3, 1); chorder.add(0, 40.5, 0.3, 1); chorder.add(1, 40.9, 0.3, 1); chorder.add(0, 50, 0.3, 1); chorder.add(0, 50.5, 0.3, 1); chorder.add(1, 50.9, 0.3, 1); chorder.setInstrument(ins); arpeggio = new MusicShape(4); arpeggio.add(0.2, 60, 0.4, 2); arpeggio.add(0.2, 64, 0.4, 2); arpeggio.add(0.2, 68, 0.4, 2); arpeggio.add(1.2, 72, 0.4, 2); arpeggio.setInstrument(ins); weightedObjectBehavior = new WeightedObjectBehavior(); weightedObjectBehavior.addWeightedObject(triller, 0.5); weightedObjectBehavior.addWeightedObject(chorder, 0.5); weightedObjectBehavior.addWeightedObject(arpeggio, 0.5); seq = new SequentialCollection(); seq.setRepeats(Integer.MAX_VALUE); seq.setBehavior(weightedObjectBehavior); } Panel gimmeScrollbarPanel(JMSLScrollbar sb, String name) { sb.setSize(100, 25); sb.setPageIncrement(10); sb.setLineIncrement(1); Panel p = new Panel(); p.setLayout(new GridLayout(1, 2)); p.add(new Label(name)); p.add(sb); return p; } void buildGUI() { setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new GridLayout(0, 1)); p.add(startButton = new Button("START")); p.add(stopButton = new Button("STOP")); add(BorderLayout.NORTH, p); Panel weightPanel = new Panel(); weightPanel.setLayout(new GridLayout(0, 1)); weightPanel.add(gimmeScrollbarPanel(trillerWeightSB = new JMSLScrollbar(this, 50, 1, 100), "Triller weight")); weightPanel.add(gimmeScrollbarPanel(chorderWeightSB = new JMSLScrollbar(this, 50, 1, 100), "Chorder weight")); weightPanel.add(gimmeScrollbarPanel(arpeggioWeightSB = new JMSLScrollbar(this, 50, 1, 100), "Arpeggio weight")); add(BorderLayout.SOUTH, weightPanel); startButton.addActionListener(this); stopButton.addActionListener(this); } public void stop() { removeAll(); seq.finishAll(); JMSL.closeMusicDevices(); } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == startButton) { startButton.setEnabled(false); stopButton.setEnabled(true); seq.launch(JMSL.now()); } if (source == stopButton) { stopButton.setEnabled(false); startButton.setEnabled(true); seq.finish(); } } public void JMSLScrollbarValueChanged(JMSLScrollbar jsb) { double value = jsb.getValue() / 100.0; if (jsb == trillerWeightSB) weightedObjectBehavior.setWeight(triller, value); if (jsb == chorderWeightSB) weightedObjectBehavior.setWeight(chorder, value); if (jsb == arpeggioWeightSB) weightedObjectBehavior.setWeight(arpeggio, value); } } class WeightedObjectBehavior extends WeightedObjectChooser implements Behavior { public Composable choose(SequentialCollection col) { return (Composable) next(); } }