public static IBGCStream GetNote(
     ReservedSoundSet set,
     byte note,
     byte velocity)
 {
     return(GetNote(set, GetNoteFrequency(note), velocity));
 }
        public static IBGCStream GetNote(
            ReservedSoundSet set,
            double frequency,
            byte velocity)
        {
            double amplitude = GetNoteAmplitude(velocity);

            switch (set)
            {
            case ReservedSoundSet.AcousticGrandPiano:
            case ReservedSoundSet.BrightAcousticPiano:
            case ReservedSoundSet.ElectricGrandPiano:
            case ReservedSoundSet.HonkyTonkPiano:
            case ReservedSoundSet.Harpsichord:
            case ReservedSoundSet.Clavi:
                return(new AnalyticStreamAdder(
                           new AnalyticWave(amplitude, frequency),
                           new AnalyticWave(0.5 * amplitude, 3 * frequency),
                           new AnalyticWave(0.25 * amplitude, 5 * frequency),
                           new AnalyticWave(0.125 * amplitude, 7 * frequency))
                       .FrequencyModulation(15, 2.5)
                       .ToBGCStream()
                       .ADSR(0.0125, 0.25, 0.8, 1.0, 0.05));

            case ReservedSoundSet.Xylophone:
                return(new AnalyticWave(amplitude, frequency)
                       .FrequencyModulation(frequency / 2, 20)
                       .ToBGCStream()
                       .ADSR(0.0125, 0.05, 1, 0.125, 0.05));

            case ReservedSoundSet.ElectricPiano1:
            case ReservedSoundSet.ElectricPiano2:
                return(new SquareWave(amplitude, frequency, 0.66)
                       .ADSR(0.0125, 0.25, 0.8, 1, 0.05));

            case ReservedSoundSet.DrawbarOrgan:
            case ReservedSoundSet.PercussiveOrgan:
            case ReservedSoundSet.RockOrgan:
            case ReservedSoundSet.CrutchOrgan:
            case ReservedSoundSet.ReedOrgan:
            case ReservedSoundSet.Accordion:
            case ReservedSoundSet.Harmonica:
            case ReservedSoundSet.TangoAccordion:
                amplitude /= 5.0;
                return(new StreamAdder(
                           new TriangleWave(0.1 * amplitude, 0.5 * frequency),
                           new TriangleWave(amplitude, frequency),
                           new TriangleWave(amplitude, 1.5 * frequency),
                           new TriangleWave(amplitude, 2 * frequency),
                           new TriangleWave(amplitude, 4 * frequency),
                           new TriangleWave(amplitude, 8 * frequency))
                       .ADSR(0.0125, 0.25, 0.8, 100, 0.25));

            case ReservedSoundSet.AcousticGuitar_Nylon:
            case ReservedSoundSet.AcousticGuitar_Steel:
            case ReservedSoundSet.ElectricGuitar_Jazz:
            case ReservedSoundSet.ElectricGuitar_Clean:
            case ReservedSoundSet.ElectricGuitar_Muted:
            case ReservedSoundSet.OverdrivenGuitar:
            case ReservedSoundSet.DistortionGuitar:
            case ReservedSoundSet.GuitarHarmonics:
            case ReservedSoundSet.AcousticBass:
            case ReservedSoundSet.ElectricBass_Finger:
            case ReservedSoundSet.ElectricBasS_Pick:
            case ReservedSoundSet.FretlessBass:
            case ReservedSoundSet.SlapBass1:
            case ReservedSoundSet.SlapBass2:
            case ReservedSoundSet.SynthBass1:
            case ReservedSoundSet.SynthBass2:
                return(new SquareWave(amplitude, frequency, 0.33)
                       .ContinuousFilter(
                           envelopeStream: new LinearEnvelope(0.25, 1.5),
                           filterType: ContinuousFilter.FilterType.LowPass,
                           freqLB: 20 * frequency,
                           freqUB: 3 * frequency)
                       .ADSR(0.0125, 0.33, 0.2, 2.0, 0.05));


            case ReservedSoundSet.Piccolo:
            case ReservedSoundSet.Flute:
            case ReservedSoundSet.Recorder:
            case ReservedSoundSet.PanFlute:
            case ReservedSoundSet.BlownBottle:
            case ReservedSoundSet.Shakuhachi:
            case ReservedSoundSet.Whistle:
            case ReservedSoundSet.Ocarina:
                return(new StreamAdder(
                           new SquareWave(0.75 * amplitude, frequency, 0.6),
                           new AnalyticNoiseStream(0.0125, 20.0, 10000.0, 1000, AnalyticNoiseStream.AmplitudeDistribution.White)
                           .ToBGCStream())
                       .ContinuousFilter(
                           envelopeStream: new SineWave(1.0, 6.0),
                           filterType: ContinuousFilter.FilterType.LowPass,
                           freqLB: 2 * frequency,
                           freqUB: (2.125 + 0.125 * amplitude) * frequency,
                           qFactor: 0.0125)
                       .BiQuadHighpassFilter(200f)
                       .ADSR(0.125, 0.33, 0.8, 100.0, 0.125));


            case ReservedSoundSet.Lead1_Square:
                return(new SquareWave(amplitude, frequency, 0.5)
                       .ADSR(0.0125, 0.25, 0.8, 1, 0.05));

            case ReservedSoundSet.Lead2_Sawtooth:
                return(new SawtoothWave(amplitude, frequency)
                       .ADSR(0.0125, 0.25, 0.8, 1, 0.05));

            default:
                return(new AnalyticWave(amplitude, frequency)
                       .FrequencyModulation(frequency / 3, 10)
                       .ToBGCStream()
                       .ADSR(0.0125, 0.25, 0.8, 1, 0.05));
            }
        }