package vafusion.inst; import jm.audio.io.*; import jm.audio.synth.*; import jm.music.data.Note; 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 TimpaniInst extends Instrument{ //---------------------------------------------- // Attributes //---------------------------------------------- private int overtones = 5; /** the relative frequencies which make up this note */ private double[] freqVals = {1.0, 1.42, 1.53, 1.77, 1.94}; /** the volumes to use for each frequency */ private double[] volVals = {1.0, 0.8, 0.7, 0.6, 0.5}; /** The points to use in the construction of Envelopes */ private double[][] points = new double[overtones][8]; private double[] pointArray1 = {0.0, 0.0, 0.002, 1.0, 0.3, 0.3, 1.0, 0.0}; private double[] pointArray2 = {0.0, 0.0, 0.05, 1.0, 0.2, 0.4, 1.0, 0.0}; private double[] pointArray3 = {0.0, 0.0, 0.1, 1.0, 0.4, 0.3, 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 TimpaniInst(int sampleRate){ this.sampleRate = sampleRate; // set up envelope points points[0] = pointArray1; points[1] = pointArray2; points[2] = pointArray3; points[3] = pointArray2; points[4] = pointArray3; } //---------------------------------------------- // 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); } }