package jass.generators;
import jass.engine.*;
import java.net.*;
/**
A force model based on looping through a buffer, loaded from an audio
file or provided by caller. Adds a probablility to "misfire", i.e.,
skip a section of the loop.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class ErraticLoopBuffer extends LoopBuffer {
/** misfire probability per buffer */
private float misfireProb = 0;
/** Set probability of misfiring per call to computeBuffer
@param val probability.
*/
public void setMisfireProb(float val) {
misfireProb = val;
}
/** Get probability of misfiring per call to computeBuffer
@return probability.
*/
public float getMisfireProb() {
return misfireProb;
}
/**
For derived classes
@param bufferSize biffer size
*/
public ErraticLoopBuffer(int bufferSize) {
super(bufferSize); // this is the internal buffer size
}
/** Construct loop force from named file.
@param srate sampling rate in Hertz.
@param bufferSize bufferSize of this Out
@param fn Audio file name.
*/
public ErraticLoopBuffer(float srate,int bufferSize, String fn) {
super(srate,bufferSize,fn);
}
/** Construct loop force from url
@param srate sampling rate in Hertz.
@param bufferSize bufferSize of this Out
@param url Audio file url.
*/
public ErraticLoopBuffer(float srate,int bufferSize, URL url) {
super(srate,bufferSize,url);
}
/** Construct loop force and provide buffer
@param srate sampling rate in Hertz.
@param bufferSize bufferSize of this Out.
@param loopBuffer looping buffer.
*/
public ErraticLoopBuffer(float srate,int bufferSize, float[] loopBuffer) {
super(srate,bufferSize,loopBuffer);
}
/** Compute the next buffer.
Skip 1/2 loop with probability misfireProb.
*/
public void computeBuffer() {
if(Math.random() < misfireProb) {
// Skip 1/3 a sample forward
int bufsz = getBufferSize();
ix += loopBufferLength/3;
if(ix >= loopBufferLength) {
ix -= loopBufferLength;
}
}
super.computeBuffer();
}
}