<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div>Vivid has combinators to schedule music with sample-accurate timing (it's as simple as prepending e.g. "doScheduledIn 0.2" to any VividAction, where 0.2 is 0.2 seconds from now - everything will be precise relative to that start time). "doScheduledAt" is another useful one. You can also write to a file with precise timing by prepending e.g. 'writeNRT "foo.wav"'.</div><div><br></div><div>Still, I'd be curious to know  the more-general answer to the question of how accurate we can expect forkIO and threadDelay to be, under normal load. E.g. how often/by how much does threadDelay take longer than needed to wake? To my ears and a few quick tests it's usually surprisingly good.</div><div><br></div><div>Tom</div><div><br>El 2 jul 2018, a las 19:26, Jeffrey Brown <<a href="mailto:jeffbrown.the@gmail.com">jeffbrown.the@gmail.com</a>> escribió:<br><br></div><blockquote type="cite"><div><div dir="ltr"><div>I just discovered Tom Murphy's Vivid-Synth[1], a Haskell library that lets you control SuperCollider. (A few very slight changes allowed me to get it to work in Stack instead of Cabal, as described here[2,3].)</div><div><br></div><div>TidalCycles[4] also controls SuperCollider from Haskell. It does tortuous backflips to hand the timing job over to SuperCollider. If I recall correctly, that was because SC's timing was more solid than Haskell's.</div><div><br></div><div>I modified the Vivid demo to go faster and have a few more voices[5], and tried running it at the same time as Spotify and Youtube and apt upgrade and loading LibreOffice and playing some music in VLC, and I detected (by ear) no timing errors.</div><div><br></div><div>Can I expect GHC's maybe-new rhythmic stability to hold up?</div><div><br></div><div>[1] <a href="http://www.vivid-synth.com/">http://www.vivid-synth.com/</a></div><div>[2] <a href="https://github.com/vivid-synth/vivid/issues/5">https://github.com/vivid-synth/vivid/issues/5</a></div><div>[3] <a href="https://github.com/JeffreyBenjaminBrown/vivid/commit/3d25266d4495d9dd8e573f30e819e8ebeffc3f88">https://github.com/JeffreyBenjaminBrown/vivid/commit/3d25266d4495d9dd8e573f30e819e8ebeffc3f88</a></div><div>[4] <a href="https://tidalcycles.org/">https://tidalcycles.org/</a></div><div>[5] <a href="https://github.com/JeffreyBenjaminBrown/vivid/blob/jbb/jbb/sine.hs">https://github.com/JeffreyBenjaminBrown/vivid/blob/jbb/jbb/sine.hs</a></div><div><br></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Jeff Brown | Jeffrey Benjamin Brown</div><div dir="ltr"><a href="https://msu.edu/~brown202/" style="font-size:12.8px" target="_blank">Website</a>   |   <a href="https://www.facebook.com/mejeff.younotjeff" style="font-size:12.8px" target="_blank">Facebook</a>   |   <a href="https://www.linkedin.com/in/jeffreybenjaminbrown" style="font-size:12.8px" target="_blank">LinkedIn</a><span style="font-size:12.8px">(spammy, so I often miss messages here)   </span><span style="font-size:12.8px">|</span><span style="font-size:12.8px">   </span><a href="https://github.com/jeffreybenjaminbrown" style="font-size:12.8px" target="_blank">Github</a><span style="font-size:12.8px">   </span></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
</div></blockquote></body></html>