Domanda

Sto scrivendo un programma audio in Haskell utilizzando PortAudio. Ho una funzione che genera un elenco di campioni che mi piacerebbe giocare, e sto cercando di giocare utilizzando il seguente frammento all'interno principale:

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

sinusoide è una funzione che ho creato per generare un elenco infinito di campioni Int16 di una sinusoide ad un tasso di frequenza e il campione specificato.

Quando il debug di questo codice, sostituendo il codice di uscita audio con un putStrLn, stampa tutti 0, che è il primo campione dalla funzione.

Come posso iterare questo elenco con le funzioni di uscita audio? Io non penso di poter utilizzare la ricorsione o di una mappa.

Modifica: Codice di copia errore

È stato utile?

Soluzione

Usa ricorsione:

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

Altri suggerimenti

Si consiglia di utilizzare i cugini monadici di map mapM / forM .

Utilizzando le stesse funzioni API si può fare questo:

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

Non ho dimestichezza con le API PortAudio, quindi potrebbe fornire una più conveniente, modo di livello più elevato di fare quello che stai cercando di raggiungere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top