package vafusion.inst;
import jm.audio.io.*;
import jm.audio.synth.*;
import jm.music.data.Note;
import jm.audio.AudioObject;
import jm.audio.AOException;
/**
* A basic FM synthesis instrument implementation
* @author Andrew Sorensen
*/
public final class RTSimpleFMInst extends jm.audio.Instrument{
//----------------------------------------------
// Attributes
//----------------------------------------------
/** The wavetables to use for each frequency specified */
private WaveTable wt1;
/** The wavetables to use for each frequency specified */
private WaveTable wt2;
/** The envelope to apply to each wavetable's output */
private Envelope env;
/** Add the streams together */
private Add add;
/** The volume to apply to each envelopes output */
private Volume vol;
/** This is where it all gets added together */
public SampleOut sout;
/** Pan */
private float pan;
/** The points to use in the construction of Envelopes */
private EnvPoint[] pointArray = new EnvPoint[10];
/** The number of channels */
private int channels;
/** The deviation index */
private int dIndex;
/** The frequency ratio from the carrier frequency (the notes pitch) */
private float frqRatio;
private int sampleRate;
//----------------------------------------------
// Constructor
//----------------------------------------------
/**
* Basic default constructor to set an initial
* sampling rate.
* @param sampleRate
*/
public RTSimpleFMInst(int sampleRate, int dIndex, double ratio){
this(sampleRate, 1, dIndex, ratio);
}
/**
* A constructor to set an initial
* sampling rate and number of channels.
* @param sampleRate
*/
public RTSimpleFMInst(int sampleRate, int channels, int dIndex, double ratio){
this.sampleRate = sampleRate;
EnvPoint[] tempArray = {
new EnvPoint((float)0.0, (float)0.0),
new EnvPoint((float)0.1, (float)1.0),
new EnvPoint((float)0.15, (float)0.4),
new EnvPoint((float)0.9, (float)0.3),
new EnvPoint((float)1.0, (float)0.0)
};
pointArray = tempArray;
this.channels = channels;
this.dIndex = dIndex;
this.frqRatio = (float)ratio;
}
//----------------------------------------------
// Methods
//----------------------------------------------
@Override
public void setController(double[] index){
if(this.wt1 == null)return;
this.wt1.setAmp((float)index[0]);
}
/**
* Initialisation method used to build the objects that
* this instrument will use
*/
@Override
public void createChain()throws AOException{
Oscillator osc = new Oscillator(this, Oscillator.SINE_WAVE, this.sampleRate, this.channels);
osc.setAmp(this.dIndex);
osc.setFrqRatio(this.frqRatio);
Value cf = new Value(this,this.sampleRate,this.channels,1);
AudioObject[] grp1 = {cf,wt1};
Add add = new Add(grp1);
Oscillator osc2 = new Oscillator(add,Oscillator.SINE_WAVE, 1);
Envelope env = new Envelope(osc2,pointArray);
Volume vol = new Volume(env,(float)1.0);
/*
Splitter split = new Splitter(vol);
Comb comb1 = new Comb(split,30,0.5);
Comb comb2 = new Comb(split,40,0.5);
Comb comb3 = new Comb(split,157,0.5);
Comb comb4 = new Comb(split,90,0.5);
AudioObject[] grp2 = {comb1,comb2,comb3,comb4};
Add add2 = new Add(grp2);
AllPass ap1 = new AllPass(add2,200,0.5);
AllPass ap2 = new AllPass(ap1,50,0.5);
*/
StereoPan span = new StereoPan(vol);
//SampleOut sout = new SampleOut(span, "jmusic.tmp");
}
}