public TransitionMatrix(MidiTrack _track)
        {
            nodeMatrix  = new List <TransitionNode>();
            sortedTrack = new MarkovSortedTrack(_track);
            TransitionNode startNode = new TransitionNode(new MarkovNote(0x00, 0x00, 0x00));

            nodeMatrix.Add(startNode);
            previousReadNode = nodeMatrix[0];
            previousWritePos = 0; //pos 0 in array- ie start of phrase
            for (int i = 0; i < sortedTrack.notesWithLengths.Count; i++)
            {
                addNote(sortedTrack.notesWithLengths[i]);
            }
        }
        //analyze transition matrix and generate notes
        //how to deal with note offs? - add to an array?
        public MarkovNote getNextNote()
        {
            TransitionNode _node;

            _node = previousReadNode.getNextNote();
            if (_node != null)
            {
                previousReadNode = _node;
                return(_node.message);
            }
            else
            {
                Debug.Log("<color=red>Error:</color> non next note");
                return(null);
            }
        }
        public void addWeight(TransitionNode p_node)
        {
            //Debug.Log("Add weight num : " + transitionWeights.Count + " to node");
            for (int i = 0; i < transitionWeights.Count; i++)
            {
                if (p_node.message.getMessageAsBytes().SequenceEqual(transitionWeights[i].getMessageAsBytes()))
                {
                    transitionWeights[i].weight++; //add to probability if weight node already exists
                    allTransitionsWeight++;
                    return;
                }
            }
            //else create new weighting and attach to exiting node ref
            TransitionWeight connectorWeight = new TransitionWeight(p_node);

            connectorWeight.weight++;
            allTransitionsWeight++;
            transitionWeights.Add(connectorWeight);
        }
        //each node- check it doesn't exist already
        public void addNote(MarkovNote p_mes)
        {
            if (Midi.debugLevel > 1)
            {
                Debug.Log("Add note : " + p_mes.getByteOne());
            }
            for (int i = 0; i < nodeMatrix.Count; i++)
            {
                if (p_mes.getMessageAsBytes().SequenceEqual(nodeMatrix[i].getMessageAsBytes()) && p_mes.length == nodeMatrix[i].getNoteLen())
                {
                    nodeMatrix[previousWritePos].addWeight(nodeMatrix[i]);
                    previousWritePos = i;
                    return;
                }
            }
            TransitionNode node = new TransitionNode(p_mes);

            nodeMatrix[previousWritePos].addWeight(node);
            nodeMatrix.Add(node);
            previousWritePos = nodeMatrix.Count - 1;
        }
 public TransitionWeight(TransitionNode p_node)
 {
     node = p_node;
 }