gpt4 book ai didi

haskell - 使 Haskell 代码更加地道(440 Hz 音调)

转载 作者:行者123 更新时间:2023-12-04 23:58:36 26 4
gpt4 key购买 nike

这就是我所拥有的。它生成 5 秒 Au file具有 440 Hz 正弦波,灵感来自 this question .

-- file: tone.hs

import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BLC
import Data.Binary.Put

-- au format header: https://en.wikipedia.org/wiki/Au_file_format
header :: Double -> Integer -> Integer -> Put
header dur rate bps = do
putLazyByteString $ BLC.pack ".snd"
putWord32be 24
putWord32be $ fromIntegral $ floor $ fromIntegral bps * dur * fromIntegral rate
putWord32be 3
putWord32be $ fromIntegral rate
putWord32be 1


-- audio sample data
samples :: Double -> Integer -> Integer -> Double -> Double -> Put
samples dur rate bps freq vol =
foldl1 (>>) [put i | i <- [0..numSamples-1]]
where
numSamples = floor $ fromIntegral rate * dur
scale i = 2 * pi * freq / fromIntegral rate * fromIntegral i
sample i = vol * sin (scale i)
coded samp = floor $ (2 ^ (8*bps-1) - 1) * samp
put i = putWord16be $ coded $ sample i


freq = 440 :: Double -- 440 Hz sine wave
dur = 5 :: Double -- played for 5 seconds
rate = 44100 :: Integer -- at a 44.1 kHz sample rate
vol = 0.8 :: Double -- with a peak amplitude of 0.8
bps = 2 :: Integer -- at 16 bits (2 bytes) per sample

main =
BL.putStr $ runPut au
where
au = do
header dur rate bps
samples dur rate bps freq vol

如果您运行的是 Linux,您可以通过 runghc tone.hs | aplay 收听.对于其他操作系统,您可能可以将输出重定向到 .au文件并在音频播放器中播放。

我怎样才能使这段代码更地道?例如:
  • 我写了 fromIntegral到处都是。我能避免吗?
  • 我应该/可以使用不同的包来输出二进制数据吗?
  • 我使用的是合理的类型吗?
  • 最佳答案

    这里没有什么不好的。 foldl1 (>>) [put i | i <- [0..numSamples-1]]相当于 mapM_ put [0 .. numSamples-1] . Rate 应该只是一个 Double ,这让您摆脱了 fromIntegral s。
    Data.Binary.Put对于二进制输出来说真的很好。有人可能会质疑立即将样本写入 monad 是否好(将它们作为可直接访问的浮点值保存在某个合适的容器(如 Data.Vector.Storable 的块)中可能更灵活,并且只有 put 它们最后来自一些通用函数),但在性能方面,您的方法实际上非常有效。因为它不是 IO在您的使用中,您始终可以以安全、纯净的方式取回数据。

    关于haskell - 使 Haskell 代码更加地道(440 Hz 音调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438659/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com