From 2c09a1923f220a1e2608392ced9fe5baeaf41bd5 Mon Sep 17 00:00:00 2001
From: bav6096 <benedikt.deike@informatik.uni-hamburg.de>
Date: Thu, 23 Dec 2021 21:16:48 +0100
Subject: [PATCH] added abstract expression

---
 CMakeLists.txt                                |  4 +-
 scripts/{build_state_cycle.py => abstract.py} | 18 +++-
 scripts/{build_emotion.py => emotion.py}      |  0
 scripts/play_animation.py                     |  2 +-
 src/visualising/communication/arduino.py      |  4 +
 .../communication/channel/connection.py       | 16 +---
 .../channel/message/msg_frame.py              | 15 +---
 .../channel/message/msg_instr.py              | 21 ++---
 .../communication/channel/message/response.py | 18 +---
 .../communication/illustration/animation.py   | 21 +----
 .../communication/illustration/color/rgb.py   |  8 +-
 .../communication/illustration/ensemble.py    | 35 +++-----
 .../communication/illustration/frame.py       | 12 +--
 .../communication/illustration/pixel.py       | 16 +---
 src/visualising/expression/abstract.py        | 87 ++++++++++++++++++-
 .../library/alphabet/{A.txt => l_A.txt}       |  2 +-
 .../library/alphabet/{B.txt => l_B.txt}       |  0
 .../library/alphabet/{C.txt => l_C.txt}       |  2 +-
 .../library/alphabet/{D.txt => l_D.txt}       |  0
 .../library/alphabet/{E.txt => l_E.txt}       |  0
 .../library/alphabet/{G.txt => l_G.txt}       |  0
 .../library/alphabet/{H.txt => l_H.txt}       |  0
 .../library/alphabet/{I.txt => l_I.txt}       |  0
 .../library/alphabet/{J.txt => l_J.txt}       |  0
 .../library/alphabet/{L.txt => l_L.txt}       |  0
 .../library/alphabet/{M.txt => l_M.txt}       |  0
 .../library/alphabet/{N.txt => l_N.txt}       |  0
 .../library/alphabet/{O.txt => l_O.txt}       |  0
 .../expression/library/alphabet/l_P.txt       |  2 +
 .../library/alphabet/{R.txt => l_R.txt}       |  0
 .../library/alphabet/{S.txt => l_S.txt}       |  0
 .../library/alphabet/{T.txt => l_T.txt}       |  0
 .../expression/library/alphabet/l_U.txt       |  2 +
 .../expression/library/alphabet/r_A.txt       |  2 +
 .../expression/library/alphabet/r_B.txt       |  2 +
 .../expression/library/alphabet/r_C.txt       |  2 +
 .../expression/library/alphabet/r_D.txt       |  2 +
 .../expression/library/alphabet/r_E.txt       |  2 +
 .../expression/library/alphabet/r_G.txt       |  2 +
 .../expression/library/alphabet/r_H.txt       |  2 +
 .../expression/library/alphabet/r_I.txt       |  2 +
 .../expression/library/alphabet/r_J.txt       |  2 +
 .../expression/library/alphabet/r_L.txt       |  2 +
 .../expression/library/alphabet/r_M.txt       |  2 +
 .../expression/library/alphabet/r_N.txt       |  2 +
 .../expression/library/alphabet/r_O.txt       |  2 +
 .../expression/library/alphabet/r_P.txt       |  2 +
 .../expression/library/alphabet/r_R.txt       |  2 +
 .../expression/library/alphabet/r_S.txt       |  2 +
 .../expression/library/alphabet/r_T.txt       |  2 +
 .../expression/library/alphabet/r_U.txt       |  2 +
 .../library/emotion/expression_happy.txt      |  4 +-
 src/visualising/expression/tool.py            | 55 ------------
 53 files changed, 185 insertions(+), 195 deletions(-)
 rename scripts/{build_state_cycle.py => abstract.py} (54%)
 rename scripts/{build_emotion.py => emotion.py} (100%)
 rename src/visualising/expression/library/alphabet/{A.txt => l_A.txt} (70%)
 rename src/visualising/expression/library/alphabet/{B.txt => l_B.txt} (100%)
 rename src/visualising/expression/library/alphabet/{C.txt => l_C.txt} (68%)
 rename src/visualising/expression/library/alphabet/{D.txt => l_D.txt} (100%)
 rename src/visualising/expression/library/alphabet/{E.txt => l_E.txt} (100%)
 rename src/visualising/expression/library/alphabet/{G.txt => l_G.txt} (100%)
 rename src/visualising/expression/library/alphabet/{H.txt => l_H.txt} (100%)
 rename src/visualising/expression/library/alphabet/{I.txt => l_I.txt} (100%)
 rename src/visualising/expression/library/alphabet/{J.txt => l_J.txt} (100%)
 rename src/visualising/expression/library/alphabet/{L.txt => l_L.txt} (100%)
 rename src/visualising/expression/library/alphabet/{M.txt => l_M.txt} (100%)
 rename src/visualising/expression/library/alphabet/{N.txt => l_N.txt} (100%)
 rename src/visualising/expression/library/alphabet/{O.txt => l_O.txt} (100%)
 create mode 100644 src/visualising/expression/library/alphabet/l_P.txt
 rename src/visualising/expression/library/alphabet/{R.txt => l_R.txt} (100%)
 rename src/visualising/expression/library/alphabet/{S.txt => l_S.txt} (100%)
 rename src/visualising/expression/library/alphabet/{T.txt => l_T.txt} (100%)
 create mode 100644 src/visualising/expression/library/alphabet/l_U.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_A.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_B.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_C.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_D.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_E.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_G.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_H.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_I.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_J.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_L.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_M.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_N.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_O.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_P.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_R.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_S.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_T.txt
 create mode 100644 src/visualising/expression/library/alphabet/r_U.txt

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d486f68..4bb834f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -162,8 +162,8 @@ catkin_install_python(PROGRAMS
    nodes/visualiser
    scripts/play_animation.py
    scripts/reset_display.py
-   scripts/build_emotion.py
-   scripts/build_state_cycle.py
+   scripts/emotion.py
+   scripts/abstract.py
    scripts/write.py
    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )
