如何在Racket / gui中重复播放一首歌?

时间:2015-04-24 16:45:24

标签: audio scheme slideshow racket wav

我正在使用球拍制作幻灯片,并希望在幻灯片放映后的循环播放短歌。我目前正在使用(play-sound),但是Racket在歌曲结束时遇到了段错误,总是在不同的幻灯片上。如果我在没有声音代码的情况下运行该节目,则不会发生段错误。

我认为歌曲的结尾会导致racket / gui崩溃,循环可能会阻止这种情况发生。在节目的主要功能中播放歌曲

(define (run)
 (play-sound "path" #t)
 (slide (...)
 (run))

使歌曲连续剪切,只在前两秒左右播放,然后再重复播放。我现在在主要功能之外有播放声音线,但它确实在最后崩溃,有时在最后。我试过增加DrRacket的记忆力,但它没有帮助。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可能对RSound包感兴趣(参见http://pkgs.racket-lang.org)。与现有方法相比,该软件包具有优点和缺点。最明显的缺点是它需要您将歌曲转换为WAV。这是一些代码:

#lang racket

(require rsound)

(define ishmael (rs-read "/Users/clements/Desktop/call-me-ishmael.wav"))

(define LEAD-TIME (* 1/10 44100))

(define (play-forever sound)
  (define p (make-pstream))
  (define len (rs-frames sound))
  (let loop ([t 0])
    (pstream-queue p sound (+ t LEAD-TIME))
    (define next-t (+ t len))
    (sleep (* 1/44100 (- next-t (pstream-current-frame p))))
    (loop next-t)))

(play-forever ishmael)