import Diagrams.Prelude
import Diagrams.Backend.Cairo
import Text.Printf
type Freq = Double
diaScale :: [(String, Freq)]
diaScale = [("C",1), ("D",9/8), ("E",5/4), ("F",4/3), ("G",3/2), ("A",5/3), ("B",15/8), ("c",2)]
note :: String -> (Freq, Double) -> Diagram B
note nm (freq,y) = (rect 1e-2 1e-3 <> rect 1e-3 1e-2) ||| (topLeftText nm & scale 0.012)
& moveTo (logBase 2 freq ^& y)
mconcat [note (nm ++ printf" (%.0g Hz)" (f*264)) (f,0) | (nm,f) <- diaScale]
=== alignL (rect 1 0.02 & lwO 0)
mconcat [ note (nm++"-"++nm' ++ printf": %.2g" (f'/f)) (f'/f, logBase 2 f/10)
| (nm,f) <- diaScale, (nm',f') <- diaScale, f'>f ]
<> (ellipseXY 0.06 0.07 & lc orange & moveTo (0.14 ^& 0.05))
<> (ellipseXY 0.05 0.06 & lc orange & moveTo (0.29 ^& 0.03))
<> (ellipseXY 0.02 0.04 & lc blue & moveTo (0.41 ^& 0.03))
<> (ellipseXY 0.02 0.02 & lc red & moveTo (0.49 ^& 0.04))
<> (ellipseXY 0.02 0.04 & lc blue & moveTo (0.58 ^& 0.02))
<> (ellipseXY 0.05 0.04 & lc orange & moveTo (0.72 ^& 0.02))
<> (ellipseXY 0.05 0.04 & lc orange & moveTo (0.87 ^& 0.01))