package vafusion.inst; import jm.audio.io.*; import jm.audio.synth.*; import jm.music.data.Note; import jm.audio.Instrument; /** * An additive synthesis instrument implementation * which cross fades two different spectra, each * with five partials. * @author Andrew Brown */ public final class AddMorphInst extends Instrument{ //---------------------------------------------- // Attributes //---------------------------------------------- private int overtones = 10; /** the relative frequencies which make up this note */ private double[] freqVals = {1.0, 3.0, 5.0, 7.0, 9.0, 1.0, 2.8, 5.6, 8.4, 11.0}; /** the volumes to use for each frequency */ private double[] volVals = {1.0, 0.7, 0.5, 0.3, 0.2, 1.0, 0.7, 0.5, 0.3, 0.2}; /** The points to use in the construction of Envelopes */ private double[][] points = new double[overtones][6]; private double[] pointArray1 = {0.0, 0.0, 0.02, 1.0, 1.0, 0.0}; private double[] pointArray2 = {0.0, 0.0, 0.98, 1.0, 1.0, 0.0}; /** Pan */ private float pan; /** The sample Rate to use */ private int sampleRate; /** The Oscillators to use for each frequency specified */ private Oscillator[] osc; /** The envelope to apply to each Oscillator's output */ private Envelope[] env; /** The volume to apply to each envelopes output */ private Volume[] vol; //---------------------------------------------- // Constructor //---------------------------------------------- public AddMorphInst(int sampleRate){ this.sampleRate = sampleRate; // set up envelope points for (int i=0; i<5; i++) { points[i] = pointArray1; } for (int i=5; i<10; i++) { points[i] = pointArray2; } } //---------------------------------------------- // Methods //---------------------------------------------- /** * Initialisation method is used to build the objects that * this instrument will use */ @Override public void createChain(){ //define the audio chain(s) osc = new Oscillator[overtones]; env = new Envelope[overtones]; vol = new Volume[overtones]; for(int i=0;i<overtones;i++){ osc[i] = new Oscillator(this, Oscillator.SINE_WAVE, this.sampleRate, 2); osc[i].setFrqRatio((float)freqVals[i]); env[i] = new Envelope(osc[i], points[i]); vol[i] = new Volume(env[i], (float)volVals[i]); } //And now the add object brings us back to one path. Add add = new Add(vol); StereoPan span = new StereoPan(add); SampleOut sout = new SampleOut(span); } }