Minim |
|
Waves Fields
PHASOR Methods
add ( ) |
Waves provides some already constructed Wavetables for common waveforms, as
well as methods for constructing some basic waveforms with non-standard
parameters. For instance, you can use the QUARTERPULSE member if you want a
typical "thin" square wave sound, but you might want a square wave with a 60%
duty cycle instead, which you can create by passing 0.6f to the square
method. Methods exist for generating basic waves with multiple harmonics,
basic waves with different duty cycles, and noise.
Constructors Related WavetableWavetableGenerator Oscil 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 |