Exemple #1
0
    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];
    }
Exemple #2
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;
        }
    }