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);
        }
Beispiel #2
0
        /**<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);
        }