diff --git a/scripts/build_state_cycle.py b/scripts/abstract.py
similarity index 54%
rename from scripts/build_state_cycle.py
rename to scripts/abstract.py
index c932bf0..550b6f4 100755
--- a/scripts/build_state_cycle.py
+++ b/scripts/abstract.py
@@ -1,9 +1,13 @@
 #!/usr/bin/env python
 
 import argparse
+import time
+
 
 from visualising.expression.tool import Tool
+from visualising.expression.abstract import Abstract
 from visualising.communication.arduino import Arduino
+from visualising.communication.illustration.animation import Animation
 from visualising.communication.channel.connection import Connection
 
 parser = argparse.ArgumentParser(description="script to play an animation")
@@ -14,13 +18,19 @@ args = vars(parser.parse_args())
 
 port = args["port"]
 baud = args["baud"]
-time = args["time"]
+delay = args["time"]
 
 color = [10, 10, 10]
 
 arduino = Arduino(Connection(port, baud))
 
-states = [0.4, 1, 0.2, 0.3, 0.9, 0.7]
-ensemble = Tool.build_state_cycle(states)
+states = [0, 1.0, 0.10, 0.15, 0.20, 0.85, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65,
+          0.70, 0.75, 0.80, 0.25, 0.90, 0.05, 0.95]
+text = ["A", "CPU", "A", "A", "A", "ARM", "A", "A", "A", "A", "A", "A", "A", "A",
+        "A", "A", "A", "A", "RAM", "A", "CAMERA"]
+ensemble = Abstract.cycle(states)
+
+time.sleep(10)
 
-arduino.stream_animation(Tool.highlight(ensemble, states, 4))
+arduino.stream_animations(Abstract.highlight(ensemble, states, text, 4))
+# arduino.stream_animation(Animation([ensemble], 50, 2))
diff --git a/scripts/build_emotion.py b/scripts/emotion.py
similarity index 100%
rename from scripts/build_emotion.py
rename to scripts/emotion.py
diff --git a/scripts/play_animation.py b/scripts/play_animation.py
index 0542a88..fffbd22 100755
--- a/scripts/play_animation.py
+++ b/scripts/play_animation.py
@@ -21,6 +21,6 @@ time = args["time"]
 iter = args["iterations"]
 
 arduino = Arduino(Connection(port, baud))
-animation = Tool.create_animation(file, time, iter)
+animation = Tool.create_animation(file, "alphabet", time, iter)
 
 arduino.stream_animation(animation)
diff --git a/src/visualising/communication/arduino.py b/src/visualising/communication/arduino.py
index c79a4d3..fecbec8 100755
--- a/src/visualising/communication/arduino.py
+++ b/src/visualising/communication/arduino.py
@@ -90,3 +90,7 @@ class Arduino:
         for _ in range(animation.num_iter):
             for ensemble in animation.ensembles:
                 self.play_animation(Animation([ensemble], animation.ensemble_time, 1))
