私はEuterpeaを使用してKarplus-Strong algorithmの最も簡単なバージョンを実装しようとしています:再帰的なフィードバック - 矢印
マイコード:ホワイトノイズの 0.7秒は
burst :: AudSF() Double
burst = proc() -> do
burstEnv <- envLineSeg [1,1,0,0] [0.7, 0, 9.3] -<()
noise <- noiseWhite 42 -<()
outA -< burstEnv * noise
バースト
問題部分:
karplus :: AudSF Double Double
karplus = proc input -> do
rec filtered <- filterLowPass -< (delayed, 2000)
delayed <- delayLine 0.7 -< filtered + input
outA -< filtered + input
test1の機能は、いくつかのサイクルで10秒のファイルを作成する必要があります。
test1 = outFile "test1.wav" 10 $ burst >>> karplus
を私の知る限りは、フィードバックループが上と上とで実行する必要があります知っています。
問題は入力が遅延され、一度しかフィルタリングされないことです。それはループに再び供給されません。
私は、問題が怠惰な評価や値渡しを理解していないと思っています。
遅延評価は、プログラムが無限ループで立ち往生かどうかに影響を与えることができます。さらに、バーストの長さと遅延線を減らすことで、私は私が所望の「紐状」の音に近いものを得たと思いますしかし、あるプログラムを正常に実行するプログラムを、別のプログラムを正常に実行するプログラムに変更することはできません。プログラムが止まったのか、それとも間違っていますか? – dfeuer
@dfeuerそれは間違っています。出力信号はループに供給されません。 – Lovaz
出力が間違っている場合は、原因として怠惰を除外することができます。 – dfeuer