public static ITimedWave GetKeyboardChord ( KeyboardChord chord, Byte octave = 4, Int32 instrumentNumber = 1, SByte volume = 96, UInt32 SampleRate = 44100, Boolean doFadeout = false, Double fadeoutStrength = 1.0, Double fadeoutPosition = 1.0, Boolean keepVolumeBeforeFadeout = true ) { UInt32[] newTones; switch (chord) { case KeyboardChord.C: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(4, octave), Tones.Receive(7, octave) }; break; case KeyboardChord.Cm: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(3, octave), Tones.Receive(7, octave) }; break; case KeyboardChord.Csus2: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(2, octave), Tones.Receive(7, octave) }; break; case KeyboardChord.Csus4: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(5, octave), Tones.Receive(7, octave) }; break; case KeyboardChord.C5: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(7, octave) }; break; case KeyboardChord.Cmaj7: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(4, octave), Tones.Receive(7, octave), Tones.Receive(11, octave) }; break; case KeyboardChord.Cm7: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(3, octave), Tones.Receive(7, octave), Tones.Receive(10, octave) }; break; case KeyboardChord.C7: newTones = new uint[] { Tones.Receive(0, octave), Tones.Receive(4, octave), Tones.Receive(7, octave), Tones.Receive(10, octave) }; break; default: throw new NotImplementedException("No implementation for this chord."); } return(Get(newTones, instrumentNumber, volume, SampleRate, doFadeout, fadeoutStrength, fadeoutPosition, keepVolumeBeforeFadeout)); }
/// <summary> /// Get timed wave of needed instrument. /// </summary> /// <param name="frequency">Determines tone of needed instrument.</param> /// <param name="InstrumentNumber">Determines type of needed instrument.</param> /// <param name="volume">Sets up peak value for instrument's waveform.</param> /// <param name="SampleRate">Wave's sample rate.</param> /// <param name="DoFadeout">Perform fadeout at end of tile.</param> /// <param name="FadeoutStrength">Multiplier for parabolic amplitude reduction. Volume(t) = Wave(t)/t*a, where a is fadeout strength.</param> /// <param name="FadeoutPosition">Sets up position offset for parabolic reduction graph. Volume(t) = Wave(t)/(t*a+b), where b is fadeout position.</param> /// <param name="KeepVolumeBeforeFadeout">If true, volume will stay at original level rather than being increased if it happens to be so.</param> /// <returns>ITimedWave instance that can be used with sequencers.</returns> /// <example> /// // Receiving harmonic oscillation that corresponds to note C of octave 5 and fades out after 1 second mark: /// /// Instruments.GetTimedWave(523, 0, 96, DoFadeout: true); /// </example> /// <exception cref="System.NotImplementedException">Occurs if attempted to instantiate sound of instrument that is not enlisted in library.</exception> public static ITimedWave GetTimedWave ( UInt32 frequency, Int32 InstrumentNumber = 0, SByte volume = 96, UInt32 SampleRate = 44100u, Boolean DoFadeout = false, Double FadeoutStrength = 1.0, Double FadeoutPosition = 1.0, Boolean KeepVolumeBeforeFadeout = true ) { ITimedWave myInstrument; switch (InstrumentNumber) { case 0: { myInstrument = new Oscillation(frequency, volume, WaveType.Sine, SampleRate); break; } case 1: { // Some fine tuning frequency = Tones.Shift(frequency, 7); SByte eighthAmplitude = ((SByte)(volume / 8)); Oscillation a1 = new Oscillation(frequency, volume, WaveType.Triangle, SampleRate); Oscillation a2 = new Oscillation(frequency, eighthAmplitude, WaveType.Triangle, SampleRate); Oscillation a3 = new Oscillation(frequency, ((SByte)(0 - volume)), WaveType.Triangle, SampleRate); myInstrument = new ConjoinedWave(new ITimedWave[] { a1, a2, a3 }, new uint[] { a1.Lambda / 2, a2.Lambda / 2, a3.Lambda / 2 }); break; } case 21: { // increasing base frequency in 2 times frequency = Tones.Shift(frequency, 12); volume = ((SByte)(Math.Min(Math.Max(volume * 3 / 2, -128), 127))); SByte halfAmplitude = ((SByte)(volume / 2)); SByte twoThirdsAmplitude = ((SByte)(volume * 2 / 3)); Oscillation a1 = new Oscillation(frequency, volume, WaveType.Triangle, SampleRate); Oscillation a2 = new Oscillation(frequency, halfAmplitude, WaveType.Triangle, SampleRate); Oscillation a3 = new Oscillation(frequency, ((SByte)(0 - twoThirdsAmplitude)), WaveType.Triangle, SampleRate); myInstrument = new ConjoinedWave(new ITimedWave[] { a1, a2, a3 }, new uint[] { a1.Lambda, a2.Lambda / 2, a3.Lambda / 2 }); break; } default: { throw new NotImplementedException(String.Format("Unable to instantiate instrument with following number: {0}.", InstrumentNumber)); } } if (DoFadeout) { myInstrument = new Fadeout(myInstrument, FadeoutStrength, FadeoutPosition, !KeepVolumeBeforeFadeout); } return(myInstrument); }