void InitBlock(LiveNote note1, LiveNote note2)
    {
        if (note1.x > note2.x)
        {
            var temp = note2;
            note2 = note1;
            note1 = temp;
        }

        if (leftSide == Side.Right)
        {
            UseLeft(Heading.Right, note1);
            leftSide = Side.Left;
        }
        else
        {
            UseLeft(leftHeading, note1);
        }

        if (rightSide == Side.Left)
        {
            UseRight(Heading.Left, note2);
            rightSide = Side.Right;
        }
        else
        {
            UseRight(rightHeading, note2);
        }
    }
    void CreateBlock(Side hand, Heading heading, LiveNote note)
    {
//		print("create " + hand + " " + heading);
        LiveBlock block = null;

        var node = deadBlockList.First;

        while (node != null)
        {
            var next = node.Next;

            var deadBlock = node.Value;
            if (deadBlock.startTime + recycleInterval < MusicPlayer.LiveTime)                // Ready to be revived
            {
                block = deadBlock;
                deadBlockList.Remove(node);
                break;
            }

            node = next;
        }

        if (block == null)
        {
            node = inactiveBlockList.First;
            if (node != null)
            {
                block = node.Value;
                block.gameObject.SetActive(true);
                inactiveBlockList.RemoveFirst();
            }
        }

        if (block == null)
        {
            var go = Instantiate(blockPrototype, transform);
            block = go.GetComponent <LiveBlock>();
        }

        block.Init(hand);
        block.heading = heading;

        block.createTime = MusicPlayer.LiveTime;
        block.startTime  = note.startTime;
        block.isParallel = note.isPara;
        block.isLong     = note.isSpecial;

        block.startX = note.x;
        block.startY = note.y + 1;
        block.x      = note.x;
        block.y      = note.y;
        block.transform.Rotate(HeadingToRotation(heading), 0, 0);

        block.canvas.rotation = Quaternion.identity;
//		block.uiDirectionTrans.localEulerAngles = new Vector3(0, 0, -HeadingToRotation(heading));

        liveBlockList.AddLast(block);
        total += 1;
    }
 void UseRight(Heading heading, LiveNote note)
 {
     heading = GetDerivedHeading(heading);
     CreateBlock(Side.Right, heading, note);
     rightHeading = GetEndHeading(heading);
 }
 void UseLeft(Heading heading, LiveNote note)
 {
     heading = GetDerivedHeading(heading);
     CreateBlock(Side.Left, heading, note);
     leftHeading = GetEndHeading(heading);
 }
    void InitBlock(LiveNote note)
    {
        float       lane   = note.x;
        const float middle = 0.2f;

        // 1 3     6 8
        //     [4]
        // 0 2     5 7
        if (lane < -middle)            // left side
        {
            if (rightSide == Side.Left)
            {
                UseRight(rightHeading, note);
            }
            else if (leftSide == Side.Left)
            {
                UseLeft(leftHeading, note);
            }
            else                // no hand on left, use left hand
            {
                UseLeft(Heading.Right, note);
                leftSide = Side.Left;
            }
        }
        else if (lane > middle)              // right side
        {
            if (leftSide == Side.Right)
            {
                UseLeft(leftHeading, note);
            }
            else if (rightSide == Side.Right)
            {
                UseRight(rightHeading, note);
            }
            else                // no hand on right, use right hand
            {
                UseRight(Heading.Left, note);
                rightSide = Side.Right;
            }
        }
        else                            // middle
        {
            if (leftSide == Side.Right) // left hand on right
            {
                UseLeft(Heading.Right, note);
                leftSide = Side.Left;
            }
            else if (rightSide == Side.Left)                  // right hand on left
            {
                UseRight(Heading.Left, note);
                rightSide = Side.Right;
            }
            else                  // no hand is inversed, choose at random
            {
                if (rand.NextDouble() < 0.5)
                {
                    UseLeft(Heading.Left, note);
                    leftSide = Side.Right;
                }
                else
                {
                    UseRight(Heading.Right, note);
                    rightSide = Side.Left;
                }
            }
        }
    }