2010-02-11 3 views
1

Я пишу аудиопрограмму в Haskell, используя Portaudio. У меня есть функция, которая генерирует список образцов, которые я хотел играть, и я пытаюсь воспроизвести их, используя следующий фрагмент кода внутри основной:Итерации над списком в haskell?

curSamps <- return (chunk 1 (sineWave 440 44100)) 
forever $ do 
    Right numSampsAvail <- getStreamWriteAvailable paStream 
    Right NoError <- writeStream paStream curSamps numSampsAvail 
    curSamps <- return (drop numSampsAvail curSamps) 

синусоиды функции Я создал для генерации бесконечный список образцов Int16 синусоиды с заданной частотой и частотой дискретизации.

Когда я отлаживаю этот код, заменяя код вывода звука на putStrLn, он печатает все 0s, что является первым образцом функции.

Как я могу перебирать этот список с помощью функций вывода звука? Я не думаю, что могу использовать рекурсию или карту.

Edit: Код копирование ошибка

+0

почему вы думаете, что не можете использовать карту? –

+0

Каковы значения различных подвыражений? То есть что требуется 10 (sineWave 440 44100), возьмите 10 (кусок 1 (sineWave 440 44100)) и т. д.? –

+0

@Edward Amsden: Кстати, пожалуйста, оставьте комментарий в своем предыдущем вопросе http://stackoverflow.com/questions/2223866/haskell-audio-output-on-os-x, описывающий, был ли установлен portaudio с использованием macports или нет. что может быть полезно для других, таких как я, когда я переключаюсь на снежного барса. thanks :) – yairchu

ответ

4

Использование рекурсии:

play []  = return() 
play curSamps = do Right numSampsAvail <- getStreamWriteAvailable paStream 
        Right NoError <- writeStream paStream curSamps numSamps 
        play (drop numSampsAvail curSamps) 

main = do ... 
      play (chunk 1 (sineWave 440 44100)) 
      ... 
2

Используя ту же функцию API можно это сделать:

let playSamples curSamps = do 
     Right numSampsAvail <- getStreamWriteAvailable paStream 
     Right NoError <- writeStream paStream curSamps numSampsAvail 
     playSamples (drop numSampsAvail curSamps) 
playSamples (chunk 1 (sineWave 440 44100)) 

Я не знаком с API Portaudio, так что это может обеспечить более удобным, более высокий что вы пытаетесь достичь.

4

Рассмотрите возможность использования map «s монадических кузенов mapM/forM.

+0

Каждая рекурсия/цикл выпадает из списка количество переменных из набора ('drop numSampsAvail'). Я думаю, что это затрудняет использование mapM. – Nefrubyr

+0

@Nefrubyr: Нам нужна монадическая складка. – Dario