/* * Created by Nick on Dec 5, 2004 * */ package jmslexamples.jsyn; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Vector; import javax.swing.JApplet; import com.didkovsky.portview.PVCheckbox; import com.didkovsky.portview.PVPanel; import com.didkovsky.portview.swing.ViewFactorySwing; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.jsyn.JSynInsFromClassName; import com.softsynth.jmsl.jsyn.JSynMusicDevice; import com.softsynth.jmsl.util.TuningTable; import com.softsynth.jmsl.view.PVPanelAdapter; import com.softsynth.jsyn.circuits.FilteredSawtoothBL; /** * Use checkboxes as virtual keys for any tuning. Keys show frequency. From an * idea by Paul Reiners * * @author Nick Didkovsky, (c) 2004 All rights reserved, Email: * didkovn@mail.rockefeller.edu * */ public class VirtualKeyboard extends JApplet implements ItemListener { Vector virtualKeys; TuningTable tuning; JSynInsFromClassName instrument; JMSLMixerContainer mixer; public void start() { JMSL.setIsApplet(true); JMSL.setViewFactory(new ViewFactorySwing()); JSynMusicDevice.instance().open(); getContentPane().setLayout(new BorderLayout()); buildTuning(); buildVirtualKeys(); buildInstrument(); buildMixer(); } private void buildMixer() { mixer = new JMSLMixerContainer(); mixer.start(); mixer.addInstrument(instrument); getContentPane().add(BorderLayout.SOUTH, mixer.getPanAmpControlPanel()); } public void stop() { removeAll(); JMSL.closeMusicDevices(); } private void buildInstrument() { instrument = new JSynInsFromClassName(16, FilteredSawtoothBL.class.getName()); instrument.setTuning(tuning); // !!!! instrument.setName("Band Limitted Sawtooth"); } private void buildTuning() { double[] frequencies = { 274.8, 298.8, 316.6, 330.0, 358.4, 368.2, 421.1, 452.4, 482.6, 533.9 }; tuning = new TuningTable(frequencies); } private void buildVirtualKeys() { virtualKeys = new Vector(); PVPanel panel = new PVPanelAdapter(); panel.setLayout(new GridLayout(1, 0)); for (int i = 0; i < tuning.getStepsPerOctave(); i++) { double pitch = indexToPitch(i); double frequency = tuning.getFrequency(pitch); PVCheckbox cb = JMSL.getViewFactory().createCheckbox(frequency + ""); virtualKeys.add(cb); panel.add(cb.getComponent()); cb.addItemListener(this); } getContentPane().add(BorderLayout.NORTH, panel.getComponent()); } private double indexToPitch(int i) { return tuning.getReferencePitch() + i; } public void itemStateChanged(ItemEvent ev) { Object source = ev.getSource(); boolean state = ((PVCheckbox) source).getState(); int index = virtualKeys.indexOf(source); double pitch = indexToPitch(index); double dur = 1.0; // not important since virtual key controls sustain double amplitude = 0.4; double hold = 1.0; // not important since virtual key controls sustain double[] data = { dur, pitch, amplitude, hold }; if (state) { instrument.on(JMSL.now(), 1.0, data); } else { instrument.off(JMSL.now(), 1.0, data); } System.out.println("pitch = " + pitch + ", selected? " + state); } }