package ddf.minim.ugens; import java.util.Arrays; import ddf.minim.Minim; import ddf.minim.UGen; /** * A UGen that starts at a value and changes linearly to another value over a specified time. * * @example Synthesis/lineExample * * @author nodog * */ public class Line extends UGen { // jam3: define the inputs to Oscil // the initial amplitude private float begAmp; // the ending amplitude private float endAmp; // the current amplitude private float amp; // the time from begAmp to endAmp private float lineTime; // the current size of the step private float timeStepSize; // the current time private float lineNow; // the damp has been activated private boolean isActivated; /** * Constructs a Line that starts at 1 and transitions to 0 over 1 second. */ public Line() { this(1.0f, 1.0f, 0.0f); } /** * Constructs a Line that starts at 1 and transitions to 0 over dT seconds. * * @param dT * float: how long it should take, in seconds, to transition from the beginning value to the end value. */ public Line(float dT) { this(dT, 1.0f, 0.0f); } /** * Constructs a Line that starts at beginningAmplitude and transitions to 0 over dT seconds. * * @param dT * float: how long it should take, in seconds, to transition from the beginning value to the end value. * @param beginningAmplitude * float: the value to begin at */ public Line(float dT, float beginningAmplitude) { this(dT, beginningAmplitude, 0.0f); } /** * Constructs a Line that starts at beginningAmplitude and transitions to endAmplitude over dT seconds. * * @param dT * float: how long it should take, in seconds, to transition from the beginning value to the end value. * @param beginningAmplitude * float: the value to begin at * @param endAmplitude * float: the value to end at */ public Line(float dT, float beginningAmplitude, float endAmplitude) { super(); lineTime = dT; begAmp = beginningAmplitude; amp = begAmp; endAmp = endAmplitude; lineNow = 0f; isActivated = false; Minim.debug(" dampTime = " + lineTime + " begAmp = " + begAmp + " now = " + lineNow); } /** * Start the Line's transition. * */ public void activate() { lineNow = 0f; amp = begAmp; isActivated = true; } /** * Start the Line's transition after setting all parameters for the Line. * * @param duration * float: how long it should take, in seconds, to transition from the beginning value to the end value. * @param beginAmp * float: the value to begin at * @param endingAmp * float: the value to end at */ public void activate( float duration, float beginAmp, float endingAmp ) { begAmp = beginAmp; endAmp = endingAmp; lineTime = duration; activate(); } /** * Has the Line completed its transition. * * @return * true if the Line has completed */ public boolean isAtEnd() { return (lineNow >= lineTime); } /** * Set the ending value of the Line's transition. * This can be set while a Line is transitioning without causing * serious discontinuities in the Line's output. * * @shortdesc Set the ending value of the Line's transition. * * @param newEndAmp * float: the new value to end at */ public void setEndAmp( float newEndAmp ) { endAmp = newEndAmp; } /** * Set the length of this Line's transition. * * @param newLineTime * float: the new transition time (in seconds) */ public void setLineTime( float newLineTime ) { lineTime = newLineTime; } /** * Change the timeStepSize when sampleRate changes. */ @Override protected void sampleRateChanged() { timeStepSize = 1/sampleRate(); } @Override protected void uGenerate(float[] channels) { //Minim.debug(" dampTime = " + dampTime + " begAmp = " + begAmp + " now = " + now); if (!isActivated) { Arrays.fill( channels, begAmp ); } else if (lineNow >= lineTime) { Arrays.fill( channels, endAmp ); } else { amp += ( endAmp - amp )*timeStepSize/( lineTime - lineNow ); //Minim.debug(" dampTime = " + dampTime + " begAmp = " + begAmp + " amp = " + amp + " dampNow = " + dampNow); Arrays.fill( channels, amp ); lineNow += timeStepSize; } } }