Index: requirements.txt
===================================================================
--- requirements.txt	(revision d2f9280ae9227b2ff720992c0d9be61e607c2614)
+++ requirements.txt	(revision d2f9280ae9227b2ff720992c0d9be61e607c2614)
@@ -0,0 +1,7 @@
+bitstring==3.1.9
+numpy==1.23.0
+Pillow==9.2.0
+pydub==0.25.1
+pymongo==4.1.1
+scipy==1.8.1
+setuptools==58.1.0
Index: sample_scripts/ammos_viewer.py
===================================================================
--- sample_scripts/ammos_viewer.py	(revision 09b290d891789615c8dc68e41a90131d1582bf37)
+++ sample_scripts/ammos_viewer.py	(revision d2f9280ae9227b2ff720992c0d9be61e607c2614)
@@ -4,6 +4,8 @@
 from PIL import Image, ImageTk
 from random import randbytes
+import bitstring
 
 from ammosreader.AmmosAudioReader import AmmosAudioReader
+
 
 class MainApplication(tk.Frame):
@@ -74,7 +76,11 @@
 
     def current_bytes(self):
-        return b"".join([self.bytes[each: each+self.canvas_size[0]] for each in range(self.offset.get(),
-                                                                                      len(self.bytes),
-                                                                                      self.cycle.get())])
+        if self.offset.get() % 8 == 0:
+            return b"".join([self.bytes[each: each+self.canvas_size[0]] for each in range(self.offset.get(),
+                                                                                          len(self.bytes),
+                                                                                          self.cycle.get())])
+        bits = bitstring.BitArray(self.bytes)
+        return (bits << self.offset.get()).tobytes()
+
     def update_canvas(self):
         self.image = ImageTk.PhotoImage(Image.frombytes("L", self.canvas_size, self.current_bytes()))
