Rating:

# IceCTF 2016 – Blue Monday

## Problem

> Those who came before me lived through their vocations From the past until completion, they'll turn away no more And still I find it so hard to say what I need to say But I'm quite sure that you'll tell me just how I should feel today.

## Solution

Import the MIDI file into a `Sound[]` instance.

```mathematica

midi = Import[

"https://play.icec.tf/problem-static/blue_monday_ff0973317ee7c2df4225f994ad49bb4075546b9f20eb22bbc636be910f628bfd"]

```

![imported sound](sound.png)

Extract the notes from the `SoundNote[]` instances inside the `Sound[]`.

```mathematica

notes = midi[[1, All, 1]]

```

```

{C#5, D#7, F7, G4, C6, A#4, D#9, C5, F4, D#7, B7, C#3, D8, A3, B6, C#8, C#6,

F3, C#5, D#7, B6, D#6, C#3, G3, G#7, B6, C#8, C#5, G#4, C#3, F3, B6, E5, D#3,

G#8, F3, B6, C5, E3, A#8, A4, B6, C#7, B6, F#8, E3, A#8, D#3, F9}

```

Mathematica cannot convert notes to pitches directly. Use some code from the Mathematica StackExchange instead: [http://mathematica.stackexchange.com/a/42944/13764](http://mathematica.stackexchange.com/a/42944/13764)

```mathematica

(*Converts note string into pitch relative to middle C=0*)

stringToPitch[string_String] :=

Module[{noteValues, noteList, pitch},

noteValues = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A",

"A#", "B"};

noteList = StringCases[

string, {RegularExpression["[A-G]#?"], RegularExpression["\\d+"]}];

pitch = Position[noteValues, First[noteList]][[1, 1]] - 1;

((ToExpression[noteList[[2]]] - 4)*12) + pitch]

```

```mathematica

stringToPitch /@ notes

```

```

{13, 39, 41, 7, 24, 10, 63, 12, 5, 39, 47, -11, 50, -3, 35, 49, 25,

-7, 13, 39, 35, 27, -11, -5, 44, 35, 49, 13, 8, -11, -7, 35, 16, -9,

56, -7, 35, 12, -8, 58, 9, 35, 37, 35, 54, -8, 58, -9, 65}

```

Guess the offset for the characters. Use a `Manipulate[]` to easily try different offsets and preview the decoding. It should look like something alphanumeric if our guess is close.

```mathematica

Manipulate[

FromCharacterCode[stringToPitch /@ notes + x], {x, 11, 256 + 11, 1}]

```

![Manipulate demo](manipulate.gif)

Of course... the format is IceCTF{...}, so the first character will be "I".

```mathematica

FromCharacterCode[

stringToPitch /@ notes + ToCharacterCode["I"][[1]] - stringToPitch[First@notes]]

```

```

IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}

```

Original writeup (https://github.com/bburky/mathematica-ctf-writeups/blob/master/MIDI%20notes/).