+
+    def stream_animations(self, animations):
+        for animation in animations:
+            self.stream_animation(animation)
diff --git a/src/visualising/communication/channel/connection.py b/src/visualising/communication/channel/connection.py
index c6fb34c..332fda5 100755
--- a/src/visualising/communication/channel/connection.py
+++ b/src/visualising/communication/channel/connection.py
@@ -3,10 +3,7 @@
 import time
 import serial
 
-from visualising.communication.channel.message.message import Message
 from visualising.communication.channel.message.response import Response
-from visualising.communication.channel.message.msg_frame import MsgFrame
-from visualising.communication.channel.message.msg_instr import MsgInstr
 
 
 class ArduinoException(Exception):
@@ -27,9 +24,6 @@ class Connection:
 
     # Send a message to the Arduino.
     def send_msg(self, msg):
-        if not isinstance(msg, Message):
-            raise TypeError("The parameter msg must be an object of the Message class!")
-
         for byte in msg.export_message():
             self.connection.write(byte)
 
@@ -54,12 +48,10 @@ class Connection:
     # specified. In case any response wasn't even once one of the
     # expected responses raise an exception.
     def confirm_msg(self, msg, expectations, resends):
-        if not isinstance(msg, Message):
-            raise TypeError("The parameter msg must be an object of the Message class!")
-        if not isinstance(expectations, list) or not all(isinstance(expectation, Response) for expectation in
-                                                         expectations):
-            raise TypeError("The parameter responses must be a list of objects of the Response class!")
-        if not isinstance(resends, int) or not resends > 0:
+        if not len(expectations) > 0:
+            raise ValueError("The parameter expectations must be a lister with objects of the class Response, "
+                             "the length of which must be greater than 1!")
+        if not resends > 0:
             raise ValueError("The parameter resends must be an integer greater 0!")
 
         def evaluate():
diff --git a/src/visualising/communication/channel/message/msg_frame.py b/src/visualising/communication/channel/message/msg_frame.py
index 6403697..0a0ebe3 100644
--- a/src/visualising/communication/channel/message/msg_frame.py
+++ b/src/visualising/communication/channel/message/msg_frame.py
@@ -1,29 +1,18 @@
 #!/usr/bin/env python
 
 from visualising.communication.channel.message.message import Message
-from visualising.communication.illustration.frame import Frame
 
 
 class MsgFrame(Message):
     def __init__(self, frame):
-        self._frame = frame
-
-    @property
-    def frame(self):
-        return self._frame
-
-    @frame.setter
-    def frame(self, frame):
-        if not isinstance(frame, Frame):
-            raise TypeError("The parameter frame must be an object of the Frame class!")
-        self._frame = frame
+        self.frame = frame
 
     # Creates a 50-bit frame message. The first and last bit are intended for authentication
     # as a frame message. The remaining 48 bits store exactly one frame.
     def export_message(self):
         message = [bytes('{', 'ascii')]
 
-        for pixel in self._frame.pixels:
+        for pixel in self.frame.pixels:
             r = pixel.color.r
             g = pixel.color.g
             b = pixel.color.b
diff --git a/src/visualising/communication/channel/message/msg_instr.py b/src/visualising/communication/channel/message/msg_instr.py
index 9b927ed..495e2f9 100644
--- a/src/visualising/communication/channel/message/msg_instr.py
+++ b/src/visualising/communication/channel/message/msg_instr.py
@@ -1,13 +1,12 @@
 #!/usr/bin/env python
 
 from visualising.communication.channel.message.message import Message
-from visualising.communication.illustration.animation import Animation
 
 
 class MsgInstr(Message):
     def __init__(self, instr, animation=None):
         self._instr = instr
-        self._animation = animation
+        self.animation = animation
 
     @property
     def instr(self):
@@ -19,33 +18,23 @@ class MsgInstr(Message):
             raise ValueError("Unknown instruction!")
         self._instr = instr
 
-    @property
-    def animation(self):
-        return self._animation
-
-    @animation.setter
-    def animation(self, animation):
-        if not isinstance(animation, Animation):
-            raise TypeError("The parameter animation must be an object of the Animation class!")
-        self._animation = animation
-
     # Creates a 50-bit instruction message. Since only 7 bits at most are required for the
     # actual message, most of the message consists only of zeros. The first and last bit
     # are intended for authentication as an instruction message.
     def export_message(self):
         message = [bytes('[', 'ascii'), bytes(self._instr, 'ascii')]
 
-        if self._animation is not None:
-            num_frames = len(self._animation.ensembles) * 2
+        if self.animation is not None:
+            num_frames = len(self.animation.ensembles) * 2
             message.append(num_frames.to_bytes(1, byteorder='big'))
 
