diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc
index cad48f1051ebfd8110784eea32cb581376471880..49a5d4506ca29c6354fbf38f8f532fa9954f6084 100644
--- a/src/UI/DocumentViews/AudioVisualizer.cc
+++ b/src/UI/DocumentViews/AudioVisualizer.cc
@@ -2,7 +2,7 @@
 
 using namespace Vivy;
 
-#define MAXPIXVALUE 7 // Some magix AV magic stuff
+#define PIXMULTIPLIER 4 // Some magic AV magic stuff
 
 AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentView &rootView,
                                  QWidget *parent)
@@ -19,10 +19,11 @@ AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentVie
     if (decodedData == nullptr)
         throw std::logic_error("the passed stream is not decoded");
 
-    const size_t size     = audioStream->getDecodedDataSize();
-    const size_t height   = audioStream->getDecodedChunkSize();
-    const size_t decalage = audioStream->getDecodedDecalage();
-    const size_t width    = (size - height) / decalage;
+    const size_t size       = audioStream->getDecodedDataSize();
+    const size_t height     = audioStream->getDecodedChunkSize();
+    const size_t halfHeight = size_t(height/2);
+    const size_t decalage   = audioStream->getDecodedDecalage();
+    const size_t width      = (size - height) / decalage;
     uchar *pixels =
         new uchar[static_cast<size_t>(width * height / 2 + (size - height) / decalage)]();
 
@@ -56,13 +57,31 @@ AudioVisualizer::AudioVisualizer(AudioContext::StreamPtr stream, VivyDocumentVie
             const float re     = chunkData[j * 2 + 1];
             const float mag    = sqrtf(im * im + re * re);
             const size_t index = static_cast<size_t>(j * static_cast<ulong>(width) + x);
-            pixels[index]      = static_cast<unsigned char>((mag)*MAXPIXVALUE);
+            pixels[index]      = static_cast<unsigned char>(mag);
         }
     }
 
-    QImage img = QImage(pixels, static_cast<int>(width), static_cast<int>(height / 2),
-                        static_cast<int>(width), QImage::Format_Grayscale8, pixelsDeleter, pixels)
-                     .mirrored(false, true);
+    QImage img = QImage(int(width), int(halfHeight), QImage::Format_RGB888);
+    parallel_for (int y = 0; y < int(halfHeight); y++){
+        int tempLine = y * int(width);
+        parallel_for (int x = 0; x < int(width); x++){
+            uint pixValue = pixels[tempLine + x];
+            // TODO: See if we could make this a function provided by the user if wanted, to adapt to different spectrums
+            uint pixValueAdjusted = uint(PIXMULTIPLIER * double(std::pow(pixValue/255.0, 0.3)) * 255);
+
+            uchar r,g,b;
+            b = uchar(std::min<uint>(255, pixValueAdjusted));
+            if (Q_UNLIKELY(b == 255)){
+                g = std::max<uchar>(0, uchar(std::min<uint>(255, pixValueAdjusted - 255)));
+                r = std::max<uchar>(0, uchar(std::min<uint>(255, pixValueAdjusted - 510)));
+            } else {
+                g = r = 0;
+            }
+            img.setPixel(x, y, qRgb(r, g, b));
+        }
+    }
+    img = img.mirrored(false, true);
+
     printSpectrum(img, audioStream);
 }
 
@@ -88,3 +107,5 @@ AudioVisualizer::printSpectrum(QImage pixmap, AudioContext::StreamPtr stream) no
     connect(&rootVivyDocumentView, &VivyDocumentView::assSubDocumentChanged, timingScene,
             &TimingScene::rebuildScene);
 }
+
+#undef PIXMULTIPLIER
diff --git a/src/UI/DocumentViews/AudioVisualizer.hh b/src/UI/DocumentViews/AudioVisualizer.hh
index e9b74ef5d4c0ffe1b557dbbd500f1412a8e59bb9..a2e50a2044d01c07460250846290abdea46681dc 100644
--- a/src/UI/DocumentViews/AudioVisualizer.hh
+++ b/src/UI/DocumentViews/AudioVisualizer.hh
@@ -29,10 +29,6 @@ private:
         if (ptr)
             av_rdft_end(ptr);
     };
-    static constexpr inline auto pixelsDeleter = [](void *ptr) noexcept -> void {
-        if (ptr)
-            delete[](reinterpret_cast<uchar *>(ptr));
-    };
     using FFTSamplePtr   = std::unique_ptr<FFTSample[], decltype(fftSampleDeleter)>;
     using RDFTContextPtr = std::unique_ptr<RDFTContext, decltype(rdftContextDeleter)>;