import jass.render.*;
import jass.engine.*;
import jass.generators.*;
import jass.contact.*;
/** As Bang using ModalObjectWithOneContact
*/
public class BangN extends Controller {
static int nsliders = 10;
static int nbuttons = 2;
public BangN(java.awt.Frame parent,boolean modal) {
super (parent, modal,nsliders,nbuttons);
}
public void onSlider(int k) {
switch(k) {
case 0:
dur = (float)super.val[0];
break;
case 1:
force = (float)super.val[1];
break;
case 2:
vs = (float)super.val[2];
af.setSlideProperties(fslide,vs);
break;
case 3:
fslide = (float)super.val[3];
af.setSlideProperties(fslide,vs);
break;
case 4:
vr = (float)super.val[4];
af.setRollProperties(froll,vr);
break;
case 5:
froll = (float)super.val[5];
af.setRollProperties(froll,vr);
break;
case 6:
lpFRoll = (float)super.val[6];
af.setRollFilter(lpFRoll, lpDryG);
break;
case 7:
lpDryG = (float)super.val[7];
af.setRollFilter(lpFRoll, lpDryG);
break;
case 8:
loc = (float)super.val[8];
if(nLocs > 1) {
double x = (.00001 +loc)/1.0001; // 0 - 1, map to location
x = x*(nLocs - 1); // 0 -- np-1
int p1 = (int)x;
int p2 = (int)(x+1);
int p3 = 0;
float b2 = (float)(x-p1);
float b1 = (float)(1 - b2);
float b3 = 0;
System.out.println("np="+nLocs+ " "+"loc(0-np-1)="+x);
mob.setLocation(p1,p2,p3,b1,b2,b3);
}
break;
case 9:
bal = (float)super.val[9];
balv[0] = bal;
balv[1] = 1-bal;
af.setSlideBalance(balv); // set balance between 2 wav files
af.setSlideProperties(fslide,vs); // activate
break;
}
}
public void onButton(int k) {
switch(k) {
case 0:
af.bang(force,dur/1000);
break;
case 1:
sp1.resetAGC();
break;
}
}
static ModalObjectWithOneContact mob;
static ContactForceN af;
static float dur=1.f; //dur in ms of impact
static float force = 0; // force of impact
static float vs=0,vr=0,fslide=0,froll=0; // slide, roll speed and normal forces
// maximum audio speeds, 1 is original wav file
static float slideSpeed1=1f,rollSpeed1=1f;
// physical speed ranges
static float vslide0=.0f,vslide1=1f,vroll0=.00f,vroll1=1f;
// gain ratios
static float physicalToAudioGainSlide=1,physicalToAudioGainRoll=1,physicalToAudioGainImpact=1;
static float lpFRoll=100.f, lpDryG=0;
static int nLocs = 1; // if using an sy with locations
static float loc=0; //location 0-1
static SourcePlayer sp1;
static float bal = 1f;
static float[] balv = {bal,1-bal};
static String[] names = {"dur ","Fbang ","vslide ","Fslide ","vroll ","Froll ", "lPFroll ","lpDryG ","loc0-1 ", "bal "};
static double[] val = {dur, force, vs, fslide, vr, froll, lpFRoll, lpDryG, loc, bal };
static double[] min = {0, 0, 0, 0, 0, 0, 10, 0, 0, 0 };
static double[] max = {50, 1000, 1, 1000, 1, 1000, 2000, 1, 1, 1 };
public static void main (String args[]) throws SinkIsFullException {
float srate = 44100.f;
int bufferSize = 512;
int bufferSizeJavaSound = 6*1024;
if(args.length != 5) {
System.out.println("Usage: java BangN ../data/clayvase-nobogus2.sy ../data/cos20ms.wav ../data/scrapeRim20cmps.wav ../data/acmevase-smooth2.wav ../data/roll.wav\n");
return;
}
try {
mob = new ModalObjectWithOneContact(new ModalModel(args[0]),srate,bufferSize);
} catch (java.io.FileNotFoundException ee) {
System.out.println("Modes file not found\n");
}
nLocs = mob.modalModel.np;
af = new ContactForceN(srate,bufferSize,args[1],
new String[]{args[2],args[3]},args[4]);
mob.addSource(af);
af.setStaticContactModelParameters(slideSpeed1, rollSpeed1, vslide0, vslide1,
vroll0, vroll1, physicalToAudioGainSlide,
physicalToAudioGainRoll,physicalToAudioGainImpact);
af.setSlideProperties(fslide,vs);
af.setRollProperties(froll,vr);
af.setRollFilter(lpFRoll, lpDryG);
sp1 = new SourcePlayer(bufferSize,bufferSizeJavaSound,srate);
sp1.setUseNativeSound(true);
sp1.addSource(mob);
sp1.start();
BangN app = new BangN(new java.awt.Frame("Wavetable contact forces"), true);
app.setSliders(val,min,max,names);
app.setButtonNames (new String[] {"Bang","Reset"});
app.setVisible(true);
}
}