-            ensemble_time_bytes = self._animation.ensemble_time.to_bytes(4, byteorder='big')
+            ensemble_time_bytes = self.animation.ensemble_time.to_bytes(4, byteorder='big')
             message.append((ensemble_time_bytes[0]).to_bytes(1, byteorder='big'))
             message.append((ensemble_time_bytes[1]).to_bytes(1, byteorder='big'))
             message.append((ensemble_time_bytes[2]).to_bytes(1, byteorder='big'))
             message.append((ensemble_time_bytes[3]).to_bytes(1, byteorder='big'))
 
-            message.append(self._animation.num_iter.to_bytes(1, byteorder='big'))
+            message.append(self.animation.num_iter.to_bytes(1, byteorder='big'))
 
             for _ in range(41):
                 message.append((0).to_bytes(1, byteorder='big'))
diff --git a/src/visualising/communication/channel/message/response.py b/src/visualising/communication/channel/message/response.py
index 30c439a..78aaeb9 100644
--- a/src/visualising/communication/channel/message/response.py
+++ b/src/visualising/communication/channel/message/response.py
@@ -4,17 +4,7 @@ class Response:
     # Generates an Arduino message, which is composed of a message byte from the Arduino
     # and a translation of the message byte.
     def __init__(self, byte):
-        self._byte = byte
-
-    @property
-    def byte(self):
-        return self._byte
-
-    @byte.setter
-    def byte(self, byte):
-        if not isinstance(byte, bytes):
-            raise TypeError("The parameter byte must be an object of the byte class!")
-        self._byte = byte
+        self.byte = byte
 
     def translate(self):
         translation = {
@@ -40,11 +30,9 @@ class Response:
         }
 
         try:
-            return translation[int.from_bytes(self._byte, byteorder='big')]
+            return translation[int.from_bytes(self.byte, byteorder='big')]
         except KeyError:
             return "Unknown response!"
 
     def compare(self, response):
-        if not isinstance(response, Response):
-            raise TypeError("The parameter response must be an object of the Response class!")
-        return bytes(self._byte) == bytes(response.byte)
+        return bytes(self.byte) == bytes(response.byte)
diff --git a/src/visualising/communication/illustration/animation.py b/src/visualising/communication/illustration/animation.py
index e622d90..3ebf280 100755
--- a/src/visualising/communication/illustration/animation.py
+++ b/src/visualising/communication/illustration/animation.py
@@ -1,33 +1,20 @@
 #!/usr/bin/env python
 
-from visualising.communication.illustration.ensemble import Ensemble
-
-
 class Animation:
+    # The ensemble time is given in milliseconds.
     def __init__(self, ensembles, ensemble_time=0, num_iter=1):
-        self._ensembles = ensembles
+        self.ensembles = ensembles
         self._ensemble_time = ensemble_time
         self._num_iter = num_iter
 
-    @property
-    def ensembles(self):
-        return self._ensembles
-
-    @ensembles.setter
-    def ensembles(self, ensembles):
-        if not isinstance(ensembles, Ensemble):
-            raise TypeError("The parameter ensembles must be an object of the Ensemble class!")
-        self._ensembles = ensembles
-
     @property
     def ensemble_time(self):
         return self._ensemble_time
 
     @ensemble_time.setter
     def ensemble_time(self, ensemble_time):
-        if not isinstance(ensemble_time, int) or not 0 <= ensemble_time <= 4294967295:
+        if not 0 <= ensemble_time <= 4294967295:
             raise ValueError("The parameter ensemble_time  must be an integer between 0 an 4294967295!")
-        # The ensemble time is given in milliseconds.
         self._ensemble_time = ensemble_time
 
     @property
@@ -36,6 +23,6 @@ class Animation:
 
     @num_iter.setter
     def num_iter(self, num_iter):
-        if not isinstance(num_iter, int) or not 1 <= num_iter <= 255:
+        if not 1 <= num_iter <= 255:
             raise ValueError("The parameter num_iter must be an integer between 1 an 255!")
         self._num_iter = num_iter
diff --git a/src/visualising/communication/illustration/color/rgb.py b/src/visualising/communication/illustration/color/rgb.py
index c874cd1..08cab69 100644
--- a/src/visualising/communication/illustration/color/rgb.py
+++ b/src/visualising/communication/illustration/color/rgb.py
@@ -15,7 +15,7 @@ class RGB(Color):
 
     @r.setter
     def r(self, r):
-        if not isinstance(r, int) or not 0 <= r <= 255:
+        if not 0 <= r <= 255:
             raise ValueError("The parameter r must be an integer between 0 and 255!")
         self._r = r
 
