package com.codefixia.audio; import com.codefixia.drumcloud.DrumCloud; /** * This class can play wavetables and includes an fx chain */ public class WavetableSynth extends AudioPlayer { private short[] sine; private short[] saw; private short[] wavetable; private float sampleRate; public WavetableSynth(int size, float sampleRate) { super(sampleRate); sine = new short[size]; for (float i = 0; i < sine.length; i++) { float phase; phase = DrumCloud.TWO_PI / size * i; sine[(int)i] = (short) (DrumCloud.sin(phase) * 32768); } saw = new short[size]; for (float i = 0; i<saw.length; i++) { saw[(int)i] = (short) (i / (float)saw.length *32768); } this.sampleRate = sampleRate; setAudioData(sine); setLooping(true); } public void setFrequency(float freq) { if (freq > 0) { //println("freq freq "+freq); setDReadHead((float)getAudioData().length / sampleRate * freq); } } public void loadWaveForm(float[] wavetable_) { if (wavetable == null || wavetable_.length != wavetable.length) { // only reallocate if there is a change in length wavetable = new short[wavetable_.length]; } for (int i=0;i<wavetable.length;i++) { wavetable[i] = (short) (wavetable_[i] * 32768); } setAudioData(wavetable); } }