我将向你展示我的最终问题。
我正在尝试构建一个生成一些wave并显示它的GUI应用程序。
生成声音并完成工作:
lastKarplus :: forall p. Clock p => Double -> SigFun p Double Double
lastKarplus m = proc input -> do
rec added <- delayLine (m/(rate (undefined :: p))) -< input + feedback
feedback <- fb -< added
outA -< added
是字符串函数的一部分:
string :: Clock c => Int -> SigFun c () Double
string 1 = proc flag -> do
out <- lastKarplus2 535.3 <<< burst1 535.3 -< ()
outA -< out
它产生时变的Double值。它们被馈送到傅里叶变换格式函数,这些数据被输入到我正在显示的图形
有问题的部分:
fftEx :: UISF () ()
fftEx = let graLay = makeLayout (Stretchy 200) (Stretchy 300)
in proc () -> do
rec b1value <- withDisplay (button "Reset") -< ()
b1pressed <- unique -< b1value
graphData <- fftDataGenerator -< b1pressed
_ <- realtimeGraph graLay 2 Black -< graphData
outA -< ()
fftDataGenerator :: UISF (SEvent Bool) [(Double, Time)]
fftDataGenerator = proc e -> do
d <- clockedSFToUISF 0.1 $ toFFT $ K.string 1 -< ()
let (s, fft) = unzip d
(a1, _) = unzip s
outA -< zip a1 fft
此时 fftDataGenerator 信号函数会忽略 b1pressed 事件。但我希望它表现得像这样:
我尝试在信号函数中添加状态,这些内容如下: Daniel Winograd-Cort - Effects, Asynchrony, and Choice in Arrowized Functional Reactive Programming第43页,但对我来说太过分了,我不得不说。
即使我能记住功能是否正在运行,它总是归结为从零时开始重新生成波。
我很想知道它是否可能。如果有人想看到这个“代码”的其余部分,我会提供它。