Question

Je suis en train d'écrire un programme audio en Haskell à l'aide de Portaudio.J'ai une fonction qui génère une liste d'échantillons que j'aimerais jouer, et je suis en train de lire à l'aide de l'extrait de code suivant à l'intérieur:

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

onde sinusoïdale est une fonction que j'ai créé pour générer une liste infinie de Int16 des échantillons d'une onde sinusoïdale à une fréquence spécifiée et le taux d'échantillonnage.

Quand je debug ce code, en remplaçant la sortie audio de code avec un putStrLn, il imprime toutes les 0s, qui est le premier exemple de la fonction.

Comment puis-je effectuer une itération sur cette liste avec la sortie audio fonctions?Je ne pense pas que je peux utiliser la récursivité ou une carte.

Edit:Code d'erreur de transcription

Était-ce utile?

La solution

Utilisation récursion:

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))
          ...

Autres conseils

Pensez à utiliser map's monadique cousins mapM/forM.

En utilisant les mêmes fonctions API, on peut faire ceci:

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

Je ne suis pas familier avec l'API Portaudio, de sorte qu'il pourrait fournir un plus moyen pratique plus haut niveau de faire ce que vous essayez d'atteindre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top