We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I have some question regarding the Minim library,
I tried the setVolume or setGain instances both didn't change anything. I am trying to start with no sound till tuioCursorList.size is bigger than 0 and when it is, sound can fade in with a simple for loop but all my attempts on changing the volume failed so couldn't implement it to the code.
I got part of the code from Minim > Synthesis > realtimeControlExample and some stuff are out of my reach. In the code below. The out.PlayNote takes 3 parameter I got the idea of them first is the start point, second is the duration and thirds is the note which will be played. How can I set so that the note plays not just for defined time but as long as program is running?
And the I tried calling out.playNote in draw and didn't work, works only when its called setup which makes it harder for me to change the parameters.
// import everything necessary to make sound.
import ddf.minim.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*;
import TUIO.*;
TuioProcessing tuioClient = new TuioProcessing(this);
ArrayList<TuioCursor> tuioCursorList = new ArrayList<TuioCursor>();
Minim minim;
AudioOutput out;
NoiseInstrument myNoise;
float x = 0;
float y = 0;
float xPos;
float yPos;
void setup()
{
size( 500, 500, P2D );
minim = new Minim( this );
out = minim.getLineOut( Minim.MONO, 512 );
myNoise = new NoiseInstrument( 1.0, out );
out.playNote( 0, 100.0, myNoise );
}
void draw()
{
background( 0 );
tuioCursorList = tuioClient.getTuioCursorList();
for (int i=0; i<tuioCursorList.size(); i++) {
TuioCursor tc = tuioCursorList.get(i);
xPos = tc.getScreenX(width);
yPos = tc.getScreenY(height);
if ( tuioCursorList.size() > 0) {
float freq = map( yPos, 0, height, 200, 120 );
float q = map( xPos, 0, width, 15, 25 );
myNoise.setFilterCF( freq );
myNoise.setFilterQ( q );
println(tuioCursorList.size());
}
}
}
// Every instrument must implement the Instrument interface so
// playNote() can call the instrument's methods.
// This noise instrument uses white noise and two bandpass filters
// to make a "whistling wind" sound. By changing using the methods which
// change the frequency and the bandwidth of the filters, the sound changes.
class NoiseInstrument implements Instrument
{
// create all variables that must be used throughout the class
Noise myNoise;
Multiplier multiply;
AudioOutput out;
BandPass filt1, filt2;
Summer sum;
float freq1, freq2, freq3;
float bandWidth1, bandWidth2;
float filterFactor;
// constructors for this intsrument
NoiseInstrument( float amplitude, AudioOutput output )
{
// equate class variables to constructor variables as necessary
out = output;
// give some initial values to the realtime control variables
freq1 = 150.0;
bandWidth1 = 10.0;
filterFactor = 1.7;
// create new instances of any UGen objects
myNoise = new Noise( amplitude, Noise.Tint.WHITE );
multiply = new Multiplier( 0 );
filt1 = new BandPass( freq1, bandWidth1, out.sampleRate() );
filt2 = new BandPass( freq2(), bandWidth2(), out.sampleRate() );
sum = new Summer();
// patch everything (including the out this time)
myNoise.patch( filt1 ).patch( sum );
myNoise.patch( filt2 ).patch( sum );
sum.patch( multiply );
}
// every instrument must have a noteOn( float ) method
void noteOn( float dur )
{
// set the multiply to 1 to turn on the note
multiply.setValue( 1 );
multiply.patch( out );
}
// every instrument must have a noteOff() method
void noteOff()
{
// set the multiply to 0 to turn off the note
multiply.setValue( 0 );
multiply.unpatch( out );
}
// this is a helper method only used internally to find the second filter
float freq2()
{
// calculate the second frequency based on the first
return filterFactor*freq1;
}
// this is a helper method only used internally
// to find the bandwidth of the second filter
float bandWidth2()
{
// calculate the second bandwidth based on the first
return filterFactor*bandWidth1;
}
// this is a method to set the center frequencies
// of the two filters based on the CF of the first
void setFilterCF( float cf )
{
freq1 = cf;
filt1.setFreq( freq1 );
filt2.setFreq( freq2() );
}
// this is a method to set the bandwidths
// of the two filters based on the BW of the first
void setFilterBW( float bw )
{
bandWidth1 = bw;
filt1.setBandWidth( bandWidth1 );
filt2.setBandWidth( bandWidth2() );
}
// this is a method to set the Q (inverse of bandwidth)
// of the two filters based on the
void setFilterQ( float q )
{
setFilterBW( freq1/q );
}
}
// called when a cursor is added to the scene
void addTuioCursor(TuioCursor tcur) {
}
// called when a cursor is moved
void updateTuioCursor (TuioCursor tcur) {
}
// called when a cursor is removed from the scene
void removeTuioCursor(TuioCursor tcur) {
}
// --------------------------------------------------------------
// these callback methods are called whenever a TUIO event occurs
// there are three callbacks for add/set/del events for each object/cursor/blob type
// the final refresh callback marks the end of each TUIO frame
// called when an object is added to the scene
void addTuioObject(TuioObject tobj) {
}
// called when an object is moved
void updateTuioObject (TuioObject tobj) {
}
// called when an object is removed from the scene
void removeTuioObject(TuioObject tobj) {
}
// --------------------------------------------------------------
// called when a blob is added to the scene
void addTuioBlob(TuioBlob tblb) {
}
// called when a blob is moved
void updateTuioBlob (TuioBlob tblb) {
}
// called when a blob is removed from the scene
void removeTuioBlob(TuioBlob tblb) {
}
// --------------------------------------------------------------
// called at the end of each TUIO frame
void refresh(TuioTime frameTime) {
}
Answers
Whoa, slow down! Baby steps! One thing at a time!
Forget the Tuio code for now. Just focus on the sound stuff. Can you make it make the sound you want based on a mouse click?
It's WAY easier for us to help you if we've only got the one library to install. And like, I don't even HAVE a multi-touch device.
Sorry for the mess :)
http://prdownloads.sourceforge.net/reactivision/TUIO_Simulator-1.4.zip?download
here is the link for tuio simulator ( java )
you can get rid of the tuio part and just use mouseX and Y values true. But tuio doesn't play much role in my problem actually. I can't update the volume or gain in draw function thats my main problem
Right, okay. So here's the example that demonstrates changing the gain.
When you run this, do you get changing gain based on the mouse Position?