diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 ## v0.2.1
 
+  * add `timeSigAt` function
+
+## v0.2.0.1
+
   * Semigroup fix for GHC 8.4 (requires `non-negative` 0.1.2 with same fix)
 
 ## v0.2
diff --git a/midi-util.cabal b/midi-util.cabal
--- a/midi-util.cabal
+++ b/midi-util.cabal
@@ -1,5 +1,5 @@
 name:                 midi-util
-version:              0.2.0.1
+version:              0.2.1
 synopsis:             Utility functions for processing MIDI files
 description:
   Common high-level tasks when processing MIDI files.
@@ -26,11 +26,11 @@
   exposed-modules:
     Sound.MIDI.Util
   build-depends:
-    base           >= 4.7   && < 4.12
+    base           >= 4.7   && < 5
     , midi         >= 0.2.1 && < 0.3
     , event-list   >= 0.1.1 && < 0.2
     , non-negative >= 0.1.2 && < 0.2
-    , containers   >= 0.5.5 && < 0.6
+    , containers   >= 0.5.5 && < 0.7
   hs-source-dirs:       src
   default-language:     Haskell2010
   ghc-options:          -Wall
diff --git a/src/Sound/MIDI/Util.hs b/src/Sound/MIDI/Util.hs
--- a/src/Sound/MIDI/Util.hs
+++ b/src/Sound/MIDI/Util.hs
@@ -23,6 +23,7 @@
 , measureMapFromTimeSigs, measureMapToTimeSigs
 , applyMeasureMap, unapplyMeasureMap
 , measureLengthToTimeSig
+, timeSigAt
 -- * Track names
 , trackName, setTrackName, readTrackName, showTrackName
 -- * Misc. track operations
@@ -327,6 +328,12 @@
 unapplyMeasureMap (MeasureMap mm) (msr, bts) = case Map.lookupLE (LookupB msr) mm of
   Just (DoubleKey b m, tsig) -> b + fromIntegral (msr - m) * timeSigLength tsig + bts
   _ -> translationError "unapplyMeasureMap" (msr, bts)
+
+-- | Returns the time signature active at the given beats position.
+timeSigAt :: Beats -> MeasureMap -> TimeSig
+timeSigAt bts (MeasureMap mm) = case Map.lookupLE (LookupA bts) mm of
+  Just (_, tsig) -> tsig
+  Nothing        -> translationError "timeSigAt" bts
 
 -- | Combines 'trackTakeZero' and 'trackDropZero'.
 trackSplitZero :: (NNC.C t) => RTB.T t a -> ([a], RTB.T t a)
