diff --git a/mir_eval/sonify.py b/mir_eval/sonify.py
index 23703e3..66a8319 100644
--- a/mir_eval/sonify.py
+++ b/mir_eval/sonify.py
@@ -125,7 +125,7 @@ def time_frequency(gram, frequencies, times, fs, function=np.sin, length=None):
     return output
 
 
-def chroma(chromagram, times, fs):
+def chroma(chromagram, times, fs, **kwargs):
     """Reverse synthesis of a chromagram (semitone matrix)
 
     Parameters
@@ -138,6 +138,9 @@ def chroma(chromagram, times, fs):
         The start time of each column in the chromagram
     fs : int
         Sampling rate to synthesize audio data at
+    kwargs
+        Additional keyword arguments to pass to
+        :func:`mir_eval.sonify.time_frequency`
 
     Returns
     -------
@@ -165,10 +168,10 @@ def chroma(chromagram, times, fs):
     gram *= shepard_weight.reshape(-1, 1)
     # Compute frequencies
     frequencies = 440.0*(2.0**((notes - 69)/12.0))
-    return time_frequency(gram, frequencies, times, fs)
+    return time_frequency(gram, frequencies, times, fs, **kwargs)
 
 
-def chords(chord_labels, intervals, fs):
+def chords(chord_labels, intervals, fs, **kwargs):
     """Synthesizes chord labels
 
     Parameters
@@ -179,6 +182,9 @@ def chords(chord_labels, intervals, fs):
         Start and end times of each chord label
     fs : int
         Sampling rate to synthesize at
+    kwargs
+        Additional keyword arguments to pass to
+        :func:`mir_eval.sonify.time_frequency`
 
     Returns
     -------
@@ -200,4 +206,4 @@ def chords(chord_labels, intervals, fs):
     chromagram = np.array([np.roll(interval_bitmap, root)
                            for (interval_bitmap, root)
                            in zip(interval_bitmaps, roots)]).T
-    return chroma(chromagram, times, fs)
+    return chroma(chromagram, times, fs, **kwargs)

sonify.chroma and sonify.chords should pass **kwargs to time_frequency
So that `length` and `function` can be set.
diff --git a/tests/test_sonify.py b/tests/test_sonify.py
index 03a2ec4..a1975c9 100644
--- a/tests/test_sonify.py
+++ b/tests/test_sonify.py
@@ -36,6 +36,10 @@ def test_chroma():
             np.random.standard_normal((12, 1000)),
             np.linspace(0, 10, 1000), fs)
         assert len(signal) == 10*fs
+        signal = mir_eval.sonify.chroma(
+            np.random.standard_normal((12, 1000)),
+            np.linspace(0, 10, 1000), fs, length=fs*11)
+        assert len(signal) == 11*fs
 
 
 def test_chords():
@@ -45,3 +49,7 @@ def test_chords():
             ['C', 'C:maj', 'D:min7', 'E:min', 'C#', 'C', 'C', 'C', 'C', 'C'],
             intervals, fs)
         assert len(signal) == 10*fs
+        signal = mir_eval.sonify.chords(
+            ['C', 'C:maj', 'D:min7', 'E:min', 'C#', 'C', 'C', 'C', 'C', 'C'],
+            intervals, fs, length=fs*11)
+        assert len(signal) == 11*fs

pip install -e .
parse_log_pytest
numpy>=1.7.0 scipy>=0.9.0 future six
nose pep8 pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
exceptiongroup==1.2.2
future @ file:///croot/future_1730902796226/work
iniconfig==2.1.0
-e git+https://github.com/craffel/mir_eval.git@3a6a8ce53eb7974db52104a834210b505b43f711#egg=mir_eval
nose==1.3.7
numpy @ file:///croot/numpy_and_numpy_base_1736283260865/work/dist/numpy-2.0.2-cp39-cp39-linux_x86_64.whl#sha256=3387e3e62932fa288bc18e8f445ce19e998b418a65ed2064dd40a054f976a6c7
packaging==24.2
pep8==1.7.1
pluggy==1.5.0
pytest==8.3.5
scipy @ file:///croot/scipy_1733756309941/work/dist/scipy-1.13.1-cp39-cp39-linux_x86_64.whl#sha256=3b247b926209f2d9f719ebae39faf3ff891b2596150ed8f8349adfc3eb19441c
six @ file:///tmp/build/80754af9/six_1644875935023/work
tomli==2.2.1

name: mir_eval
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
  - blas=1.0=openblas
  - ca-certificates=2025.2.25=h06a4308_0
  - future=1.0.0=py39h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgfortran-ng=11.2.0=h00389a5_1
  - libgfortran5=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libopenblas=0.3.21=h043d6bf_0
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - numpy=2.0.2=py39heeff2f4_0
  - numpy-base=2.0.2=py39h8a23956_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - pybind11-abi=4=hd3eb1b0_1
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - scipy=1.13.1=py39heeff2f4_1
  - setuptools=72.1.0=py39h06a4308_0
  - six=1.16.0=pyhd3eb1b0_1
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - nose==1.3.7
      - packaging==24.2
      - pep8==1.7.1
      - pluggy==1.5.0
      - pytest==8.3.5
      - tomli==2.2.1
prefix: /opt/conda/envs/mir_eval

tests/test_sonify.py::test_chroma
tests/test_sonify.py::test_clicks tests/test_sonify.py::test_chords
tests/test_sonify.py::test_time_frequency
mir_eval/sonify.py
mir_eval/sonify.py