diff --git a/pythonosc/osc_message.py b/pythonosc/osc_message.py
index 911dbcf..b89a0d6 100644
--- a/pythonosc/osc_message.py
+++ b/pythonosc/osc_message.py
@@ -41,6 +41,8 @@ class OscMessage(object):
           val, index = osc_types.get_int(self._dgram, index)
         elif param == "f":  # Float.
           val, index = osc_types.get_float(self._dgram, index)
+        elif param == "d":  # Double.
+          val, index = osc_types.get_double(self._dgram, index)
         elif param == "s":  # String.
           val, index = osc_types.get_string(self._dgram, index)
         elif param == "b":  # Blob.
diff --git a/pythonosc/osc_message_builder.py b/pythonosc/osc_message_builder.py
index 0f9bfba..28128fb 100644
--- a/pythonosc/osc_message_builder.py
+++ b/pythonosc/osc_message_builder.py
@@ -12,6 +12,7 @@ class OscMessageBuilder(object):
   """Builds arbitrary OscMessage instances."""
 
   ARG_TYPE_FLOAT = "f"
+  ARG_TYPE_DOUBLE = "d"
   ARG_TYPE_INT = "i"
   ARG_TYPE_STRING = "s"
   ARG_TYPE_BLOB = "b"
@@ -24,8 +25,8 @@ class OscMessageBuilder(object):
   ARG_TYPE_ARRAY_STOP = "]"
 
   _SUPPORTED_ARG_TYPES = (
-      ARG_TYPE_FLOAT, ARG_TYPE_INT, ARG_TYPE_BLOB, ARG_TYPE_STRING, ARG_TYPE_RGBA,
-      ARG_TYPE_MIDI, ARG_TYPE_TRUE, ARG_TYPE_FALSE)
+      ARG_TYPE_FLOAT, ARG_TYPE_DOUBLE, ARG_TYPE_INT, ARG_TYPE_BLOB, ARG_TYPE_STRING,
+      ARG_TYPE_RGBA, ARG_TYPE_MIDI, ARG_TYPE_TRUE, ARG_TYPE_FALSE)
 
   def __init__(self, address=None):
     """Initialize a new builder for a message.
@@ -143,6 +144,8 @@ class OscMessageBuilder(object):
           dgram += osc_types.write_int(value)
         elif arg_type == self.ARG_TYPE_FLOAT:
           dgram += osc_types.write_float(value)
+        elif arg_type == self.ARG_TYPE_DOUBLE:
+          dgram += osc_types.write_double(value)
         elif arg_type == self.ARG_TYPE_BLOB:
           dgram += osc_types.write_blob(value)
         elif arg_type == self.ARG_TYPE_RGBA:
diff --git a/pythonosc/parsing/osc_types.py b/pythonosc/parsing/osc_types.py
index a91003b..5558399 100644
--- a/pythonosc/parsing/osc_types.py
+++ b/pythonosc/parsing/osc_types.py
@@ -21,6 +21,7 @@ IMMEDIATELY = 0
 # Datagram length in bytes for types that have a fixed size.
 _INT_DGRAM_LEN = 4
 _FLOAT_DGRAM_LEN = 4
+_DOUBLE_DGRAM_LEN = 8
 _DATE_DGRAM_LEN = _INT_DGRAM_LEN * 2
 # Strings and blob dgram length is always a multiple of 4 bytes.
 _STRING_DGRAM_PAD = 4
@@ -199,6 +200,42 @@ def get_float(dgram, start_index):
     raise ParseError('Could not parse datagram %s' % e)
 
 
+def write_double(val):
+  """Returns the datagram for the given double parameter value
+
+  Raises:
+    - BuildError if the double could not be converted.
+  """
+  try:
+    return struct.pack('>d', val)
+  except struct.error as e:
+    raise BuildError('Wrong argument value passed: {}'.format(e))
+
+
+def get_double(dgram, start_index):
+  """Get a 64-bit big-endian IEEE 754 floating point number from the datagram.
+
+  Args:
+    dgram: A datagram packet.
+    start_index: An index where the double starts in the datagram.
+
+  Returns:
+    A tuple containing the double and the new end index.
+
+  Raises:
+    ParseError if the datagram could not be parsed.
+  """
+  try:
+    if len(dgram[start_index:]) < _DOUBLE_DGRAM_LEN:
+      raise ParseError('Datagram is too short')
+    return (
+        struct.unpack('>d',
+                      dgram[start_index:start_index + _DOUBLE_DGRAM_LEN])[0],
+        start_index + _DOUBLE_DGRAM_LEN)
+  except (struct.error, TypeError) as e:
+    raise ParseError('Could not parse datagram {}'.format(e))
+
+
 def get_blob(dgram, start_index):
   """ Get a blob from the datagram.
 

