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;
    }