/* * Created by Nick on May 16, 2005 * */ package jmsltestsuite; import com.softsynth.jmsl.JMSL; import com.softsynth.jmsl.JMSLMixerContainer; import com.softsynth.jmsl.MusicShape; import com.softsynth.jmsl.jsyn2.SamplePlayingInstrument; /** * This subclass of SamplePlayingInstrument overrides * getAlternativeSampleIndex() to map note 60 to three different samples based * on amplitude. Notice that one sample is mapped to 60. Two additional samples * are mapped to pitches 200 and 201, which we never expect to play directly. * They serve as convenient places to stash alternative samples within the * existing API. * * The logic of mapping quiet, medium, loud versions of middle c is implemented * in getAlternativeSampleIndex() * * @author Nick Didkovsky, (c) 2004 All rights reserved, Email: * nick@didkovsky.com * */ public class TransposingSamplePlayingInstrumentWithAmplitudeMap extends SamplePlayingInstrument { public TransposingSamplePlayingInstrumentWithAmplitudeMap(String dir) { super(dir); } /** * Precondition: pitchIndex points to a valid sample, previously loaded with * addSamplePitch(). Override this method to point to a different valid * sample index. For example, you might store a loud sample at pitchIndex 60 * and quiet sample at index 200 (ie some pitch index you'd never bang * directly), and if the amplitude of data[] < 0.3 return 200 for this * pitchIndex, else return 60) * *
public int getAlternativeSampleIndex(int pitchIndex, double timeStretch, double[] data) {
double amp = data[2];
if (pitchIndex == 60 && amp < 0.4) {
return 201;
}
if (pitchIndex == 60 && amp > 0.7) {
return 200;
}
return pitchIndex;
}
* @return valid index to use instead of pitchIndex.
*/
public int getAlternativeSampleIndex(int pitchIndex, double timeStretch, double[] data) {
double amp = data[2];
if (pitchIndex == 60 && amp < 0.4) {
return 201;
}
if (pitchIndex == 60 && amp > 0.7) {
return 200;
}
return pitchIndex;
}
public static void main(String args[]) {
java.awt.Frame f = new java.awt.Frame("TransposingSamplePlayingInstrument with alternative samples mapped to amplitude");
f.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
JMSL.closeMusicDevices();
System.exit(0);
}
});
f.setSize(300, 200);
f.setVisible(true);
String mySampleDirectory = "E:/JMSLScoreWork/JMSLScoreSamples/";
TransposingSamplePlayingInstrumentWithAmplitudeMap ins = new TransposingSamplePlayingInstrumentWithAmplitudeMap(mySampleDirectory);
ins.getMusicDevice().open();
ins.addSamplePitch("voice/c4_mf.wav", 60);
ins.addSamplePitch("voice/c4_ff.wav", 200);
ins.addSamplePitch("voice/c4_p.wav", 201);
ins.buildFromAttributes();
JMSLMixerContainer mixer = new JMSLMixerContainer();
mixer.addInstrument(ins);
mixer.start();
JMSL.clock.setAdvance(0.5);
MusicShape s = new MusicShape(4);
s.add(2.0, 60, 0.5, 1.85); // mf
s.add(2.0, 60, 0.75, 1.85); // ff
s.add(2.0, 60, 0.25, 1.85); // p
s.add(2.0, 61, 0.5, 1.85); // mf
s.add(2.0, 61, 0.75, 1.85); // ff
s.add(2.0, 61, 0.25, 1.85); // p
s.add(2.0, 59, 0.5, 1.85); // mf
s.add(2.0, 59, 0.75, 1.85); // ff
s.add(2.0, 59, 0.25, 1.85); // p
s.add(2.0, 59.5, 0.5, 1.85); // mf
s.add(2.0, 59.5, 0.75, 1.85); // ff
s.add(2.0, 59.5, 0.25, 1.85); // p
s.setInstrument(ins);
s.setRepeats(13);
s.launch(JMSL.now() + 0.5);
f.add(mixer.getPanAmpControlPanel());
f.pack();
}
}