@@ -25,7 +25,7 @@ class RGB(Color):
 
     @g.setter
     def g(self, g):
-        if not isinstance(g, int) or not 0 <= g <= 255:
+        if not 0 <= g <= 255:
             raise ValueError("The parameter g must be an integer between 0 and 255!")
         self._g = g
 
@@ -35,7 +35,7 @@ class RGB(Color):
 
     @b.setter
     def b(self, b):
-        if not isinstance(b, int) or not 0 <= b <= 255:
+        if not 0 <= b <= 255:
             raise ValueError("The parameter b must be an integer between 0 and 255!")
         self._b = b
 
@@ -44,4 +44,4 @@ class RGB(Color):
         return self._r + self._g + self._b != 0
 
     def export_color(self):
-        return [self._r, self._g, self._b]
\ No newline at end of file
+        return [self._r, self._g, self._b]
diff --git a/src/visualising/communication/illustration/ensemble.py b/src/visualising/communication/illustration/ensemble.py
index 3e17571..69f3c53 100644
--- a/src/visualising/communication/illustration/ensemble.py
+++ b/src/visualising/communication/illustration/ensemble.py
@@ -1,29 +1,14 @@
 #!/usr/bin/env python
 
-from visualising.communication.illustration.frame import Frame
-
-
 class Ensemble:
     def __init__(self, l_frame, r_frame):
-        self._l_frame = l_frame
-        self._r_frame = r_frame
-
-    @property
-    def l_frame(self):
-        return self._l_frame
-
-    @l_frame.setter
-    def l_frame(self, l_frame):
-        if not isinstance(l_frame, Frame):
-            raise TypeError("The parameter left must be an object of the Frame class!")
-        self._l_frame = l_frame
-
-    @property
-    def r_frame(self):
-        return self._r_frame
-
-    @r_frame.setter
-    def r_frame(self, r_frame):
-        if not isinstance(r_frame, Frame):
-            raise TypeError("The parameter right must be an object of the Frame class!")
-        self._r_frame = r_frame
+        self.l_frame = l_frame
+        self.r_frame = r_frame
+
+    def replace_pixel(self, index, pixel):
+        if not 0 <= index <= 31:
+            raise ValueError("The parameter index must be an integer between 0 and 31!")
+        if index < 16:
+            self.l_frame.replace_pixel(index, pixel)
+        else:
+            self.r_frame.replace_pixel(index - 16, pixel)
diff --git a/src/visualising/communication/illustration/frame.py b/src/visualising/communication/illustration/frame.py
index bab4750..315ea42 100644
--- a/src/visualising/communication/illustration/frame.py
+++ b/src/visualising/communication/illustration/frame.py
@@ -1,9 +1,5 @@
 #!/usr/bin/env python
 
-from visualising.communication.illustration.pixel import Pixel
-from visualising.communication.illustration.color.color import Color
-
-
 class Frame:
     def __init__(self, pixels):
         self._pixels = pixels
@@ -14,18 +10,16 @@ class Frame:
 
     @pixels.setter
     def pixels(self, pixels):
-        if not isinstance(pixels, list) or not all(isinstance(pixel, Pixel) for pixel in pixels) or len(pixels) != 16:
+        if len(pixels) != 16:
             raise ValueError("The parameter pixels must be a list of exactly 16 objects of the Pixel class!")
         self._pixels = pixels
 
     def illuminated(self, index):
-        if not isinstance(index, int) or not 0 <= index <= 15:
+        if not 0 <= index <= 15:
             raise ValueError("The parameter index must be an integer between 0 and 15!")
         return self._pixels[index].color.illuminated
 
     def replace_pixel(self, index, pixel):
-        if not isinstance(index, int) or not 0 <= index <= 15:
+        if not 0 <= index <= 15:
             raise ValueError("The parameter index must be an integer between 0 and 15!")
-        if not isinstance(pixel, Pixel):
-            raise TypeError("The parameter pixel must be an object of the Pixel class!")
         self._pixels[index] = pixel
diff --git a/src/visualising/communication/illustration/pixel.py b/src/visualising/communication/illustration/pixel.py
index 2e2c975..cc811db 100644
--- a/src/visualising/communication/illustration/pixel.py
+++ b/src/visualising/communication/illustration/pixel.py
@@ -1,19 +1,5 @@
 #!/usr/bin/env python
 
-from visualising.communication.illustration.color.color import Color
-
-
 class Pixel:
     def __init__(self, color):
