samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.units; samer@0: import samer.core.*; samer@0: import samer.maths.*; samer@0: import samer.maths.random.*; samer@0: samer@0: /** samer@0: Periodic generator: generates periodic signal from samer@0: a wave table samer@0: */ samer@0: samer@0: public class Wavetable implements Generator samer@0: { samer@0: int start, end, j; samer@0: Vec vec; samer@0: double [] pp; samer@0: samer@0: public Wavetable(Vec vec) { samer@0: this(vec,0,vec.size()); samer@0: } samer@0: samer@0: public Wavetable(Vec vec, int start, int end) samer@0: { samer@0: this.vec = vec; samer@0: this.start = start; samer@0: this.end = end; samer@0: pp = vec.array(); samer@0: j = start; samer@0: } samer@0: samer@0: public int period() { return end-start; } samer@0: public void dispose() {} samer@0: public double next() samer@0: { samer@0: double r=pp[j++]; samer@0: if (j>=end) j=start; samer@0: return r; samer@0: } samer@0: samer@0: public void next(double [] x) samer@0: { samer@0: int remaining=x.length; samer@0: int iput=0; samer@0: samer@0: while (remaining>0) { samer@0: int avail = end-j; samer@0: int block = remaining > avail ? avail : remaining; samer@0: samer@0: System.arraycopy( pp, j, x,iput, block); samer@0: j+=block; iput+=block; remaining-=block; samer@0: if (j>=end) j=start; samer@0: } samer@0: } samer@0: samer@0: public String toString() { return "wavetable"; } samer@0: } samer@0: samer@0: