質問

私はPortaudioを使って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を出力します。

どのようにして、音声出力機能を備えたこのリストを反復処理することができますか?私は、再帰やマップを使用することができないと思います。

編集:コードのコピーミス

役に立ちましたか?

解決

使用再帰ます:

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))
          ...

他のヒント

mapのモナドのいとこの使用を検討して mapM / forM でます。

1はこれを行うことができ、同じ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に精通していないよ、それはあなたが達成しようとしている何をして、より便利に、より高いレベルの方法を提供することがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top