function setup() {
  createCanvas(800,400);
  noFill();

  carrier = new p5.Oscillator('sine');
  carrier.amp(1); // set amplitude
  carrier.freq(220); // set frequency
  carrier.start(); // start oscillating

  modulator = new p5.Oscillator('sawtooth');
  modulator.disconnect();
  modulator.amp(1); // will map to mouseX
  modulator.freq(4); // will map to mouseY
  modulator.start();

  // multiply amplitude range by 200, then add 100
  carrier.freq(modulator.mult(200).add(100));

  // create an fft to analyze the audio
  fft = new p5.FFT();
}
Frequency Modulation involves two oscillators, referred
 to as the carrier and the modulator, where the modulator controls
 the carrier's frequency.

 The carrier oscillates at an audible frequency (i.e. 440 Hz)
 and connected to main output by default.

 The modulator is typically set to a frequency that is lower
 than humans can hear (i.e. 1 Hz, or one cycle every second).
 The modulator is diconnected from main output, and is connected
 to the frequency of the carrier, like this: carrier.freq(modulator).

 In this example...
 - MouseX controls the amplitude of the modulator from 0 to 1. When the
 modulator's amplitude is set to 0, the amplitude modulation has no effect.

 - MouseY controls the frequency of the modulator from 0 to 20hz.
 Both impact our perception of the Carrier frequency. A subtle amount
 of Amplitude Modulation can simulate effects such as Tremolo.
 Ring Modulation is a type of Amplitude Modulation where the original
 carrier signal is not present.

 - The modulator output, a signal between -1 and 1,
 is scaled to a range between 100 and 300 using .mult and .add