protected bool IsRandomMuted() { bool result; if (!Metronome.GetInstance().IsRandomMute) { currentlyMuted = false; return(false); } // init countdown if (randomMuteCountdown == null && Metronome.GetInstance().RandomMuteSeconds > 0) { randomMuteCountdown = randomMuteCountdownTotal = Metronome.GetInstance().RandomMuteSeconds *BytesPerSec - initialOffset; } int rand = Metronome.GetRandomNum(); if (randomMuteCountdown == null) { result = rand < Metronome.GetInstance().RandomMutePercent; } else { // countdown if (randomMuteCountdown > 0) { randomMuteCountdown -= previousByteInterval; //previousByteInterval; } if (randomMuteCountdown < 0) { randomMuteCountdown = 0; } float factor = (float)(randomMuteCountdownTotal - randomMuteCountdown) / randomMuteCountdownTotal; result = rand < Metronome.GetInstance().RandomMutePercent *factor; } return(result); }
/**<summary>Get a random pitch based on existing pitch layers</summary>*/ public string GetAutoPitch() { string note; byte octave; string[] noteNames = { "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#" }; ushort[] intervals = { 3, 4, 5, 7, 8, 9 }; do { // determine the octave octave = Metronome.GetRandomNum() > 49 ? (byte)5 : (byte)4; // 80% chance to make a sonorous interval with last pitch layer if (Metronome.GetRandomNum() < 80) { var last = Metronome.GetInstance().Layers.Last(x => IsPitch); int index = Array.IndexOf(noteNames, last.BaseSourceName.TakeWhile(x => !char.IsNumber(x))); index += intervals[Metronome.GetRandomNum() / (100 / 6)]; if (index > 11) { index -= 12; } note = noteNames[index]; } else { // randomly pick note note = noteNames[Metronome.GetRandomNum() / (100 / 12)]; } }while (Metronome.GetInstance().Layers.Where(x => x.IsPitch).Any(x => x.BaseSourceName == note + octave)); return(note + octave); }