2010-02-11 69 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