1

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)

sineWave は、指定された周波数とサンプル レートで正弦波の Int16 サンプルの無限リストを生成するために作成した関数です。

このコードをデバッグすると、オーディオ出力コードを putStrLn に置き換えると、関数からの最初のサンプルであるすべて 0 が出力されます。

オーディオ出力関数を使用してこのリストを反復処理するにはどうすればよいですか? 再帰やマップは使えないと思います。

編集:コードコピーミス

4

3 に答える 3

4

mapのモナドのいとこmapM/forMを使用することを検討してください。

于 2010-02-11T17:55:48.330 に答える
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))
          ...
于 2010-02-11T17:48:53.500 に答える
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 に精通していないので、あなたが達成しようとしていることを行うためのより便利で高度な方法を提供するかもしれません。

于 2010-02-11T17:48:49.273 に答える