/// <summary> /// Constructor /// </summary> /// <param name="tuning">The selected tuning for this instrument.</param> /// <param name="attack">Attack time, in seconds.</param> /// <param name="decay">Decay time, in secods.</param> /// <param name="sustainLevel">The strength of the signal during the sustain phase. Value between 0 and 1.</param> /// <param name="release">Release time in secods.</param> /// <param name="generator">A function that determines the air pressure for a specific time and frequency.</param> public Instrument(Tuning tuning, double attack, double decay, double sustainLevel, double release, Func <double, double, double> generator) { this.Tuning = tuning; this.Attack = attack; this.Decay = decay; this.SustainLevel = sustainLevel; this.Release = release; this.generator = generator; this.MinimalNoteLength = attack + decay + release; analyse(); }
public static void Main() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; var tuning = new Tuning(Tuning.Scale.Ptolemaic, 280, 53); var lead = new Instrument( tuning, attack: 0.05, decay: 0.1, sustainLevel: 0.5, release: 0.4, (double time, double frequency) => ( 3d * Waveform.Triangle(time, frequency) + 2d * Waveform.Triangle(time, frequency + 1.8d) + 0.8d * Waveform.Triangle(time, frequency * 2d + 0.8d) + 0.5d * Waveform.Triangle(time, frequency + 3.8d) ) + 0.02d * Waveform.Noise() ); var crystal = new Instrument( tuning, attack: 0.05, decay: 0.1, sustainLevel: 0.5, release: 0.4, (double time, double frequency) => ( 3d * Waveform.SemiSine(time, frequency) + 2d * Waveform.SemiSine(time, frequency + 0.8d) + 1d * Waveform.SemiSine(time, frequency + 1.6d) + 0.5d * Waveform.SemiSine(time, frequency + 2.1d) ) + 0.01d * Waveform.Noise() ); var synthBass = new Instrument( tuning, attack: 0.05, decay: 0.1, sustainLevel: 0.5, release: 0.4, (double time, double frequency) => ( 3d * Waveform.Triangle(time, frequency - 0.2d) + 2d * Waveform.Triangle(time, frequency + 0.7d) + 1d * Waveform.Triangle(time, frequency + 1.5d) + 0.5d * Waveform.Triangle(time, frequency + 2.2d) ) * (frequency / tuning.BaseFrequency) + ( 3d * Waveform.Sawtooth(time, frequency - 0.2d) + 2d * Waveform.Sawtooth(time, frequency + 0.9d) + 1d * Waveform.Sawtooth(time, frequency + 1.8d) + 0.5d * Waveform.Sawtooth(time, frequency + 2.7d) ) * (30d / frequency) + 0.08d * Waveform.Noise() ); var track = new Track(Track.SampleRateValue.R_44100_Hz); var Superius = new Sequence(lead, "data/Pavane_dAngleterre.mid", filterChannel: 0, steroPan: -0.4, tempoChange: 0.95, lengthChange: 0.7, volumeChange: 0.8, octaveShift: 0); var Tenor = new Sequence(crystal, "data/Pavane_dAngleterre.mid", filterChannel: 1, steroPan: 0.4, tempoChange: 0.95, lengthChange: 0.7, volumeChange: 1.4, octaveShift: 0); var Bass = new Sequence(synthBass, "data/Pavane_dAngleterre.mid", filterChannel: 2, steroPan: 0.2, tempoChange: 0.95, lengthChange: 0.7, volumeChange: 2.5, octaveShift: 0); track.AddSequence(Superius); track.AddSequence(Tenor); track.AddSequence(Bass); track.Render(delay: 0.7, Superius.TotalLength); track.SaveAsWavFile("data/Pavane_dAngleterre.wav"); }