package jass.generators;
import jass.engine.*;
/**
A force model based on looping through N buffers, loaded from audio
files or provided by caller. Speed can be set as an N-vector. Volume is same.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class LoopNBuffers extends Out {
/** Number of buffers. */
protected int nbuffers;
/** Contains nbuffers looping buffers */
protected LoopBuffer[] lb;
/** Construct loop forces from named files.
@param srate sampling rate in Hertz.
@param bufferSize bufferSize of this Out
@param fn Audio file names.
*/
public LoopNBuffers(float srate,int bufferSize, String[] fn) {
super(bufferSize); // this is the internal buffer size
nbuffers = fn.length;
lb = new LoopBuffer[nbuffers];
for(int i=0;i<nbuffers;i++) {
lb[i] = new LoopBuffer(srate,bufferSize,fn[i]);
}
}
/** Set force magnitude.
@param val Volume.
*/
public void setVolume(float[] val) {
for(int i=0;i<nbuffers;i++) {
lb[i].setVolume(val[i]);
//System.out.println("bufVol0= "+val[0]+" bufVol1= "+val[1]);
}
}
/** Set force magnitude.
@param i index of loppbuffer to set
@param val Volume.
*/
public void setVolume(int i,float val) {
lb[i].setVolume(val);
}
/** Set loopspeed.
@param speed Loop speeds, 1 corresponding to original recorded speed.
*/
public void setSpeed(float[] speed) {
for(int i=0;i<nbuffers;i++) {
lb[i].setSpeed(speed[i]);
}
}
/** Set loopspeed.
@param i index of loppbuffer to set
@param speed Loop speeds, 1 corresponding to original recorded speed.
*/
public void setSpeed(int i,float speed) {
lb[i].setSpeed(speed);
}
/** Compute the next buffer.
*/
public void computeBuffer() {
int bufsz = getBufferSize();
for(int k=0;k<bufsz;k++) {
buf[k] = 0;
}
for(int i=0;i<nbuffers;i++) {
lb[i].computeBuffer();
float[] lbBuf = lb[i].peekAtBuffer();
//if(i==1) {
// System.out.println("buf="+i+" "+lbBuf[0]);
//}
for(int k=0;k<bufsz;k++) {
buf[k] += lbBuf[k];
}
}
}
}