package vafusion.inst;
import jm.audio.io.*;
import jm.audio.synth.*;
import jm.music.data.Note;
import jm.audio.AudioObject;
import jm.audio.Instrument;
/**
* A basic additive synthesis instrument implementation
* which implements envelope and volume control
* @author Andrew Sorensen and Andrew Brown
*/
public final class VibesInst extends Instrument{
//----------------------------------------------
// Attributes
//----------------------------------------------
/** the relative frequencies which make up this note */
private float[] frequencies;
/** the volumes to use for each frequency */
private float[] volumes;
/** The points to use in the construction of Envelopes */
private EnvPoint[][] points;
/** Pan */
private float pan;
/** The sample Rate to use */
private int sampleRate;
/** The Oscillators to use for each frequency specified */
private Oscillator[] wt;
/** Splitter object splits the signal into multiple outputs */
//private Splitter split;
/** The envelope to apply to each Oscillator's output */
private Envelope[] env;
/** The volume to apply to each envelopes output */
private Volume[] vol;
/** The object that adds it all together */
private Add add;
/** This is where it all gets added together */
//public AUOut auFile;
/** Stereo Pan Audio Object */
private StereoPan[] span;
/** resample */
//private ReSample[] resample;
private boolean header = true;
private static int count = 0;
private SampleOut sout;
//----------------------------------------------
// Constructor
//----------------------------------------------
public VibesInst(int sampleRate){
//Provide some defaults
this.sampleRate = sampleRate;
// how many partials in this additive synthesis isnstrument?
int overtones = 3;
// create an envelope for each partial
EnvPoint[] pointArray = {
new EnvPoint((float)0.0, (float)0.0),
new EnvPoint((float)0.002, (float)1.0),
new EnvPoint((float)0.3, (float)0.3),
new EnvPoint((float)0.9, (float)0.1),
new EnvPoint((float)1.0, (float)0.0)
};
EnvPoint[] pointArray2 = {
new EnvPoint((float)0.0, (float)0.0),
new EnvPoint((float)0.02, (float)1.0),
new EnvPoint((float)0.2, (float)0.2),
new EnvPoint((float)0.9, (float)0.0)
};
EnvPoint[] pointArray3 = {
new EnvPoint((float)0.0, (float)0.0),
new EnvPoint((float)0.02, (float)1.0),
new EnvPoint((float)0.4, (float)0.3),
new EnvPoint((float)0.8, (float)0.0)
};
this.points=new EnvPoint[overtones][4];
this.frequencies=new float[overtones];
this.volumes=new float[overtones];
// Extend these parrameters for each overtone
this.points[0]=pointArray; this.points[1]=pointArray2; this.points[2]=pointArray3;
this.frequencies[0]=(float)1.0; this.frequencies[1]=(float)2.7; this.frequencies[2]=(float)6.75;
this.volumes[0]=(float)1.0; this.volumes[1]=(float)0.77; this.volumes[2]=(float)0.7;
}
/**
* Basic default constructor to set an initial
* sampling rate and buffersize in addition
* to the neccessary frequency relationships
* and volumes for each frequency to be added
* the instrument
* @param sampleRate
* @param frequencies the relative freqencies to use
* @param volumes the volumes to use for the frequencies
*/
public VibesInst(int sampleRate, float[] frequencies,
float[] volumes,EnvPoint[][] points){
this.frequencies = frequencies;
this.volumes = volumes;
this.points = points;
this.sampleRate = sampleRate;
}
//----------------------------------------------
// Methods
//----------------------------------------------
/**
* Initialisation method is used to build the objects that
* this instrument will use
*/
@Override
public void createChain(){
//define the audio chain(s)
env = new Envelope[frequencies.length];
vol = new Volume[frequencies.length];
span = new StereoPan[frequencies.length];
wt = new Oscillator[frequencies.length];
for(int i=0;i<frequencies.length;i++){
wt[i] = new Oscillator(this, Oscillator.SINE_WAVE,
this.sampleRate, 2);
wt[i].setFrqRatio(frequencies[i]);
env[i] = new Envelope(wt[i], points[i]);
vol[i] = new Volume(env[i], volumes[i]);
span[i] = new StereoPan(vol[i], this.pan);
}
//And now the add object brings us back to one path.
add = new Add(span);
sout = new SampleOut(add);
}
}