⊥ Źródło: Sound, R. Luke DuBois and Wilm Thoben
/** * Processing Sound Library, Example 1 * * Five sine waves are layered to construct a cluster of frequencies. * This method is called additive synthesis. Use the mouse position * inside the display window to detune the cluster. */ import processing.sound.*; SinOsc[] sineWaves; // Array of sines float[] sineFreq; // Array of frequencies int numSines = 5; // Number of oscillators to use void setup() { size(640, 360); background(255); sineWaves = new SinOsc[numSines]; // Initialize the oscillators sineFreq = new float[numSines]; // Initialize array for Frequencies for (int i = 0; i < numSines; i++) { // Calculate the amplitude for each oscillator float sineVolume = (1.0 / numSines) / (i + 1); // Create the oscillators sineWaves[i] = new SinOsc(this); // Start Oscillators sineWaves[i].play(); // Set the amplitudes for all oscillators sineWaves[i].amp(sineVolume); } } void draw() { //Map mouseY from 0 to 1 float yoffset = map(mouseY, 0, height, 0, 1); //Map mouseY logarithmically to 150 - 1150 to create a base frequency range float frequency = pow(1000, yoffset) + 150; //Use mouseX mapped from -0.5 to 0.5 as a detune argument float detune = map(mouseX, 0, width, -0.5, 0.5); for (int i = 0; i < numSines; i++) { sineFreq[i] = frequency * (i + 1 * detune); // Set the frequencies for all oscillators sineWaves[i].freq(sineFreq[i]); } }
Ten skecz odgrywa losowo pięć różnych sampli, które wcześniej musimy załadować jako pliki o nazwach 1.aiff, 2.aiff…, 5.aiff. (Wystarczy upuścić nad oknem programu). Zamieniłem w szkicu aif na aiff, bo sample zwykle zapisywane są w ten sposób. Dodatkowo program wyświetla losowo różnobarwne prostokąty. Sample mają różne oktawy. Również losowo przydzielane jak i ilość współbrzmiących sampli. Efekt ciekawy.
/** * Processing Sound Library, Example 3 * * This example shows how to make a simple sampler and sequencer * with the Sound library. In this sketch, five different samples are * loaded and played back at different pitches, in this case five * different octaves. The sequencer triggers an event every 200-1000 * milliseconds randomly. Each time a sound is played a colored * rect with a random color is displayed. */ import processing.sound.*; SoundFile[] files; // Create an array of values which represent the octaves. // 1.0 is playback at normal speed, 0.5 is half and therefore // one octave down. 2.0 is double so one octave up. float[] octave = { 0.25, 0.5, 1.0, 2.0, 4.0 }; // The playSound array is defining how many samples will be // played at each trigger event int[] playSound = { 1, 1, 1, 1, 1 }; // The trigger is an integer number in milliseconds so we // can schedule new events in the draw loop int trigger=0; // This array holds the pixel positions of the rectangles // that are drawn each event int[] posx = { 0, 128, 256, 384, 512 }; void setup() { size(640, 360); background(255); // Create an array of 5 empty soundfiles files = new SoundFile[5]; // Load 5 soundfiles from a folder in a for loop. By naming // the files 1., 2., 3., [...], n.aif it is easy to iterate // through the folder and load all files in one line of code. for (int i = 0; i < files.length; i++) { files[i] = new SoundFile(this, (i+1) + ".aiff"); } } void draw() { // If the determined trigger moment in time matches up with // the computer clock events get triggered. if (millis() > trigger) { // Redraw the background every time to erase old rects background(0); // By iterating through the playSound array we check for // 1 or 0, 1 plays a sound and draws a rect, for 0 nothing happens for (int i = 0; i < files.length; i++) { // Check which indexes are 1 and 0. if (playSound[i] == 1) { float rate; // Choose a random color and get set to noStroke() fill(int(random(0,255)),int(random(0,255)),int(random(0,255))); noStroke(); // Draw the rect in the positions we defined earlier in posx rect(posx[i], 50, 128, 260); // Choose a random index of the octave array rate = octave[int(random(0, 5))]; // Play the soundfile from the array with the respective // rate and loop set to false files[i].play(rate, 1.0); } // Renew the indexes of playSound so that at the next event // the order is different and randomized. playSound[i] = int(random(0, 4)); } // Create a new triggertime in the future, with a random offset // between 200 and 1000 milliseconds trigger = millis() + int(random(200, 1000)); } }
/** * Processing Sound Library, Example 4 * * Five soundfiles are mapped to the numbers on the keyboard. * Numbers 1-5 are played back an octave lower and numbers * 6-0 an octave higher. */ import processing.sound.*; AudioDevice device; SoundFile[] file; int red, green, blue; void setup() { //size(1920, 1080); size(640, 320); background(255); // Create an AudioDevice with low buffer size // and create an array containing 5 empty soundfiles device = new AudioDevice(this, 44100, 32); file = new SoundFile[5]; // Load 5 soundfiles from a folder in a for loop. for (int i = 0; i < file.length; i++) { file[i] = new SoundFile(this, (i+1) + ".aiff"); } } void draw() { background(red, green, blue); } void keyPressed() { // Set a random background color each time you hit then number keys red=int(random(255)); green=int(random(255)); blue=int(random(255)); // Assign a sound to each number on your keyboard. 1-5 play at // an octave below the original pitch of the file, 6-0 play at // an octave above. switch(key) { case '1': file[0].play(0.5, 1.0); break; case '2': file[1].play(0.5, 1.0); break; case '3': file[2].play(0.5, 1.0); break; case '4': file[3].play(0.5, 1.0); break; case '5': file[4].play(0.5, 1.0); break; case '6': file[0].play(2.0, 1.0); break; case '7': file[1].play(2.0, 1.0); break; case '8': file[2].play(2.0, 1.0); break; case '9': file[3].play(2.0, 1.0); break; case '0': file[4].play(2.0, 1.0); break; } }