You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
11 KiB
Java

package main;
import java.awt.Color;
import com.softsynth.jsyn.AddUnit;
import com.softsynth.jsyn.DivideUnit;
import com.softsynth.jsyn.EnvelopePlayer;
import com.softsynth.jsyn.EqualTemperedTuning;
import com.softsynth.jsyn.ExponentialLag;
import com.softsynth.jsyn.LineOut;
import com.softsynth.jsyn.MultiplyUnit;
import com.softsynth.jsyn.SynthEnvelope;
import com.softsynth.jsyn.Synth;
import com.softsynth.jsyn.SynthMixer;
public class Glissandi extends Thread{
WaveForm[] gliss;
AddUnit[] num;
DivideUnit[] ratio;
MultiplyUnit[] freq;
SynthEnvelope env;
MultiplyUnit denMult;
AddUnit den;
EnvelopePlayer envPlayer;
boolean isOn = false;
double fund;
GrainStream grainStream[];
LineOut lineOut;
SynthMixer glissMixer;
SynthMixer grainMixer;
ExponentialLag grainFader;
MultiplyUnit grainMult;
ExponentialLag glissFader;
MultiplyUnit glissMult;
//MultiplyUnit glissMultForCurve;
int currentTick;
public Glissandi(){
}
public void init(GrainStream[] gS, int gMin, int cT, int nG){
currentTick = cT;
Rise.MASTER_MIXER = new SynthMixer(3,1);
glissMixer = new SynthMixer(Rise.VOICES,1);
grainMixer = new SynthMixer(nG,1);
Rise.CLICK_MIXER = new SynthMixer(10,1);
lineOut = new LineOut();
Rise.MASTER_MULT = new MultiplyUnit();
Rise.MASTER_FADER = new ExponentialLag();
grainMult = new MultiplyUnit();
grainFader = new ExponentialLag();
glissMult = new MultiplyUnit();
glissFader = new ExponentialLag();
Rise.CLICK_MULT = new MultiplyUnit();
Rise.CLICK_FADER = new ExponentialLag();
//System.out.println(Rise.FIRST_NUM + " " + Rise.VOICES);
gliss = new WaveForm[Rise.VOICES];
num = new AddUnit[Rise.VOICES];
ratio = new DivideUnit[Rise.VOICES];
freq = new MultiplyUnit[Rise.VOICES];
fund = EqualTemperedTuning.getMIDIFrequency(24+Rise.TRANSPOSE_SCORE+Rise.TRANSPOSE_SOUND);
//System.out.println(Rise.TOTAL_DUR);
//Make sure this is ok
envPlayer = new EnvelopePlayer();
double[] envData = new double[302];
double playDuration = Rise.TOTAL_DUR - Rise.START_TIME;
double startEnvPosition = Rise.START_TIME/Rise.TOTAL_DUR;
double envLength = 1 - startEnvPosition;
envData[0] = 0;
envData[1] = startEnvPosition;
for (int i = 1; i < envData.length/2; i++){
envData[i * 2] = playDuration/((envData.length-2)/2);
envData[i * 2 + 1] = startEnvPosition + (envLength/ ((envData.length-2)/2)) * (i);
}
//System.out.println(envData[1] + " " + envData[envData.length-1]);
env = new SynthEnvelope(envData);
denMult = new MultiplyUnit();
denMult.inputA.connect(envPlayer.output);
denMult.inputB.set(-1 * (Rise.VOICES - 1));
den = new AddUnit();
den.inputA.set(Rise.FIRST_NUM);
den.inputB.connect(denMult.output);
int advanceTime = (int) (currentTick + 4 * Synth.getTickRate());
//int[] cuePoints = new int[Rise.VOICES * 14];
for (int i = 0; i < Rise.VOICES; i++){
//System.out.println(i);
gliss[i] = new WaveForm();
num[i] = new AddUnit();
ratio[i] = new DivideUnit();
freq[i] = new MultiplyUnit();
double spectrum = (Rise.MAX_SPECTRUM - Rise.MIN_SPECTRUM)/2. + Rise.MIN_SPECTRUM;
gliss[i].spectrum.set(spectrum);
num[i].inputA.set(i);
num[i].inputB.connect(den.output);
ratio[i].inputA.connect(num[i].output);
ratio[i].inputB.connect(den.output);
freq[i].inputA.connect(ratio[i].output);
freq[i].inputB.set(fund);
freq[i].output.connect(gliss[i].frequency);
//gliss[i].envRate.set(1); // figure out this number
int startTick = (int) (advanceTime + (((Rise.TOTAL_DUR/(Rise.VOICES-1.) * i) - Rise.START_TIME) * Synth.getTickRate()));
double startPitch = fund * Rise.FIRST_NUM/(Rise.FIRST_NUM-i);
//System.out.println("test " + startTick + " " + Synth.getTickCount());
//System.out.println("show " + ((Rise.TOTAL_DUR/(Rise.VOICES-1.) * i) - Rise.START_TIME));
//double st = (Rise.TOTAL_DUR/(Rise.VOICES-1.) * i);
double startAmp = (((1/(Rise.VOICES-1.)) * i) * (Rise.GLISS_AMP_END - Rise.GLISS_AMP_START)) + Rise.GLISS_AMP_START;
envData = new double[6];
envData[0] = 1;
envData[1] = startAmp;
envData[2] = Rise.TOTAL_DUR - ((1/(Rise.VOICES-1.)) * i) - 1;
envData[3] = Rise.GLISS_AMP_END;
envData[4] = Rise.FADE_DUR + Math.random()*5;
envData[5] = 0;
if (Rise.START_TIME > (Rise.TOTAL_DUR/(Rise.VOICES-1.) * i)){
startAmp = (Rise.START_TIME/Rise.TOTAL_DUR) * (Rise.GLISS_AMP_END - Rise.GLISS_AMP_START) + Rise.GLISS_AMP_START;
envData[0] = 1;
envData[1] = startAmp;
envData[2] = Rise.TOTAL_DUR - Rise.START_TIME - 1;
envData[3] = Rise.GLISS_AMP_END;
envData[4] = Rise.FADE_DUR + Math.random()*5;
envData[5] = 0;
}
if (i == Rise.VOICES-1){
envData = new double[4];
envData[0] = 1;
envData[1] = Rise.GLISS_AMP_END;
envData[2] = Rise.FADE_DUR + Math.random()*5;
envData[3] = 0;
}
// for (int j = 0; j < envData.length; j++) {
// System.out.println(i + " " + envData[j]);
// }
gliss[i].glissOn(startTick, startPitch, 1 /*(1./Rise.VOICES)*/, envData );
// envData = new double[4];
//
// envData[0] = 0;
// envData[1] = startAmp;
// envData[2] = Rise.TOTAL_DUR - ((1/(Rise.VOICES-1.)) * i) - 1;
// envData[3] = 1;
//
// gliss[i].glissSustain((int) (startTick + Synth.getTickRate()), envData);
// for (int j = 0; j < 14; j++){
// cuePoints[14 * i + j] = (int) (startTick - 3 * Synth.getTickRate() + Synth.getTickRate()/2. * j);
// }
//System.out.println("test " + startTick + " " + endTick + " " + Synth.getTickCount() + " " + ((1./ (Rise.VOICES-1)) * i));
//make this have jitter??
//gliss[i].glissOff(endTick, (.5 / (Rise.FADE_DUR + Math.random()*5)));
num[i].start(startTick);
ratio[i].start(startTick);
freq[i].start(startTick);
glissMixer.connectInput(i, gliss[i].output, 0);
glissMixer.setGain(i, 0, (1./Rise.VOICES));
}
//c.init(cuePoints);
denMult.start(advanceTime);
den.start(advanceTime);
//System.out.println(envPlayer.getSynthContext().getTickCount());
envPlayer.start(advanceTime);
envPlayer.envelopePort.clear(advanceTime);
envPlayer.envelopePort.queue(advanceTime,env,0,env.getNumFrames());
grainStream = gS;
for (int i = 0; i < nG; i++){
grainMixer.connectInput(i, grainStream[i].grain.output, 0);
grainMixer.setGain(i, 0, 1);
int grainStartTick = (int) (advanceTime + Rise.START_TIME * Synth.getTickRate());
if (i > gMin){
grainStartTick = (int) (advanceTime + (((Rise.TOTAL_DUR/(nG - gMin) * (i - gMin)) - Rise.START_TIME) * Synth.getTickRate()));
}
//System.out.println("tick " + grainStartTick);
grainStream[i].setStartTick(grainStartTick + (int) (Synth.getTickRate() * Math.random() * 5));
int endTick = (int) (advanceTime + ((Rise.TOTAL_DUR - Rise.START_TIME) * Synth.getTickRate()));
grainStream[i].setEndTick(endTick);
}
grainMult.inputA.connect(grainFader.output);
grainMult.inputB.connect(grainMixer.getOutput(0));
glissMult.inputA.connect(glissFader.output);
glissMult.inputB.connect(glissMixer.getOutput(0));
for (int count = 0; count < 10; count++){
Rise.CLICK_MIXER.setGain(count, 0, 1);
}
Rise.CLICK_MULT.inputA.connect(Rise.CLICK_FADER.output);
Rise.CLICK_MULT.inputB.connect(Rise.CLICK_MIXER.getOutput(0));
Rise.MASTER_MIXER.connectInput(0, glissMult.output, 0);
Rise.MASTER_MIXER.setGain(0, 0, 1);
Rise.MASTER_MIXER.connectInput(1, grainMult.output, 0);
Rise.MASTER_MIXER.setGain(1, 0, 1);
Rise.MASTER_MIXER.connectInput(2, Rise.CLICK_MULT.output, 0);
Rise.MASTER_MIXER.setGain(2, 0, 1);
Rise.MASTER_MULT.inputA.connect(Rise.MASTER_FADER.output);
Rise.MASTER_MULT.inputB.connect(Rise.MASTER_MIXER.getOutput(0));
lineOut.input.connect(0, Rise.MASTER_MULT.output, 0);
lineOut.input.connect(1, Rise.MASTER_MULT.output, 0);
lineOut.start(advanceTime);
glissMixer.start(advanceTime);
grainMixer.start(advanceTime);
Rise.MASTER_MIXER.start(advanceTime);
Rise.MASTER_MULT.start(advanceTime);
Rise.MASTER_FADER.start(advanceTime);
Rise.CLICK_MIXER.start(advanceTime);
Rise.CLICK_MULT.start(advanceTime);
Rise.CLICK_FADER.start(advanceTime);
grainMult.start(advanceTime);
grainFader.start(advanceTime);
glissMult.start(advanceTime);
glissFader.start(advanceTime);
for (int i = 0; i < nG; i++){
grainStream[i].setTimer(envPlayer);
}
isOn = true;
}
public void setGlissFader(double a){
if (Rise.IS_ENGINE_ON == true) {
glissFader.input.set(a);
}
}
public void setGrainFader(double a){
if (Rise.IS_ENGINE_ON == true) {
grainFader.input.set(a);
}
}
public synchronized void run() {
try {
//System.out.println("waiting");
this.wait(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
Synth.sleepUntilTick( (int) (currentTick + 1 * Synth.getTickRate()) );
Rise.CUE_PANEL.color = Color.YELLOW;
Rise.CUE_PANEL.repaint();
Synth.sleepUntilTick( (int) (currentTick + 2 * Synth.getTickRate()) );
Rise.CUE_PANEL.color = Color.GREEN;
Rise.CUE_PANEL.repaint();
Synth.sleepUntilTick( (int) (currentTick + 3 * Synth.getTickRate()) );
Rise.CUE_PANEL.color = Color.BLACK;
Rise.CUE_PANEL.repaint();
int startTime = (int) (currentTick + 3 * Synth.getTickRate()); ///*Synth.getTickCount()*/ currentTick + (int) Synth.getTickRate();
int duration = (int) (Synth.getTickRate() / 5); // Resolution should be pixles in view
int advanceTime = (int) (Synth.getTickRate() * 0.05); // half second advance
Synth.sleepUntilTick( startTime - advanceTime ); // Wake up early!
int nextTime = startTime;
while(true)
{
if (Rise.IS_ENGINE_ON == true) {
//System.out.println(envPlayer.output.get());
Rise.CUE_PANEL.envPos = envPlayer.output.get();
Rise.CUE_PANEL.repaint();
Rise.SCROLLBAR.xPos = envPlayer.output.get() * Rise.SCROLLBAR_WIDTH;
if (envPlayer.output.get() == 0){
Rise.SCROLLBAR.xPos = (Rise.START_TIME/Rise.TOTAL_DUR) * Rise.SCROLLBAR_WIDTH;
}
Rise.SCROLLBAR.repaint();
nextTime += duration; // Advance nextTime by fixed amount.
Synth.sleepUntilTick( nextTime - advanceTime ); // Wake up early!
}
else {
try {
//System.out.println("waiting");
this.wait(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void kill() {
isOn = false;
for (int i = 0; i < Rise.VOICES; i++){
gliss[i].glissOff(0, 1);
num[i].stop();
ratio[i].stop();
freq[i].stop();
}
denMult.stop();
den.stop();
envPlayer.stop();
glissMixer.stop(0);
grainMixer.stop(0);
Rise.MASTER_FADER.stop(0);
Rise.MASTER_MULT.stop(0);
Rise.MASTER_MIXER.stop(0);
Rise.CLICK_FADER.stop(0);
Rise.CLICK_MULT.stop(0);
Rise.CLICK_MIXER.stop(0);
grainMult.stop(0);
grainFader.stop(0);
glissMult.stop(0);
glissFader.stop(0);
lineOut.stop(0);
}
}