Minim core | ugens | analysis |
Waves add | Description Generates a Wavetable by adding any number of Waveforms, each scaled by an amplitude. Calling this method might look like: `Wavetable wave = Wavetable.add( new float[] { 0.8f, 0.2f }, Waves.SINE, Waves.SAW );` or: `Wavetable wave = Wavetable.add( new float[] { 0.2f, 0.3f, 0.5f }, Waves.SINE, Waves.SQUARE, Waves.sawh( 6 ) );` In other words, the number of elements in the amplitude array must match the number of Waveform arguments provided. Signature
    Wavetable add(float[] amps, ddf.minim.ugens.Waveform[] waves)
Parameters amps — float[]: an array of amplitudes used to scale the matching Waveform argument when adding it into the final Wavetable. waves — Waveform vararg: The Waveforms to be added together. The number of Waveforms passed in as arguments much match the length of the amps array. Returns a Wavetable Related Waves Waveform Wavetable Example
    /* waveformExample<br/>
       is an example of how to construct different waveforms
       for different tones from an oscillator.
       <p>
       For more information about Minim and additional features, visit http://code.compartmental.net/minim/
       <p>
       author: Anderson Mills<br/>
       Anderson Mills's work is supported by numediart (www.numediart.org).
    */

    // 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 method (setup(), draw()).
    Minim minim;
    AudioOutput out;

    // Every instrument must implement the Instrument interface so
    // playNote() can call the instrument's methods.
    class ToneInstrument implements Instrument
    {
      // create all variables that must be used throughout the class
      Oscil toneOsc;
      ADSR adsr;
      AudioOutput out;

      // constructors for this intsrument
      ToneInstrument( String note, float amplitude, Waveform wave, AudioOutput output )
      {
        // equate class variables to constructor variables as necessary
        out = output;

        // make any calculations necessary for the new UGen objects
        // this turns a note name into a frequency
        float frequency = Frequency.ofPitch( note ).asHz();

        // create new instances of any UGen objects as necessary
        toneOsc = new Oscil( frequency, amplitude, wave );
        adsr = new ADSR( 1.0, 0.04, 0.01, 1.0, 0.1 );

        // patch everything together up to the final output
        toneOsc.patch( adsr );
      }

      // every instrument must have a noteOn( float ) method
      void noteOn( float dur )
      {
        // turn on the adsr
        adsr.noteOn();
        // patch the adsr into the output
        adsr.patch( out );
      }

      void noteOff()
      {
        // turn off the note in the adsr
        adsr.noteOff();
        // but don't unpatch until the release is through
        adsr.unpatchAfterRelease( out );
      }
    }

    // setup is run once at the beginning
    void setup()
    {
      // initialize the drawing window
      size( 512, 200, P2D );

      // initialize the minim and out objects
      minim = new Minim( this );
      out = minim.getLineOut( Minim.MONO, 1024 );

      // set a volume variable
      float vol = 0.45;

      // From here through the end of setup() is an example of traditional
      // composition, where every note is known completely beforehand.

      // set the tempo for here
      out.setTempo( 100.0f );
      // set a percentage for the actual duration
      out.setDurationFactor( 0.95f );
      // use pauseNotes to add a bunch of notes at once without time moving forward
      out.pauseNotes();

      // specify the waveform for this group of notes
      Waveform disWave = Waves.sawh( 4 );
      // add these notes with disWave
      out.playNote( 0.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote( 1.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote( 2.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote( 3.0, 0.75, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote( 3.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote( 4.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote( 5.0, 0.75, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote( 5.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote( 6.0, 2.0, new ToneInstrument( "E4 ", vol, disWave, out ) );

      // specify the waveform for this group of notes
      disWave = Waves.triangleh( 9 );
      // add these notes with disWave
      out.playNote( 8.0, 1.0, new ToneInstrument( "B4 ", vol, disWave, out ) );
      out.playNote( 9.0, 1.0, new ToneInstrument( "B4 ", vol, disWave, out ) );
      out.playNote(10.0, 1.0, new ToneInstrument( "B4 ", vol, disWave, out ) );
      out.playNote(11.0, 0.75, new ToneInstrument( "C5 ", vol, disWave, out ) );
      out.playNote(11.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote(12.0, 1.0, new ToneInstrument( "Eb4 ", vol, disWave, out ) );
      out.playNote(13.0, 0.75, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote(13.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote(14.0, 2.0, new ToneInstrument( "E4 ", vol, disWave, out ) );

      // specify the waveform for this group of notes
      disWave = Waves.randomNOddHarms( 3 );
      // add these notes with disWave
      out.playNote( 0.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote( 2.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote( 4.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote( 6.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );

      // specify the waveform for this group of notes
      disWave = Waves.TRIANGLE;
      // add these notes with disWave
      out.playNote( 8.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote(10.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote(12.0, 1.9, new ToneInstrument( "C3 ", vol, disWave, out ) );
      out.playNote(14.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );

      //-----  this is effectively a section marker
      // all notes from here until the next setNoteOffset will have this offset added to them
      out.setNoteOffset( 16.0 );
      // specify the waveform for this group of notes
      disWave = Waves.triangle( 0.75 );
      // add these notes with disWave
      out.playNote( 0.0, 1.0, new ToneInstrument( "E5 ", vol, disWave, out ) );
      out.playNote( 1.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote( 2.0, 1.0, new ToneInstrument( "E5 ", vol, disWave, out ) );
      out.playNote( 3.0, 0.5, new ToneInstrument( "D#5", vol, disWave, out ) );
      out.playNote( 3.5, 0.5, new ToneInstrument( "D5 ", vol, disWave, out ) );
      out.playNote( 4.0, 0.25, new ToneInstrument( "Db5 ", vol, disWave, out ) );
      out.playNote( 4.25, 0.25, new ToneInstrument( "C5 ", vol, disWave, out ) );
      out.playNote( 4.5, 0.50, new ToneInstrument( "Db5 ", vol, disWave, out ) );
      out.playNote( 5.5, 0.5, new ToneInstrument( "F4 ", vol, disWave, out ) );
      out.playNote( 6.0, 1.0, new ToneInstrument( "Bb4 ", vol, disWave, out ) );
      out.playNote( 7.0, 0.5, new ToneInstrument( "A4 ", vol, disWave, out ) );
      out.playNote( 7.5, 0.5, new ToneInstrument( "Ab4 ", vol, disWave, out ) );

      // specify the waveform for this group of notes
      disWave = Waves.add( new float[] { 0.5, 0.5 }, Waves.triangle( 0.05 ), Waves.randomNOddHarms( 3 ) );
      // add these notes with disWave
      out.playNote( 8.0, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote( 8.25, 0.25, new ToneInstrument( "F#4 ", vol, disWave, out ) );
      out.playNote( 8.5, 0.50, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote( 9.5, 0.5, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote(10.0, 1.0, new ToneInstrument( "Eb4 ", vol, disWave, out ) );
      out.playNote(11.0, 0.75, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote(11.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote(12.0, 1.0, new ToneInstrument( "E4 ", vol, disWave, out ) );
      out.playNote(13.0, 0.75, new ToneInstrument( "C4 ", vol, disWave, out ) );
      out.playNote(13.75, 0.25, new ToneInstrument( "G4 ", vol, disWave, out ) );
      out.playNote(14.0, 2.0, new ToneInstrument( "E4 ", vol, disWave, out ) );

      // specify the waveform for this group of notes
      disWave = Waves.randomNHarms( 9 );
      // add these notes with disWave
      out.playNote( 4.0, 1.9, new ToneInstrument( "Bb3 ", vol/2, disWave, out ) );
      out.playNote( 4.0, 1.9, new ToneInstrument( "F3 ", vol/2, disWave, out ) );
      out.playNote( 8.0, 1.9, new ToneInstrument( "C3 ", vol/2, disWave, out ) );
      out.playNote( 8.0, 1.9, new ToneInstrument( "Eb3 ", vol/2, disWave, out ) );
      out.playNote(10.0, 1.9, new ToneInstrument( "C3 ", vol, disWave, out ) );
      out.playNote(12.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );
      out.playNote(14.0, 1.9, new ToneInstrument( "E3 ", vol, disWave, out ) );

      // use resumeNotes at the end of the section which needs guaranteed timing
      out.resumeNotes();
    }

    // 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);
      }
    }
Usage Web & Application