/**
* Created : Jun 28, 2012
*
* @author pquiring
*/
import javaforce.*;
public class FxFade {
public static void fadeIn(TrackPanel track) {
long sStart, sStop, length;
if (track.selectStop < track.selectStart) {
sStart = track.selectStop;
sStop = track.selectStart;
} else {
sStart = track.selectStart;
sStop = track.selectStop;
}
length = (sStop - sStart + 1);
//calc factor, slope
double factor = 0.0;
double slope = 1.0 / length;
fade(track, sStart, sStop, length, factor, slope, 0.0);
}
public static void fadeOut(TrackPanel track) {
long sStart, sStop, length;
if (track.selectStop < track.selectStart) {
sStart = track.selectStop;
sStop = track.selectStart;
} else {
sStart = track.selectStart;
sStop = track.selectStop;
}
length = (sStop - sStart + 1);
//calc factor, slope
double factor = 1.0;
double slope = -1.0 / length;
fade(track, sStart, sStop, length, factor, slope, 0.0);
}
private static void fade(TrackPanel track, long start, long end, long length, double factor, double slope, double adjust) {
long offset = start;
track.createModifyUndo();
while (length > 0) {
int read = TrackPanel.maxChunkSize;
if (read > length) read = (int)length;
for(int ch=0;ch<track.channels;ch++) {
double xfactor = factor;
byte samples[] = track.getSamples(offset, read, ch);
switch (track.bits) {
case 16:
short samples16[] = LE.byteArray2shortArray(samples, null);
for(int a=0;a<samples16.length;a++) {
samples16[a] *= (xfactor + adjust);
xfactor += slope;
}
samples = LE.shortArray2byteArray(samples16, null);
break;
case 32:
int samples32[] = LE.byteArray2intArray(samples, null);
for(int a=0;a<samples32.length;a++) {
samples32[a] *= (xfactor + adjust);
xfactor += slope;
}
samples = LE.intArray2byteArray(samples32, null);
break;
}
track.setSamples(offset, samples, ch);
}
factor += slope * read;
length -= read;
offset += read;
}
}
}