2010-02-11 4 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이 인쇄됩니다.

이 목록을 오디오 출력 기능으로 반복 할 수 있습니까? 나는 재귀 나지도를 사용할 수 있다고 생각하지 않는다.

편집 : 하나이 할 수있는 동일한 API 함수를 사용하여 코드 복사 실수

+0

왜지도를 사용할 수 없다고 생각하십니까? –

+0

다른 하위 표현식의 값은 무엇입니까? 나는. 10 (sineWave 440 44100), 10 (청크 1 (sineWave 440 44100)) 등을 취합니다. –

+0

@Edward Amsden : btw, macports를 사용하여 portaudio를 설치했는지 여부를 설명하는 이전 질문 (http://stackoverflow.com/questions/2223866/haskell-audio-output-on-os-x)에 의견을 남기십시오. 눈 표범으로 바꿀 때 나 같은 다른 사람들에게 유용 할 수 있습니다. thanks :) – yairchu

답변

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

: 그것은 더 편리를 제공 할 수 있도록

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에 익숙하지 않다가, 상위 - 당신이 달성하고자하는 일을하는 수준 높은 방법.

4

map의 모나드 사촌 mapM/forM을 사용하는 것이 좋습니다.

+0

각 반복/루프는 목록에서 다양한 수의 샘플을 삭제합니다 ('drop numSampsAvail'). MapM을 사용하기가 어렵다고 생각합니다. – Nefrubyr

+0

@Nefrubyr : 그럼 우리는 모나드 배가 필요합니다. – Dario