-        self._color = color
-
-    @property
-    def color(self):
-        return self._color
-
-    @color.setter
-    def color(self, color):
-        if not isinstance(color, Color):
-            raise TypeError("The parameter color must be an object of the Color class!")
-        self._color = color
-
+        self.color = color
diff --git a/src/visualising/expression/abstract.py b/src/visualising/expression/abstract.py
index a352fa1..9aa6fb2 100644
--- a/src/visualising/expression/abstract.py
+++ b/src/visualising/expression/abstract.py
@@ -3,12 +3,93 @@ import rospy
 import numpy as np
 
 from visualising.expression.tool import Tool
+from visualising.expression.expression import Expression
+from visualising.communication.illustration.animation import Animation
+from visualising.communication.illustration.color.rgb import RGB
 
-class Abstract:
+
+class Abstract(Expression):
     def __init__(self, arduino):
         self.arduino = arduino
         self.playback_start = 0
 
     def react(self, state):
-        if len(state[1]) > 16:
-            rospy.logwarn("Only displaying the first 16 metric aggregations!")
+        if len(state[1]) > 32:
+            rospy.logwarn("Only displaying the first 32 metric aggregations!")
+            state = state[:32]
+
+    @staticmethod
+    def cycle(state_vector):
+        ensemble = Tool.create_empty_ensemble()
+        index = 0
+        for state in state_vector:
+            color = Tool.state_to_color(state, RGB(0, 50, 0), RGB(50, 0, 0))
+            ensemble = Tool.set_pixel_color(ensemble, index, color)
+            index = index + 1
+
+        return ensemble
+
+    @staticmethod
+    def highlight(cycle, states, text, number):
+        number = min(len(states), number)
+        highlight = sorted(zip(states, range(len(states))), reverse=True)[:number]
+
+        cycle_animation = Animation([cycle], 5000, 1)
+
+        animations = [cycle_animation]
+
+        for tuple in highlight:
+            ensembles = []
+            highlight = Tool.create_empty_ensemble()
+            ring = ""
+            highlight_pixel = None
+            color = None
+            for i in range(32):
+                if tuple[1] != i:
+                    highlight = Tool.set_pixel_color(highlight, i, RGB(0, 0, 0))
+                else:
+                    highlight_pixel = i
+                    if i < 16:
+                        ring = "l"
+                        color = cycle.l_frame.pixels[i].color
+                    else:
+                        ring = "r"
+                        color = cycle.r_frame.pixels[i % 16].color
+
+                    highlight = Tool.set_pixel_color(highlight, i, color)
+
+            ensembles.append(highlight)
+            ensembles = ensembles + Abstract.write(text[highlight_pixel], ring, highlight_pixel, color)
+            animations.append(Animation(ensembles, 1000, 1))
+            animations.append(cycle_animation)
+
+        animations.append(Animation([Tool.create_empty_ensemble()], 1000, 1))
+
+        return animations
+
+    @staticmethod
+    def write(text, ring, highlight=None, color=None):
+        if not isinstance(text, str) or not text.isalpha():
+            raise ValueError("The parameter text must be a string that only contains alphabetic characters!")
+
+        text = text.upper()
+
+        ensembles = []
+        for char in text:
+            if ring == "l":
+                file = "l_" + char + ".txt"
+            elif ring == "r":
+                file = "r_" + char + ".txt"
+            else:
+                raise ValueError("The parameter index must be a string that is either l or r!")
+
+            letter = Tool.create_ensembles(file, "alphabet")
+            if highlight is not None:
+                letter = [Tool.set_pixel_color(letter[0], highlight, color)]
+            ensembles = ensembles + letter
+            if highlight is not None:
+                ensembles.append(Tool.set_pixel_color(Tool.create_empty_ensemble(), highlight, color))
+            else:
+                ensembles.append(Tool.create_empty_ensemble())
+
+        return ensembles
diff --git a/src/visualising/expression/library/alphabet/A.txt b/src/visualising/expression/library/alphabet/l_A.txt
similarity index 70%
rename from src/visualising/expression/library/alphabet/A.txt
rename to src/visualising/expression/library/alphabet/l_A.txt
index 23b7df9..fdab936 100644
--- a/src/visualising/expression/library/alphabet/A.txt
+++ b/src/visualising/expression/library/alphabet/l_A.txt
@@ -1,2 +1,2 @@
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,10,10,10
+10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10
diff --git a/src/visualising/expression/library/alphabet/B.txt b/src/visualising/expression/library/alphabet/l_B.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/B.txt
rename to src/visualising/expression/library/alphabet/l_B.txt
diff --git a/src/visualising/expression/library/alphabet/C.txt b/src/visualising/expression/library/alphabet/l_C.txt
similarity index 68%
rename from src/visualising/expression/library/alphabet/C.txt
rename to src/visualising/expression/library/alphabet/l_C.txt
index ee479a4..fa8f35a 100644
--- a/src/visualising/expression/library/alphabet/C.txt
+++ b/src/visualising/expression/library/alphabet/l_C.txt
@@ -1,2 +1,2 @@
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10
\ No newline at end of file
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/D.txt b/src/visualising/expression/library/alphabet/l_D.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/D.txt
rename to src/visualising/expression/library/alphabet/l_D.txt
diff --git a/src/visualising/expression/library/alphabet/E.txt b/src/visualising/expression/library/alphabet/l_E.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/E.txt
rename to src/visualising/expression/library/alphabet/l_E.txt
diff --git a/src/visualising/expression/library/alphabet/G.txt b/src/visualising/expression/library/alphabet/l_G.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/G.txt
rename to src/visualising/expression/library/alphabet/l_G.txt
diff --git a/src/visualising/expression/library/alphabet/H.txt b/src/visualising/expression/library/alphabet/l_H.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/H.txt
rename to src/visualising/expression/library/alphabet/l_H.txt
diff --git a/src/visualising/expression/library/alphabet/I.txt b/src/visualising/expression/library/alphabet/l_I.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/I.txt
rename to src/visualising/expression/library/alphabet/l_I.txt
diff --git a/src/visualising/expression/library/alphabet/J.txt b/src/visualising/expression/library/alphabet/l_J.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/J.txt
rename to src/visualising/expression/library/alphabet/l_J.txt
diff --git a/src/visualising/expression/library/alphabet/L.txt b/src/visualising/expression/library/alphabet/l_L.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/L.txt
rename to src/visualising/expression/library/alphabet/l_L.txt
diff --git a/src/visualising/expression/library/alphabet/M.txt b/src/visualising/expression/library/alphabet/l_M.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/M.txt
rename to src/visualising/expression/library/alphabet/l_M.txt
diff --git a/src/visualising/expression/library/alphabet/N.txt b/src/visualising/expression/library/alphabet/l_N.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/N.txt
rename to src/visualising/expression/library/alphabet/l_N.txt
diff --git a/src/visualising/expression/library/alphabet/O.txt b/src/visualising/expression/library/alphabet/l_O.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/O.txt
rename to src/visualising/expression/library/alphabet/l_O.txt
diff --git a/src/visualising/expression/library/alphabet/l_P.txt b/src/visualising/expression/library/alphabet/l_P.txt
new file mode 100644
index 0000000..91ec956
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/l_P.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/R.txt b/src/visualising/expression/library/alphabet/l_R.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/R.txt
rename to src/visualising/expression/library/alphabet/l_R.txt
diff --git a/src/visualising/expression/library/alphabet/S.txt b/src/visualising/expression/library/alphabet/l_S.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/S.txt
rename to src/visualising/expression/library/alphabet/l_S.txt
diff --git a/src/visualising/expression/library/alphabet/T.txt b/src/visualising/expression/library/alphabet/l_T.txt
similarity index 100%
rename from src/visualising/expression/library/alphabet/T.txt
rename to src/visualising/expression/library/alphabet/l_T.txt
diff --git a/src/visualising/expression/library/alphabet/l_U.txt b/src/visualising/expression/library/alphabet/l_U.txt
new file mode 100644
index 0000000..1388e68
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/l_U.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_A.txt b/src/visualising/expression/library/alphabet/r_A.txt
new file mode 100644
index 0000000..f220779
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_A.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_B.txt b/src/visualising/expression/library/alphabet/r_B.txt
new file mode 100644
index 0000000..a82ab07
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_B.txt
@@ -0,0 +1,2 @@
+10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_C.txt b/src/visualising/expression/library/alphabet/r_C.txt
new file mode 100644
index 0000000..f5d41bd
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_C.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_D.txt b/src/visualising/expression/library/alphabet/r_D.txt
new file mode 100644
index 0000000..82b9c95
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_D.txt
@@ -0,0 +1,2 @@
+10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_E.txt b/src/visualising/expression/library/alphabet/r_E.txt
new file mode 100644
index 0000000..c561035
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_E.txt
@@ -0,0 +1,2 @@
+10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,10,10,10,10,0,0,10,0,0,10,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_G.txt b/src/visualising/expression/library/alphabet/r_G.txt
new file mode 100644
index 0000000..972ec8a
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_G.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_H.txt b/src/visualising/expression/library/alphabet/r_H.txt
new file mode 100644
index 0000000..31e3acd
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_H.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_I.txt b/src/visualising/expression/library/alphabet/r_I.txt
new file mode 100644
index 0000000..a1400d2
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_I.txt
@@ -0,0 +1,2 @@
+10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,0,0,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_J.txt b/src/visualising/expression/library/alphabet/r_J.txt
new file mode 100644
index 0000000..0220442
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_J.txt
@@ -0,0 +1,2 @@
+1,1,1,1,1,1,10,10,10,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,1
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_L.txt b/src/visualising/expression/library/alphabet/r_L.txt
new file mode 100644
index 0000000..cbf17fe
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_L.txt
@@ -0,0 +1,2 @@
+10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_M.txt b/src/visualising/expression/library/alphabet/r_M.txt
new file mode 100644
index 0000000..09a6e66
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_M.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_N.txt b/src/visualising/expression/library/alphabet/r_N.txt
new file mode 100644
index 0000000..76b354c
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_N.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_O.txt b/src/visualising/expression/library/alphabet/r_O.txt
new file mode 100644
index 0000000..7a17d8b
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_O.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_P.txt b/src/visualising/expression/library/alphabet/r_P.txt
new file mode 100644
index 0000000..db065c2
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_P.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_R.txt b/src/visualising/expression/library/alphabet/r_R.txt
new file mode 100644
index 0000000..4f5be09
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_R.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,10,0,0,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_S.txt b/src/visualising/expression/library/alphabet/r_S.txt
new file mode 100644
index 0000000..57fd531
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_S.txt
@@ -0,0 +1,2 @@
+10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,10,10,10,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_T.txt b/src/visualising/expression/library/alphabet/r_T.txt
new file mode 100644
index 0000000..6f88750
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_T.txt
@@ -0,0 +1,2 @@
+10,0,0,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/alphabet/r_U.txt b/src/visualising/expression/library/alphabet/r_U.txt
new file mode 100644
index 0000000..35c20b3
--- /dev/null
+++ b/src/visualising/expression/library/alphabet/r_U.txt
@@ -0,0 +1,2 @@
+0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
\ No newline at end of file
diff --git a/src/visualising/expression/library/emotion/expression_happy.txt b/src/visualising/expression/library/emotion/expression_happy.txt
index 213cbe6..dd59d31 100644
--- a/src/visualising/expression/library/emotion/expression_happy.txt
+++ b/src/visualising/expression/library/emotion/expression_happy.txt
@@ -1,2 +1,2 @@
-50,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50
-50,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50
+50,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50,50,50,50,50
+50,0,0,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,50,50,50,50,50,50,50,50,50,50
diff --git a/src/visualising/expression/tool.py b/src/visualising/expression/tool.py
index de188c9..284b29d 100644
--- a/src/visualising/expression/tool.py
+++ b/src/visualising/expression/tool.py
@@ -122,58 +122,3 @@ class Tool:
 
         return RGB(int(color[0]), int(color[1]), int(color[2]))
 
