diff --git a/python_payload/bl00mbox/_patches.py b/python_payload/bl00mbox/_patches.py
index 71d69ca90ba1873e1e2acc0caf55fcaa654cf6be..6b8bf13d0aa2f6477c659a77f5b3d9f4e602b3f6 100644
--- a/python_payload/bl00mbox/_patches.py
+++ b/python_payload/bl00mbox/_patches.py
@@ -166,7 +166,7 @@ class sampler(_Patch):
             # somewhat fast path for stereo
             table = self.plugins.sampler.table_int16_array
             for i in range(
-                self.buffer_offset_16, self.memory_len + self.buffer_offset_i16
+                self.buffer_offset_i16, self.memory_len + self.buffer_offset_i16
             ):
                 frame = f.readframes(1)
                 value = int.from_bytes(frame[0:2], "little")
@@ -183,7 +183,7 @@ class sampler(_Patch):
                 return False
         f = wave.open(self._convert_filename(filename), "w")
         for i in range(self.sample_len):
-            data = self.plugins.sampler.table[_offset_index(i)]
+            data = self.plugins.sampler.table[self._offset_index(i)]
             # TODO: figure out python bytes
             # note: index wraps around, ringbuffer!
             # f.writeframesraw???
@@ -226,6 +226,8 @@ class sampler(_Patch):
 
     @read_head_position.setter
     def read_head_position(self, val):
+        if val >= self.memory_len:
+            val = self.memory_len - 1
         self._encode_uint32(0, val)
 
     @property
@@ -234,6 +236,8 @@ class sampler(_Patch):
 
     @sample_start.setter
     def sample_start(self, val):
+        if val >= self.memory_len:
+            val = self.memory_len - 1
         self._encode_uint32(2, val)
 
     @property
@@ -242,6 +246,8 @@ class sampler(_Patch):
 
     @sample_len.setter
     def sample_len(self, val):
+        if val > self.memory_len:
+            val = self.memory_len
         self._encode_uint32(4, val)
 
     @property