com.softsynth.jmsl.jsyn
Class TransposingSamplePlayingInstrument

java.lang.Object
  extended by com.softsynth.jmsl.InstrumentAdapter
      extended by com.softsynth.jmsl.jsyn.SimpleSamplePlayingInstrument
          extended by com.softsynth.jmsl.jsyn.SimpleSamplePlayingInstrumentWithLoops
              extended by com.softsynth.jmsl.jsyn.TransposingSamplePlayingInstrument
All Implemented Interfaces:
Editable, Instrument, Namable, OutputProvider, Transposable, AttributeBuildable, DirectorySettable, HandleSpecialXMLTag
Direct Known Subclasses:
CelloSampleIns, TransposingSamplePlayingInstrumentWithAmplitudeMap

public class TransposingSamplePlayingInstrument
extends SimpleSamplePlayingInstrumentWithLoops

A JMSL Instrument that loads a sequence of monophonic SynthSamples. If there are gaps in the chromatic scale, a sample will be stretched up or down from the closest sample. While we recommend no more than a minor third between your samples for "believable" transposition, this is no longer enforced as of JMSL v103. Also new to v103, pitches may be fractional.

Each sample must have exactly two cue points: loop start and release start (where release start == loop end). Sustains by simply looping until release time. For smoother sustain, see TransposingSampleSustainingInstrument which uses crossfades for smooth sustaining.

This instrument loops an integer number of times (ie does not break out of loop early in order to get exact duration). This avoids a glitch when the period of a pitched instrument is shortened by the jump from sustain loop to release portion.
IMPORTANT: For Applets, the root sample directory passed to the constructor is ignored and CODEBASE is used instead!!!! So your samples should be in your applet's CODEBASE. The use of subfolders is ok, just make everything relative to CODEBASE. So for example, if locally you have a root sample directory called F:/JMSLScoreWork/JMSLScoreSamples/ relative to which all your samples are located, and inside it is violin/C60.wav, then your applet's CODEBASE, which might be a folder called "classes", should contain violin/C60.wav

This version adds new feature of being able to map pitches to different samples based on performance data, by overriding getAlternativeSampleIndex(). See examples in jmsltestsuite

New to build 20060408,this class supports new methods loadSample(SynthSample sample, int noteIndex) for dynamically created samples. Note that you MUST set your own cue points for your sample data (see below):

     
        SynthSample sample = new SynthSample(sampleData.length);
        sample.write(sampleData);
        sample.cuePoints = new java.util.Vector();
        sample.cuePoints.addElement(new CuePoint(10, 1));
        sample.cuePoints.addElement(new CuePoint(1000, 2));
        ins.addSamplePitch(sample, 60);

Author:
Nick Didkovsky, didkovn@mail.rockefeller.edu (C) 2001 Nick Didkovsky, all rights reserved.
See Also:
TransposingSamplePlayingInstrumentWithAmplitudeMap, TransposingSampleSustainingInstrument

Field Summary
 
Fields inherited from class com.softsynth.jmsl.jsyn.SimpleSamplePlayingInstrument
POLYPHONY
 
Constructor Summary
TransposingSamplePlayingInstrument()
           
TransposingSamplePlayingInstrument(java.lang.String sampleDirectory)
          constructor.
 
Method Summary
 void buildFromAttributes()
           
 double calcRateForTransposition(double audioFrameRate, double pitch, double closestSampledPitch)
          If you have a smaple tuned to closestSampledPitch, this method calculates the playback rate to make that smaple sound at desired pitch.
static void main(java.lang.String[] args)
           
 double play(double playTime, double timeStretch, double[] dar)
          If there is a sample loaded at dar[1], bang it.
 
Methods inherited from class com.softsynth.jmsl.jsyn.SimpleSamplePlayingInstrumentWithLoops
addSamplePitch, clear, getSampleLoopRegioner, getSampleLoopRegioners, loadSample
 
Methods inherited from class com.softsynth.jmsl.jsyn.SimpleSamplePlayingInstrument
addEditListener, addSamplePitch, addSamplePitch, close, edit, getAlternativeSampleIndex, getDirectory, getEditEnabled, getNumChannels, getNumOutputs, getOutput, getOutput, getPitches, getSampleFilename, getSynthSamples, getTuning, getVoices, handleSpecialTag, notifyEditListeners, off, on, open, reload, removeEditListener, setDirectory, setEditEnabled, setNumChannels, setTuning, testSampleDirectory, writeSpecialXMLTags
 
Methods inherited from class com.softsynth.jmsl.InstrumentAdapter
getDimensionNameSpace, getInterpreter, getMixerClassName, getMusicDevice, getName, getTransposition, noteOff, noteOn, noteOnFor, setDimensionNameSpace, setInterpreter, setMixerClassName, setMusicDevice, setName, setTransposition, toString, update
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

TransposingSamplePlayingInstrument

public TransposingSamplePlayingInstrument()

TransposingSamplePlayingInstrument

public TransposingSamplePlayingInstrument(java.lang.String sampleDirectory)
constructor. sample directory string must end in dir delimitter, ex "F:\samples\"

Method Detail

buildFromAttributes

public void buildFromAttributes()
Specified by:
buildFromAttributes in interface AttributeBuildable
Overrides:
buildFromAttributes in class SimpleSamplePlayingInstrument

play

public double play(double playTime,
                   double timeStretch,
                   double[] dar)
Description copied from class: SimpleSamplePlayingInstrument
If there is a sample loaded at dar[1], bang it. No sustain, no transposition. Hold time is not used to terminate sample early.

Specified by:
play in interface Instrument
Overrides:
play in class SimpleSamplePlayingInstrumentWithLoops

calcRateForTransposition

public double calcRateForTransposition(double audioFrameRate,
                                       double pitch,
                                       double closestSampledPitch)
If you have a smaple tuned to closestSampledPitch, this method calculates the playback rate to make that smaple sound at desired pitch. If this instrument has a Tuning, this method will use it else it will use 12tet

Parameters:
audioFrameRate -
pitch -
closestSampledPitch -
Returns:
rate to play back sample tuned to closestSampledPitch to achieve pitch

main

public static void main(java.lang.String[] args)