Minim |
|
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 WavesWaveform 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 |