public MelodyMachine(List <Note> _notes, List <MelodyTansitionInfo> _transitions) { random = new System.Random(); //Read in states foreach (var note in _notes) { states.Add(new MelodyState() { Note = note }); } //Read in transitions foreach (var transition in _transitions) { MelodyState start = states[transition.A]; MelodyState end = states[transition.B]; if (!transitions.ContainsKey(start)) { transitions[start] = new List <MelodyTransition>(); } transitions[start].Add(new MelodyTransition() { Probability = transition.Probability, TargetState = end }); } //Normalize probabilities foreach (var stateTrans in transitions) { float totalProbability = 0; foreach (var trans in stateTrans.Value) { totalProbability += trans.Probability; } for (int i = 0; i < stateTrans.Value.Count; i++) { stateTrans.Value[i].Probability /= totalProbability; } } //Start in random state; currentState = states[0]; }
public void Next() { float rand = (float)random.NextDouble(); var availableTransitions = transitions[currentState]; foreach (var trans in availableTransitions) { if (rand < trans.Probability) { currentState = trans.TargetState; break; } rand -= trans.Probability; } }