Hi , so i’m trying to build a synth using minim, i took aside, the “CreateAnInstrument” exemple to build a keyboard, the problem is i would like to make so that when the key to play the note is released, the note stops playing, and that it plays forever as long as the key is pressed (on the code here it plays for 2.9sec).
I also would like to be able to change the Waveform from sine to something else (i tried with .setWaveform(Waves.SAW )
I tried everything, i’m still a beginner though, help/advice would be welcomed !
What i have so far :
import ddf.minim.*;
import ddf.minim.ugens.*;
boolean release;
Minim minim;
AudioOutput out;
// to make an Instrument we must define a class
// that implements the Instrument interface.
class SineInstrument implements Instrument {
Oscil wave;
Line ampEnv;
SineInstrument( float frequency ) {
// make a sine wave oscillator
// the amplitude is zero because
// we are going to patch a Line to it anyway
wave = new Oscil( frequency, 0, Waves.SINE );
ampEnv = new Line();
ampEnv.patch( wave.amplitude );
}
// this is called by the sequencer when this instrument
// should start making sound. the duration is expressed in seconds.
void noteOn( float duration ) {
// start the amplitude envelope
ampEnv.activate( duration, 0.2f, 0 );
// attach the oscil to the output so it makes sound
wave.patch( out );
}
// this is called by the sequencer when the instrument should
// stop making sound
void noteOff() {
wave.unpatch( out );
}
}
void setup()
{
size(512, 200, P3D);
minim = new Minim(this);
// use the getLineOut method of the Minim object to get an AudioOutput object
out = minim.getLineOut();
// when providing an Instrument, we always specify start time and duration
out.playNote( 0.0, 0.0, new SineInstrument( 97.99 ) );
// we can use the Frequency class to create frequencies from pitch names
}
void draw()
{
background(0);
stroke(255);
// draw the waveforms
for(int i = 0; i < out.bufferSize() - 1; i++)
{
line( i, 50 + out.left.get(i)*50, i+1, 50 + out.left.get(i+1)*50 );
line( i, 150 + out.right.get(i)*50, i+1, 150 + out.right.get(i+1)*50 );
}
}
void keyPressed(){
switch ( key ){
case 'q': // La
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "A3" ).asHz() ) );
break;
case 'z': // La#
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "A#3" ).asHz() ) );
break;
case 's': // Si
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "B3" ).asHz() ) );
break;
case 'd': // Do
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "C4" ).asHz() ) );
break;
case 'r': // Do#
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "C#4" ).asHz() ) );
break;
case 'f': // Ré
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "D4" ).asHz() ) );
break;
case 't': // Ré#
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "D#4" ).asHz() ) );
break;
case 'g': // Mi
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "E4" ).asHz() ) );
break;
case 'h': // Fa
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "F4" ).asHz() ) );
break;
case 'u': // Fa#
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "F#4" ).asHz() ) );
break;
case 'j': // Sol
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "G4" ).asHz() ) );
break;
case 'i': // Sol#
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "G#4" ).asHz() ) );
break;
case 'k': // La +1
out.playNote( 0.0, 2.9, new SineInstrument( Frequency.ofPitch( "A4" ).asHz() ) );
break;
}
} // void keyPressed
void keyReleased(){
if (key == 'q' ||key == 'z' ||key == 's' ||key == 'd' ||key == 'r' ||key == 'f' ||key == 't' ||key == 'g' ||key == 'h' ||key == 'u' ||key == 'j' ||key == 'i' ||key == 'k'){
release = true;
}
} // keyReleased