def melt_curve(start=65, end=95, inc=0.5, rate=5):
    """Generate a melt curve on the fly

    No inputs neded for a standard melt curve.

    Example Usage:

    .. code-block:: python

        from autoprotocol import Protocol
        from autoprotocol_utilities import melt_curve
        protocol = Protocol()

        dest_plate = protocol.ref("plate", None, "96-pcr", discard=True,
                                  storage=None)
        protocol.seal(dest_plate)
        melt_params = melt_curve()
        protocol.thermocycle(dest_plate,
                             [{"cycles": 1,
                               "steps": [
                                   {"temperature": "37:celsius",
                                   "duration": "60:minute"}
                                   ]
                               }
                              ],
                             volume="15:microliter",
                             dataref="data",
                             dyes={"SYBR":
                             dest_plate.wells_from(0, 3).indices()},
                             **melt_params)

    Returns:

    .. code-block:: json

        {
          "refs": {
            "plate": {
              "new": "96-pcr",
              "discard": true
            }
          },
          "instructions": [
            {
              "object": "plate",
              "type": "ultra-clear",
              "op": "seal"
            },
            {
              "dataref": "data",
              "melting": {
                "start": "65.00:celsius",
                "rate": "5.00:second",
                "end": "95.00:celsius",
                "increment": "0.50:celsius"
              },
              "object": "plate",
              "volume": "15:microliter",
              "groups": [
                {
                  "cycles": 1,
                  "steps": [
                    {
                      "duration": "60:minute",
                      "temperature": "37:celsius"
                    }
                  ]
                }
              ],
              "dyes": {
                "SYBR": [
                  "A1",
                  "A2",
                  "A3"
                ]
              },
              "op": "thermocycle"
            }
          ]
        }

    Parameters
    ----------
    start : int, float
        Temperature to start at
    end : int, float
        Temperature to end at
    inc : int, float
        Temperature increment during the melt_curve
    rate : int
        After x seconds the temperature is incremented by inc

    Returns
    -------
    melt_params : dict
        containing melt_params

    Raises
    ------
    ValueError
        If start, end or inc are not of type `float` or `int`. And if rate is
        not of type `int`

    """
    assert isinstance(start, (float, int))
    assert isinstance(end, (float, int))
    assert isinstance(inc, (float, int))
    assert isinstance(rate, int)
    melt_params = {'melting_start': '%.2f:celsius' % start, 'melting_end': 
        '%.2f:celsius' % end, 'melting_increment': '%.2f:celsius' % inc,
        'melting_rate': '%.2f:second' % rate}
    return melt_params