Add support for 64 bits double type
`unhandled type: d` warnings are all that gets returned, no handlers even end up running.
diff --git a/pythonosc/test/parsing/test_osc_types.py b/pythonosc/test/parsing/test_osc_types.py
index 0863fd5..8734ad1 100644
--- a/pythonosc/test/parsing/test_osc_types.py
+++ b/pythonosc/test/parsing/test_osc_types.py
@@ -232,6 +232,39 @@ class TestFloat(unittest.TestCase):
     self.assertEqual((0, 4), osc_types.get_float(dgram, 0))
 
 
+class TestDouble(unittest.TestCase):
+
+  def test_get_double(self):
+    cases = {
+        b'\x00\x00\x00\x00\x00\x00\x00\x00': (0.0, 8),
+        b'?\xf0\x00\x00\x00\x00\x00\x00': (1.0, 8),
+        b'@\x00\x00\x00\x00\x00\x00\x00': (2.0, 8),
+        b'\xbf\xf0\x00\x00\x00\x00\x00\x00': (-1.0, 8),
+        b'\xc0\x00\x00\x00\x00\x00\x00\x00': (-2.0, 8),
+
+        b"\x00\x00\x00\x00\x00\x00\x00\x00GARBAGE": (0.0, 8),
+    }
+
+    for dgram, expected in cases.items():
+      self.assertAlmostEqual(expected, osc_types.get_double(dgram, 0))
+
+  def test_get_double_raises_on_wrong_dgram(self):
+    cases = [True]
+
+    for case in cases:
+      self.assertRaises(osc_types.ParseError, osc_types.get_double, case, 0)
+
+  def test_get_double_raises_on_type_error(self):
+    cases = [None]
+
+    for case in cases:
+      self.assertRaises(osc_types.ParseError, osc_types.get_double, case, 0)
+
+  def test_datagram_too_short_pads(self):
+    dgram = b'\x00' * 2
+    self.assertRaises(osc_types.ParseError, osc_types.get_double, dgram, 0)
+
+
 class TestBlob(unittest.TestCase):
 
   def test_get_blob(self):
diff --git a/pythonosc/test/test_osc_message_builder.py b/pythonosc/test/test_osc_message_builder.py
index c9720b4..d5bbe25 100644
--- a/pythonosc/test/test_osc_message_builder.py
+++ b/pythonosc/test/test_osc_message_builder.py
@@ -43,14 +43,15 @@ class TestOscMessageBuilder(unittest.TestCase):
     builder.add_arg([1, ["abc"]], [builder.ARG_TYPE_INT, [builder.ARG_TYPE_STRING]])
     builder.add_arg(4278255360, builder.ARG_TYPE_RGBA)
     builder.add_arg((1, 145, 36, 125), builder.ARG_TYPE_MIDI)
-    self.assertEqual(len("fisTFb[i[s]]")*2+2, len(builder.args))
+    builder.add_arg(1e-9, builder.ARG_TYPE_DOUBLE)
+    self.assertEqual(len("fisTFb[i[s]]")*2+3, len(builder.args))
     self.assertEqual("/SYNC", builder.address)
     builder.address = '/SEEK'
     msg = builder.build()
     self.assertEqual("/SEEK", msg.address)
     self.assertSequenceEqual(
         [4.0, 2, "value", True, False, b"\x01\x02\x03", [1, ["abc"]]] * 2 +
-        [4278255360, (1, 145, 36, 125)],
+        [4278255360, (1, 145, 36, 125), 1e-9],
         msg.params)
 
   def test_long_list(self):

