/* * Created on Dec 20, 2003 * */ package jmslexamples.jsyn; import java.awt.*; import java.awt.event.*; import com.softsynth.jmsl.*; import com.softsynth.jmsl.jsyn.JSynInsFromClassName; import com.softsynth.jmsl.jsyn.JSynMusicDevice; /** * Alter performance data non-destructively using DataTranslator * * Play a MusicShape with chromatic pitches. * * Check a box to set/unset its DataTranslator to a WholeToneTranslator * * @see com.softsynth.jmsl.DataTranslator * @see jmslexamples.jsyn.DataTranslatorVectorDemo * * @author Nick Didkovsky, email: didkovn@mail.rockefeller.edu, (c) 2003 Nick Didkovsky, all rights reserved. * */ public class DataTranslatorDemo extends java.applet.Applet implements ItemListener, ActionListener { MusicShape myShape; JMSLMixerContainer mixer; Button startButton; Button stopButton; Checkbox useTranslatorCheckbox; public void init() { } public void start() { setLayout(new BorderLayout()); add(BorderLayout.NORTH, useTranslatorCheckbox = new Checkbox("Use Whole Tone Translator")); useTranslatorCheckbox.addItemListener(this); Panel p = new Panel(); p.setLayout(new GridLayout(1, 2)); p.add(startButton = new Button("START")); startButton.addActionListener(this); p.add(stopButton = new Button("STOP")); add(BorderLayout.SOUTH, p); stopButton.addActionListener(this); stopButton.setEnabled(false); buildMusic(); } private void buildMusic() { MusicDevice dev = JSynMusicDevice.instance(); dev.open(); JSynInsFromClassName ins = new JSynInsFromClassName(4, com.softsynth.jsyn.circuits.FilteredSawtoothBL.class.getName()); mixer = new JMSLMixerContainer(); mixer.addInstrument(ins); mixer.start(); myShape = new MusicShape(4); for (int i = 0; i < 13; i++) { myShape.add(0.25, i + 60, 0.5, 0.2); } myShape.setInstrument(ins); myShape.setRepeats(Integer.MAX_VALUE); } public void stop() { myShape.finishAll(); removeAll(); JMSL.closeMusicDevices(); } public void itemStateChanged(ItemEvent arg0) { if (useTranslatorCheckbox.getState()) { System.out.println("Set translator"); myShape.setDataTranslator(new WholeToneTranslator(60)); } else { System.out.println("UNSet translator"); myShape.setDataTranslator(null); } } public void actionPerformed(ActionEvent ev) { Object source = ev.getSource(); if (source == startButton) { myShape.launch(JMSL.now()); startButton.setEnabled(false); stopButton.setEnabled(true); } if (source == stopButton) { myShape.finishAll(); stopButton.setEnabled(false); startButton.setEnabled(true); } } private class WholeToneTranslator implements DataTranslator { double centerPitch; public WholeToneTranslator(double centerPitch) { this.centerPitch = centerPitch; } public double[] translate(MusicJob job, double[] data) { // make a copy of the incoming double[] double[] dar = new double[data.length]; System.arraycopy(data, 0, dar, 0, data.length); double difference = dar[1] - centerPitch; dar[1] = dar[1] + 2 * difference; return dar; } } }