/** Sets up the tremolo section of the synthesizer. */
  private SignalProvider[] setupTremolo(SignalProvider[] source) {
    SynthesizerInput rate = new SynthesizerInput(0.0, 0.0, 10.0);
    SynthesizerInput depth = new SynthesizerInput(0.0, 0.0, 1.0);
    WaveformInput waveform = new WaveformInput(WaveformInput.SINE);

    synthesizerInputs_.put(Setting.TREMOLO_RATE, rate);
    synthesizerInputs_.put(Setting.TREMOLO_DEPTH, depth);
    waveformInputs_.put(Setting.TREMOLO_WAVEFORM, waveform);

    SignalProvider[] envelope =
        setupEnvelope(
            Setting.TREMOLO_ATTACK,
            Setting.TREMOLO_DECAY,
            Setting.TREMOLO_SUSTAIN,
            Setting.TREMOLO_RELEASE);

    SignalProvider[] response = new SignalProvider[FINGERS];
    for (int finger = 0; finger < FINGERS; ++finger) {
      WaveformSelector waveformOutput = new WaveformSelector(waveform);
      waveformOutput.addDefaultWaveforms(rate);
      response[finger] =
          new Amplifier(
              source[finger], new Tremolo(new Amplifier(waveformOutput, envelope[finger]), depth));
    }
    return response;
  }
 /** Sets up the vibrato section of the synthesizer. */
 private SignalProvider[] setupVibrato() {
   SynthesizerInput rate = new SynthesizerInput(0.0, 0.0, 10.0);
   WaveformInput waveform = new WaveformInput(WaveformInput.SINE);
   synthesizerInputs_.put(Setting.VIBRATO_RATE, rate);
   waveformInputs_.put(Setting.VIBRATO_WAVEFORM, waveform);
   SignalProvider[] envelope =
       setupEnvelope(
           Setting.VIBRATO_ATTACK,
           Setting.VIBRATO_DECAY,
           Setting.VIBRATO_SUSTAIN,
           Setting.VIBRATO_RELEASE);
   SignalProvider[] response = new SignalProvider[FINGERS];
   for (int finger = 0; finger < FINGERS; ++finger) {
     WaveformSelector waveformOutput = new WaveformSelector(waveform);
     waveformOutput.addDefaultWaveforms(rate);
     response[finger] = new Amplifier(waveformOutput, envelope[finger]);
   }
   return response;
 }
  /** Sets up an oscillator section of the synthesizer. */
  private SignalProvider[] setupOscillator(
      Setting glideSetting,
      Setting coarseSetting,
      Setting fineSetting,
      Setting vibratoSetting,
      Setting waveformSetting,
      Setting blendSetting,
      Setting stretchSetting,
      Setting excitementSetting,
      FrequencyProvider[] pitch,
      SignalProvider[] vibrato,
      boolean includeOrgan,
      SoundFontReader sampleLibrary,
      double sampleRateInHz) {
    SynthesizerInput glide = new SynthesizerInput(0.0, 0.0, 1.0);
    SynthesizerInput coarse = new SynthesizerInput(0.0, -1.0, 1.0);
    SynthesizerInput fine = new SynthesizerInput(0.0, -0.0833333333, 0.0833333333);
    SynthesizerInput vibratoDepth = new SynthesizerInput(0.0, 0.0, 0.1666666667);
    WaveformInput waveform = new WaveformInput(WaveformInput.SINE);

    // Register all of the inputs.
    synthesizerInputs_.put(glideSetting, glide);
    synthesizerInputs_.put(coarseSetting, coarse);
    synthesizerInputs_.put(fineSetting, fine);
    synthesizerInputs_.put(vibratoSetting, vibratoDepth);
    waveformInputs_.put(waveformSetting, waveform);

    // Create a KarplusStrong module.
    SignalProvider[] karplusStrong =
        setupKarplusStrong(blendSetting, stretchSetting, excitementSetting, pitch, sampleRateInHz);

    // Create an organ module.
    SignalProvider[] organ = null;
    if (includeOrgan) {
      organ = setupDrawbarOrgan(pitch);
    }

    // Create a drum module.
    SignalProvider[] drums = null;
    if (sampleLibrary != null) {
      drums = setupDrums(pitch, sampleRateInHz, sampleLibrary);
    }

    SignalProvider[] response = new SignalProvider[FINGERS];
    for (int finger = 0; finger < FINGERS; ++finger) {
      // Apply all of the layers that can control pitch;
      FrequencyProvider adjustedPitch = new Glide(pitch[finger], glide);
      adjustedPitch = new Tuner(adjustedPitch, coarse);
      adjustedPitch = new Tuner(adjustedPitch, fine);
      adjustedPitch = new Tuner(adjustedPitch, new Amplifier(vibrato[finger], vibratoDepth));

      // Create the waveform.
      WaveformSelector selector = new WaveformSelector(waveform);
      selector.addDefaultWaveforms(adjustedPitch);
      selector.addWaveform(WaveformInput.KARPLUS_STRONG, karplusStrong[finger]);
      if (organ != null) {
        selector.addWaveform(WaveformInput.DRAWBAR_ORGAN, organ[finger]);
      }
      if (drums != null) {
        selector.addWaveform(WaveformInput.DRUMS, drums[finger]);
      }
      response[finger] = selector;
    }
    return response;
  }