Set volume of this example with Minim

Hello,
I would like to set the volume of this example. For example I would like to set the volume with mouse Y rather than resonance.

I think it is easy but I block. :face_with_raised_eyebrow:

// import everything necessary to make sound.
import ddf.minim.*;
import ddf.minim.ugens.*;

// create all of the variables that will need to be accessed in
// more than one methods (setup(), draw(), stop()).
Minim       minim;
AudioOutput out;
MoogFilter  moog;

// setup is run once at the beginning
void setup()
{
// initialize the drawing window
  size(300, 300);
  
  // initialize the minim and out objects
  minim   = new Minim(this);
  out     = minim.getLineOut();
  // construct a law pass MoogFilter with a 
  // cutoff frequency of 1200 Hz and a resonance of 0.5
  moog    = new MoogFilter( 1200, 0.5 );
  
  // we will filter a white noise source,
  // which will allow us to hear the result of filtering
  Noise noize = new Noise( 0.5f, Noise.Tint.RED );  

  // send the noise through the filter
  noize.patch( moog ).patch( out );
}

// we'll control the frequency and resonance of the filter
// using the position of the mouse, in typical x-y controller fashion
void mouseMoved()
{
  float freq = constrain( map( mouseX, 0, width, 200, 12000 ), 200, 12000 );
  float rez  = constrain( map( mouseY, height, 0, 0, 1 ), 0, 1 );
  
  moog.frequency.setLastValue( freq );// difference avec -freq
  moog.resonance.setLastValue( rez  );
}

void keyPressed()
{
  if ( key == '1' ) moog.type = MoogFilter.Type.LP;
  if ( key == '2' ) moog.type = MoogFilter.Type.HP;
  if ( key == '3' ) moog.type = MoogFilter.Type.BP;
}

// draw is run many times
void draw()
{
  // erase the window to black
  background( 0 );
  // draw using a white stroke
  stroke( 255 );
  // draw the waveforms
  for( int i = 0; i < out.bufferSize() - 1; i++ )
  {
    // find the x position of each buffer value
    float x1  =  map( i, 0, out.bufferSize(), 0, width );
    float x2  =  map( i+1, 0, out.bufferSize(), 0, width );
    // draw a line from one buffer position to the next for both channels
    line( x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
    line( x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
  } 
  
  text( "Filter type: " + moog.type, 10, 225 );
  text( "Filter cutoff: " + moog.frequency.getLastValue() + " Hz", 10, 245 );
  text( "Filter resonance: " + moog.resonance.getLastValue(), 10, 265 ); 
}



Hi,

To set the volume, you can look at the setVolume() method for the AudioOutput class.

However I’ve tested myself on Processing 3.5.4 and it seems that this method is not supported :

So you can use the setGain() method in the mouseMoved() function that accepts decibels :

out.setGain(((float)mouseY / height) * 10);

However when printing the gain to the console, it stays limited at 6.0206 dB… Maybe someone have the solution :slight_smile:

(mouseY / height return a number between 0 and 1 and since you want to have a float division, you cast the first number before)