diff --git a/src/spek-palette.cc b/src/spek-palette.cc
index 3c52e9a..838cee3 100644
--- a/src/spek-palette.cc
+++ b/src/spek-palette.cc
@@ -1,4 +1,5 @@
 #include <assert.h>
+#include <math.h>
 
 #include "spek-palette.h"
 
@@ -44,6 +45,37 @@ static uint32_t spectrum(double level)
     return (rr << 16) + (gg << 8) + bb;
 }
 
+// The default palette used by SoX and written by Rob Sykes.
+static uint32_t sox(double level)
+{
+    double r = 0.0;
+    if (level >= 0.13 && level < 0.73) {
+        r = sin((level - 0.13) / 0.60 * M_PI / 2.0);
+    } else if (level >= 0.73) {
+        r = 1.0;
+    }
+
+    double g = 0.0;
+    if (level >= 0.6 && level < 0.91) {
+        g = sin((level - 0.6) / 0.31 * M_PI / 2.0);
+    } else if (level >= 0.91) {
+        g = 1.0;
+    }
+
+    double b = 0.0;
+    if (level < 0.60) {
+        b = 0.5 * sin(level / 0.6 * M_PI);
+    } else if (level >= 0.78) {
+        b = (level - 0.78) / 0.22;
+    }
+
+    // Pack RGB values into a 32-bit uint.
+    uint32_t rr = (uint32_t) (r * 255.0 + 0.5);
+    uint32_t gg = (uint32_t) (g * 255.0 + 0.5);
+    uint32_t bb = (uint32_t) (b * 255.0 + 0.5);
+    return (rr << 16) + (gg << 8) + bb;
+}
+
 static uint32_t mono(double level)
 {
     uint32_t v = (uint32_t) (level * 255.0 + 0.5);
@@ -54,6 +86,8 @@ uint32_t spek_palette(enum palette palette, double level) {
     switch (palette) {
     case PALETTE_SPECTRUM:
         return spectrum(level);
+    case PALETTE_SOX:
+        return sox(level);
     case PALETTE_MONO:
         return mono(level);
     default:
diff --git a/src/spek-palette.h b/src/spek-palette.h
index b62b996..27434de 100644
--- a/src/spek-palette.h
+++ b/src/spek-palette.h
@@ -4,9 +4,10 @@
 
 enum palette {
     PALETTE_SPECTRUM,
+    PALETTE_SOX,
     PALETTE_MONO,
     PALETTE_COUNT,
-    PALETTE_DEFAULT = PALETTE_SPECTRUM,
+    PALETTE_DEFAULT = PALETTE_SOX,
 };
 
 uint32_t spek_palette(enum palette palette, double level);