- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模拟,它与从声音文件中收集的数据有关。我想运行模拟并同时播放声音文件,以查看我的数据匹配得如何。
问题是我似乎无法通过SDL.Mixer播放声音并不能同时运行Gloss模拟。这两个功能都可以正常工作。
创建模拟窗口,但未绘制任何内容,并且播放wav文件。难道是模拟模型所需的数据(onsets
)在计算上极其昂贵?它似乎根本没有得到评估。
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import GHC.Float
import Debug.Trace
import Control.Concurrent
import Control.Monad.Fix
import Control.Monad
import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Simulate
import Graphics.Gloss.Data.Color
import qualified Sound.File.Sndfile as Snd
import qualified Sound.File.Sndfile.Buffer.Vector as B
import qualified Graphics.UI.SDL as SDL
import qualified Graphics.UI.SDL.Mixer as Mix
--My own libraries
import Sound.Analysis.Spectrum
import Sound.Analysis.SpectralFlux
import Sound.Analysis.Onset
import Sound.Data.Buffers
--(TimeElapsed, ToDraw, ToBeDrawn)
type Time = Float
type DrawableOnsets = (Time, Onset, OnsetStream)
main = do
--bs holds our BufferS
(info, Just (bs :: B.Buffer Double)) <- Snd.readFile "./downtheroad.wav"
--Convert to an unboxed array
let b = sterilize bs
--Grab all of the sound file
let ct = (truncate $ (fromIntegral $ Snd.frames info)/2048)
let i = StreamInfo 1024 44100 2
let b' = sampleRawPCM 0 ct (i, b)
let s = pcmStream b'
--Very expensive computations
let freqs = freqStream s --Get frequency bins
let fluxes = fluxStream freqs --Get spectral flux
let onsets = onset fluxes --Get onsets based on spectral flux
let onsetModel = makeModel onsets
let dispWin = InWindow "Onset Test" (1440, 300) (0,0)
forkIO playSound
simulate dispWin white 45 onsetModel drawOnsets stepWorld
print "done"
playSound = do
SDL.init [SDL.InitAudio]
result <- Mix.openAudio 44100 Mix.AudioS16LSB 2 4096
toPlay <- Mix.loadWAV "./downtheroad.wav"
ch1 <- Mix.playChannel (-1) toPlay 0
fix $ \loop -> do
SDL.delay 50
stillPlaying <- Mix.numChannelsPlaying
when (stillPlaying /= 0) loop
makeModel :: OnsetStream -> DrawableOnsets
makeModel (i, os) = (0.0, Onset 0 0.0, (i, os))
drawOnsets :: DrawableOnsets -> Picture
drawOnsets (t, o, os) = translate x 50 $ color red $ circleSolid rad
where rad = (double2Float $ power o)*0.01
x = (fromIntegral $ frame o)
stepWorld :: ViewPort -> Float -> DrawableOnsets -> DrawableOnsets
stepWorld vp t' (t, o, (i, os)) = (elapsed, o', (i, os'))
where o' | elapsed > nextTime = head os
| otherwise = o
os' | (elapsed > nextTime) = tail os
| otherwise = os
elapsed = t+t'*1000
interval = (fromIntegral $ sampleRate i)/(fromIntegral $ fftWindow i)
nextTime = (fromIntegral $ frame o) * 86
evaluate
包中使用
Control.Exception
。
makeModel :: DrawableOnsets -> IO DrawableOnsets
makeModel (i, os) = do evaluate (0.0, Onset 0 0.0, os)
makeModel
和
let
的
main
声明中添加爆炸模式也是如此。
...
let !freqs = freqStream s
let !fluxes = fluxStream freqs
...
makeModel (i, !os) = (0.0, Onset 0 0.0, os)
playSound
和
simulate
都进行forkIO,则我的程序将终止,而不会播放声音或模拟。
最佳答案
您的代码不是独立的,因此我将其简化为forkIO playSound
,然后是静态图片的Gloss.display
,并遇到了相同的问题:声音正在播放,但直到停止为止,什么都不会显示。
我发现SDL-mixer仅使用了不可抢占的unsafe
外部函数。因此,我用SDL.delay 50
替换了threadDelay 50000
(在整个持续时间内阻止当前OS线程),以使调度程序有机会进行工作,然后将forkIO
更改为forkOS
,以确保对SDL的所有FFI调用均来自同一OS线程(通常是处理有状态库的一个好主意)。现在,图像立即出现,但是声音在几分之一秒后突然结束。
然后,我发现this SO answer暗示可以在Haskell GC仍在播放时释放音频块。在touchForeignPtr toPlay
之前插入threadDelay
后,一切正常。
playSound = do
SDL.init [SDL.InitAudio]
result <- Mix.openAudio 44100 Mix.AudioS16LSB 2 4096
toPlay <- Mix.loadWAV "./sound.wav"
ch1 <- Mix.playChannel (-1) toPlay 0
fix $ \loop -> do
touchForeignPtr toPlay
threadDelay 50000
stillPlaying <- Mix.numChannelsPlaying
when (stillPlaying /= 0) loop
-threaded
GHC选项)进行编译。计算密集型仿真可能会带来其他问题,我很想知道它如何为您解决问题。
关于haskell - 在使用SDL播放声音的同时使用Gloss运行模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18155302/
我正在使用 haskell 简单地实现 LOGO。 对于图形部分,我使用 Gloss,特别是 Graphics.Gloss.Interface.IO.Simulate 模块中的函数 simulateI
我想在 Haskell Gloss 中移动一个对象,每帧按下一个键,而不仅仅是开始按下键的那一帧。 (示例:按下“w”键时,每帧加速对象) 编辑:我尝试使用 EventKey 的第二个参数但无济于事。
我有一个程序可以模拟社区中许多代理的交互。我正在使用 Gloss library 为交互设置动画,代理的图片正确呈现,而不是动画。我通过生成一个模拟来为它设置动画,这是一个交互列表列表,然后我采用与动
我正在使用 Haskell 创建 RTS 游戏,但我注意到即使是一个非常简单的程序在运行时也会占用越来越多的内存。例如,以下程序将逐渐增加其内存使用量(每秒需要约 0.025mb)。 module M
在 OSX(具有 2560 x 1600 原始分辨率)上,Gloss 以 2 倍的缩放系数显示所有内容。 为 display 函数提供 300 x 300 的窗口大小会创建一个 600 x 600 的
Gloss library 使得在 Swift 中处理 JSON 变得更加容易。然而,有一个用例我无法在文档中弄清楚。假设您有一个包含对象数组的键: { "id" : 40102424,
我正在尝试为 haskell 找到一个简单的图形库,从示例中,Gloss 看起来很简单。 我举了一个非常简单的例子,但我正在努力让它工作。 import Graphics.Gloss displayI
是否可以在 Haskell 中使用 Gloss 隐藏光标?我们想用鼠标位置替换播放器。 最佳答案 光泽不会暴露此功能:如果 Internal 会更容易实现模块被暴露(通过使用例如 playWithBa
我正在调查gloss图书馆和任何理智的人一样,我对缺乏抗锯齿功能感到非常恼火。我知道一些 OpenGL 窗口提示有助于启用抗锯齿功能,尤其是 GL.lineSmooth 提示。然而,浏览 Gloss
我正在尝试在 Haskell 中制作一个 flappy 小鸟游戏,我想知道是否有办法将 .bmp 文件“编译”为二进制文件?所以我只能共享可执行文件,不需要包含 Sprite 的文件夹。 我正在使用g
我似乎无法在 haskell 上使用 gloss。我已经通过“cabal install gloss”安装了 gloss-1.8.0.1。这是我的 circle.hs 文件。 import Graph
我尝试使用 Gloss为了序列化和反序列化来自 JSON/Swift 对象的传入和传出网络数据: struct User: Decodable, Glossy { let id: Int?
我引用了以下 article .我实际需要绘制的是同心/混凝土圆圈,效果如下图所示。 我发现很难 a) 径向绘制白色条纹 b) 找到一些关键术语来搜索相关文章以进一步处理此问题。 阅读有关此内容的任何
如果您在 Stack 项目中导入 Gloss 并使用 stack ghci,您会收到以下错误: GHCi, version 7.10.2: http://www.haskell.org/ghc/ :
我正在尝试使用 Gloss 库的 play 函数,该函数采用第一个参数类型为 Event 的事件处理函数。 (根据Hackage documentation)。我正在使用 GHC 7.6.3 和 Gl
是否有使用 DBpedia JSON API 快速轻松地在 DBpedia 中查找特定 URI 的 Wikipedia gloss 文本? 例如我可以通过下载 http://dbpedia.org/d
我正在用 Gloss 替换 SwifyJSON 库。我在将 WS 响应转换为 JSON 格式时遇到问题。在 SwiftyJSON 中,我是这样做的: guard let data = response
为了弄乱 Haskell 的 Gloss 库,我写道: import Graphics.Gloss data World = World { worldBugs :: [Picture] } bug
我正在使用以下类结构: import Gloss class LMSUser: BaseResponse { public var userId:String? public var
我正在关注 this tutorial 并创建了一个包含以下内容的 demo.hs 文件: import Graphics.Gloss window :: Display window = InWin
我是一名优秀的程序员,十分优秀!