pip install -e .
parse_log_pytest
pytest
pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
-e git+https://github.com/attwad/python-osc.git@73777b367ac4327e9fd0b799366959e50266ebc2#egg=python_osc
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: python-osc
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/python-osc

pythonosc/test/parsing/test_osc_types.py::TestDouble::test_datagram_too_short_pads pythonosc/test/parsing/test_osc_types.py::TestDouble::test_get_double pythonosc/test/parsing/test_osc_types.py::TestDouble::test_get_double_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestDouble::test_get_double_raises_on_wrong_dgram pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_all_param_types
pythonosc/test/parsing/test_osc_types.py::TestString::test_get_string pythonosc/test/parsing/test_osc_types.py::TestString::test_get_string_raises_on_wrong_dgram pythonosc/test/parsing/test_osc_types.py::TestString::test_get_string_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestString::test_get_string_raises_when_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestInteger::test_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestInteger::test_get_integer pythonosc/test/parsing/test_osc_types.py::TestInteger::test_get_integer_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestInteger::test_get_integer_raises_on_wrong_start_index pythonosc/test/parsing/test_osc_types.py::TestInteger::test_get_integer_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestRGBA::test_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestRGBA::test_get_rgba pythonosc/test/parsing/test_osc_types.py::TestRGBA::test_get_rgba_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestRGBA::test_get_rgba_raises_on_wrong_start_index pythonosc/test/parsing/test_osc_types.py::TestRGBA::test_get_rgba_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestMidi::test_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestMidi::test_get_midi pythonosc/test/parsing/test_osc_types.py::TestMidi::test_get_midi_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestMidi::test_get_midi_raises_on_wrong_start_index pythonosc/test/parsing/test_osc_types.py::TestMidi::test_get_midi_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestDate::test_get_ttag pythonosc/test/parsing/test_osc_types.py::TestDate::test_get_ttag_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestDate::test_get_ttag_raises_on_wrong_start_index pythonosc/test/parsing/test_osc_types.py::TestDate::test_get_ttag_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestDate::test_ttag_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestFloat::test_datagram_too_short_pads pythonosc/test/parsing/test_osc_types.py::TestFloat::test_get_float pythonosc/test/parsing/test_osc_types.py::TestFloat::test_get_float_raises_on_type_error pythonosc/test/parsing/test_osc_types.py::TestFloat::test_get_float_raises_on_wrong_dgram pythonosc/test/parsing/test_osc_types.py::TestBlob::test_get_blob pythonosc/test/parsing/test_osc_types.py::TestBlob::test_get_blob_raises_on_wrong_dgram pythonosc/test/parsing/test_osc_types.py::TestBlob::test_get_blob_raises_on_wrong_start_index pythonosc/test/parsing/test_osc_types.py::TestBlob::test_get_blob_raises_too_short_buffer pythonosc/test/parsing/test_osc_types.py::TestBlob::test_get_blog_raises_on_wrong_start_index_negative pythonosc/test/parsing/test_osc_types.py::TestNTPTimestamp::test_datagram_too_short pythonosc/test/parsing/test_osc_types.py::TestNTPTimestamp::test_immediately_dgram pythonosc/test/parsing/test_osc_types.py::TestNTPTimestamp::test_origin_of_time pythonosc/test/parsing/test_osc_types.py::TestNTPTimestamp::test_write_date pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_blob pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_blob_raises pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_float pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_float_raises pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_int pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_int_raises pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_string pythonosc/test/parsing/test_osc_types.py::TestBuildMethods::test_string_raises pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_add_arg_invalid_infered_type pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_bool_encoding pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_build_noarg_message pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_build_wrong_type_raises pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_just_address pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_long_list pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_no_address_raises pythonosc/test/test_osc_message_builder.py::TestOscMessageBuilder::test_wrong_param_raise
pythonosc/parsing/osc_types.py pythonosc/osc_message.py pythonosc/osc_message_builder.py
pythonosc/parsing/osc_types.py pythonosc/osc_message.py pythonosc/osc_message_builder.py