平均律の周波数計算ツール

音階と周波数の対応表JavaScriptのコードをHaskellに移植してみました。基準周波数は、A=440Hzです。

module Main (main) where

import Control.Monad (zipWithM_)
import System (getArgs)
import Text.Printf (printf)

notes :: [String]
notes = cycle ["C", "C#/Db", "D", "D#/Eb", "E", "F", "F#/Gb",
               "G", "G#/Ab", "A", "A#/Bb", "B"]

freqs :: Integer -> [Double]
freqs octave = map f [0 .. 12]
  where
    f i = let note = fromInteger $ i + (octave + 2) * 12
          in 440 * (2.0 ** ((note - 69.0) / 12))

main :: IO ()
main = zipWithM_ (printf "%s\t=> %0.2f [Hz]\n") notes . 
         freqs . read . head =<< getArgs
-- => コマンドライン引数で3を与えた場合
--    C       => 261.63 [Hz]
--    C#/Db   => 277.18 [Hz]
--    D       => 293.66 [Hz]
--    D#/Eb   => 311.13 [Hz]
--    E       => 329.63 [Hz]
--    F       => 349.23 [Hz]
--    F#/Gb   => 369.99 [Hz]
--    G       => 392.00 [Hz]
--    G#/Ab   => 415.30 [Hz]
--    A       => 440.00 [Hz]
--    A#/Bb   => 466.16 [Hz]
--    B       => 493.88 [Hz]
--    C       => 523.25 [Hz]

参照: 平均律 - Wikipedia