我希望能够从GHCI实时播放简单的[1]音频,启动和停止独立的振荡器和采样("声音")。
在Linux上使用Bash,通过扬声器传输音频非常简单[2]到pipe data into a command。
在Haskell中,我想到了以下几点:
x <- realtimeAudioSink
createVoices x [VoiceName "sinewave",VoiceName "drums"]
play x (VoiceName "sinewave") $ sinewave (Hz 440)
play x (VoiceName "sinewave") $ sinewave (Hz 220)
-- replace the earlier sinewave with a lower-frequency one
play x (VoiceName "drums")
$ asSoonAs (theTime >= floor theTime)
$ every (Seconds 10) $ soundfile "snare.wav"
-- starting on the next second, play the snare drum sample every 10 seconds
destroyVoice x (VoiceName "drums")
-- the drums stop, the sinewave keeps going
Haskell提供了大量的流媒体库。每个看起来都很难学。此外,由于需要以特定采样率进行实时操作,以及缓冲问题,音频流问题变得复杂。[/ p>
这很容易还是很难?
[1]四个正弦波和四个样本同时具有足够的带宽来探索一生。
[2]例如,如果使用ALSA,cat /dev/urandom | aplay
将发出白噪声。 (警告:它以最大音量播放。)
[3]我相信,缓冲问题来自于以下一对相反的约束:(1)如果每个样本都有自己的计算和流循环,它可能会使处理器淹没。 (或者也许它不会,如果生成的音频足够简单?)(2)如果你在发送之前一次计算的样本太多,你可能还没有及时完成它们的计算。