diff --git a/mir_eval/transcription_velocity.py b/mir_eval/transcription_velocity.py
index 223f487..c7aac28 100644
--- a/mir_eval/transcription_velocity.py
+++ b/mir_eval/transcription_velocity.py
@@ -174,6 +174,9 @@ def match_notes(
 
     # Convert matching list-of-tuples to array for fancy indexing
     matching = np.array(matching)
+    # When there is no matching, return an empty list
+    if matching.size == 0:
+        return []
     # Grab velocities for matched notes
     ref_matched_velocities = ref_velocities[matching[:, 0]]
     est_matched_velocities = est_velocities[matching[:, 1]]

transcription+velocity metrics fail when there is no matching
The implementation recently added in #283, it fails with an unexpected exception when there is zero match between the reference and the estimated. 

```python
from numpy import array
from mir_eval.transcription_velocity import precision_recall_f1_overlap

precision_recall_f1_overlap(array([[1, 2]]), array([1]), array([1]),
                            array([[3, 4]]), array([1]), array([1]))    
```

```
~/anaconda3/lib/python3.6/site-packages/mir_eval/transcription_velocity.py in precision_recall_f1_overlap(ref_intervals, ref_pitches, ref_velocities, est_intervals, est_pitches, est_velocities, onset_tolerance, pitch_tolerance, offset_ratio, offset_min_tolerance, strict, velocity_tolerance, beta)
    289         ref_intervals, ref_pitches, ref_velocities, est_intervals, est_pitches,
    290         est_velocities, onset_tolerance, pitch_tolerance, offset_ratio,
--> 291         offset_min_tolerance, strict, velocity_tolerance)
    292 
    293     precision = float(len(matching))/len(est_pitches)

~/anaconda3/lib/python3.6/site-packages/mir_eval/transcription_velocity.py in match_notes(ref_intervals, ref_pitches, ref_velocities, est_intervals, est_pitches, est_velocities, onset_tolerance, pitch_tolerance, offset_ratio, offset_min_tolerance, strict, velocity_tolerance)
    176     matching = np.array(matching)
    177     # Grab velocities for matched notes
--> 178     ref_matched_velocities = ref_velocities[matching[:, 0]]
    179     est_matched_velocities = est_velocities[matching[:, 1]]
    180     # Find slope and intercept of line which produces best least-squares fit

IndexError: too many indices for array
```

---

In a related context, it also throws an exception when either is empty, not following the convention in #43 / #44
diff --git a/tests/test_transcription_velocity.py b/tests/test_transcription_velocity.py
index 61abcf4..b48e719 100644
--- a/tests/test_transcription_velocity.py
+++ b/tests/test_transcription_velocity.py
@@ -61,6 +61,13 @@ def test_precision_recall_f1_overlap_empty():
     assert (p, r, f, o) == (0., 0., 0., 0.)
 
 
+def test_precision_recall_f1_overlap_no_overlap():
+    p, r, f, o = mir_eval.transcription_velocity.precision_recall_f1_overlap(
+        np.array([[1, 2]]), np.array([1]), np.array([1]),
+        np.array([[3, 4]]), np.array([1]), np.array([1]))
+    assert (p, r, f, o) == (0., 0., 0., 0.)
+
+
 def __check_score(score, expected_score):
     assert np.allclose(score, expected_score, atol=A_TOL)
 

pip install -e .[display,testing]
parse_log_pytest
pytest
nose nose-cov pytest
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
contourpy==1.3.0
cov-core==1.15.0
coverage==7.8.0
cycler==0.12.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
fonttools==4.56.0
future==1.0.0
importlib_resources==6.5.2
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
kiwisolver==1.4.7
matplotlib==3.9.4
-e git+https://github.com/craffel/mir_eval.git@73886e52e0e29a840d5fabf0148b6b78574d4790#egg=mir_eval
nose==1.3.7
nose-cov==1.6
numpy==2.0.2
packaging @ file:///croot/packaging_1734472117206/work
pillow==11.1.0
pluggy @ file:///croot/pluggy_1733169602837/work
pyparsing==3.2.3
pytest @ file:///croot/pytest_1738938843180/work
python-dateutil==2.9.0.post0
scipy==1.13.1
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
zipp==3.21.0

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
  - 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
  - pip:
      - contourpy==1.3.0
      - cov-core==1.15.0
      - coverage==7.8.0
      - cycler==0.12.1
      - fonttools==4.56.0
      - future==1.0.0
      - importlib-resources==6.5.2
      - kiwisolver==1.4.7
      - matplotlib==3.9.4
      - nose==1.3.7
      - nose-cov==1.6
      - numpy==2.0.2
      - pillow==11.1.0
      - pyparsing==3.2.3
      - python-dateutil==2.9.0.post0
      - scipy==1.13.1
      - six==1.17.0
      - zipp==3.21.0
prefix: /opt/conda/envs/mir_eval

tests/test_transcription_velocity.py::test_precision_recall_f1_overlap_no_overlap
tests/test_transcription_velocity.py::test_precision_recall_f1_overlap tests/test_transcription_velocity.py::test_precision_recall_f1_overlap_empty
mir_eval/transcription_velocity.py
mir_eval/transcription_velocity.py