You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.6 KiB
55 lines
1.6 KiB
/**
|
|
* This example shows how to create a cluster of sine oscillators, change the frequency
|
|
* and detune them relative to each other depending on the position of the mouse in the
|
|
* renderer window. The Y position determines the basic frequency of the oscillators,
|
|
* the X position their detuning. The basic frequncy ranges between 150 and 1150 Hz.
|
|
*/
|
|
|
|
import processing.sound.*;
|
|
|
|
SinOsc[] sineWaves;
|
|
|
|
// The number of oscillators
|
|
int numSines = 5;
|
|
|
|
// A float for calculating the amplitudes
|
|
float[] sineVolume;
|
|
|
|
void setup() {
|
|
size(500, 500);
|
|
background(255);
|
|
|
|
// Create the oscillators and amplitudes
|
|
sineWaves = new SinOsc[numSines];
|
|
sineVolume = new float[numSines];
|
|
|
|
for (int i = 0; i < numSines; i++) {
|
|
|
|
// The overall amplitude shouldn't exceed 1.0 which is prevented by 1.0/numSines.
|
|
// The ascending waves will get lower in volume the higher the frequency.
|
|
sineVolume[i] = (1.0 / numSines) / (i + 1);
|
|
|
|
// Create the Sine Oscillators and start them
|
|
sineWaves[i] = new SinOsc(this);
|
|
sineWaves[i].play();
|
|
}
|
|
}
|
|
|
|
void draw() {
|
|
noStroke();
|
|
|
|
// Map mouseY to get values from 0.0 to 1.0
|
|
float yoffset = (height - mouseY) / float(height);
|
|
|
|
// Map that value logarithmically to 150 - 1150 Hz
|
|
float frequency = pow(1000, yoffset) + 150;
|
|
|
|
// Map mouseX from -0.5 to 0.5 to get a multiplier for detuning the oscillators
|
|
float detune = float(mouseX) / width - 0.5;
|
|
|
|
// Set the frequencies, detuning and volume
|
|
for (int i = 0; i < numSines; i++) {
|
|
sineWaves[i].freq(frequency * (i + 1 + i * detune));
|
|
sineWaves[i].amp(sineVolume[i]);
|
|
}
|
|
}
|