سؤال

أنا أكتب برنامجا صوتيا في Haskell باستخدام Portaudio. لدي وظيفة تنشئ قائمة عينات أود اللعب، وأنا أحاول تشغيلها باستخدام المقتطف التالي داخل الرئيسي:

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

SIENWAVE هي وظيفة قمت بإنشائها لتوليد قائمة لا حصر لها من عينات Int16 من SIINWAVE بتردد محدد ومعدل عينة.

عندما أقوم بتصحيح هذا الرمز، عن طريق استبدال رمز إخراج الصوت باستخدام Putstrln، فإنه يطبع جميع 0s، وهي العينة الأولى من الوظيفة.

كيف يمكنني تكرار هذه القائمة مع وظائف إخراج الصوت؟ لا أعتقد أنه يمكنني استخدام Recursion أو خريطة.

تحرير: خطأ في نسخ الخطأ

هل كانت مفيدة؟

المحلول

استخدم Recursion:

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

نصائح أخرى

فكر في استخدام mapأبناء عمومة الأوناديك mapM/forM.

باستخدام وظائف 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))

لست على دراية ب Portaudio API، لذلك قد يوفر طريقة أكثر ملاءمة، أعلى مستوى أعلى للقيام بما تحاول تحقيقه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top