2010-02-11 70 views
1

我正在使用Portaudio在Haskell中编写音频程序。我有一个生成的样品我想打列表的功能,我想利用内幕主下面的片段,以发挥他们:迭代Haskell中的列表?

curSamps <- return (chunk 1 (sineWave 440 44100)) 
forever $ do 
    Right numSampsAvail <- getStreamWriteAvailable paStream 
    Right NoError <- writeStream paStream curSamps numSampsAvail 
    curSamps <- return (drop numSampsAvail curSamps) 

正弦波是我创建生成功能以指定的频率和采样率对正弦波的Int16样本进行无限列表。

当我调试此代码时,通过用putStrLn替换音频输出代码,它将打印所有0,这是函数的第一个样本。

如何迭代这个列表与音频输出功能?我不认为我可以使用递归或地图。

编辑:将代码复制错误

+0

你为什么认为你不能使用地图? – 2010-02-11 17:41:10

+0

不同子表达式的值是什么?即什么是10(正弦波440 44100),取10(大块1(正弦波440 44100))等? – 2010-02-11 17:53:17

+0

@Edward Amsden:顺便说一句,请在你之前的问题中留言评论http://stackoverflow.com/questions/2223866/haskell-audio-output-on-os-x描述你是否使用macports安装portaudio。这对其他人来说可能是有用的,比如当我改用雪豹时。谢谢:) – yairchu 2010-02-11 19:23:28

回答

4

使用递归:

play []  = return() 
play curSamps = do Right numSampsAvail <- getStreamWriteAvailable paStream 
        Right NoError <- writeStream paStream curSamps numSamps 
        play (drop numSampsAvail curSamps) 

main = do ... 
      play (chunk 1 (sineWave 440 44100)) 
      ... 
2

使用相同的API函数可以做到这一点:

let playSamples curSamps = do 
     Right numSampsAvail <- getStreamWriteAvailable paStream 
     Right NoError <- writeStream paStream curSamps numSampsAvail 
     playSamples (drop numSampsAvail curSamps) 
playSamples (chunk 1 (sineWave 440 44100)) 

我不熟悉的Portaudio API,所以它可能会提供一个更方便,higher-提供你想要达到的水平。

4

考虑使用map的单子表兄弟mapM/forM

+0

每个递归/循环从列表中删除可变数量的样本('drop numSampsAvail')。我认为这很难使用mapM。 – Nefrubyr 2010-02-12 10:32:57

+0

@Nefrubyr:那我们需要一个单倍折​​叠。 – Dario 2010-02-12 15:47:44