-    @staticmethod
-    def build_state_cycle(state_vector):
-        ensemble = Tool.create_empty_ensemble()
-        pixel = 0
-        for state in state_vector:
-            color = Tool.state_to_color(state, [0, 50, 0], [50, 0, 0])
-            ensemble = Tool.set_pixel_color(ensemble, pixel, color[0], color[1], color[2])
-            pixel = pixel + 1
-
-        return ensemble
-
-    @staticmethod
-    def highlight(ensemble, states, number):
-        number = min(len(states), number)
-        highlight = sorted(zip(states, range(len(states))), reverse=True)[:number]
-
-        ensembles = [ensemble]
-        for tuple in highlight:
-            empty = Tool.create_empty_ensemble()
-            for i in range(16):
-                if ensemble.l_frame.is_colored(i):
-
-                    r = ensemble.l_frame.pixels[i].r
-                    g = ensemble.l_frame.pixels[i].g
-                    b = ensemble.l_frame.pixels[i].b
-
-                    off = [0, 0, 0]
-
-                    if tuple[1] != i:
-                        empty = Tool.set_pixel_color(empty, i, off[0], off[1], off[2])
-                    else:
-                        empty = Tool.set_pixel_color(empty, i, r, g, b)
-
-            ensembles.append(empty)
-            ensembles = ensembles + Tool.write("HALLO")
-            ensembles.append(ensemble)
-
-        ensembles.append(Tool.create_empty_ensemble())
-
-        return Animation(ensembles, 1000, 1)
-
-    @staticmethod
-    def write(text):
-        if not text.isalpha():
-            raise ValueError("Text must contain only alphabetic characters!")
-
-        text = text.upper()
-
-        ensembles = []
-        for char in text:
-            file = char + ".txt"
-            ensembles = ensembles + Tool.create_ensembles(file)
-            ensembles.append(Tool.create_empty_ensemble())
-
-        return ensembles
-- 
GitLab