使用远程IO录制设定长度的节拍器

时间:2012-05-21 15:38:36

标签: ios core-audio audioqueue remoteio

我能够创建我想要的avaudioplayer和avaudiorecorder的确切功能,但当然遇到延迟问题。因此,在阅读了网上的每篇文章并查看示例代码堆栈之后,我仍然不确定如何实现以下目标:

  1. 用户选择记录样本2个长条(每个条4个节拍)并预先滚动/计数
  2. 用户点击记录
  3. 节拍器以4拍(第一拍的重音)开始计数
  4. 应用程序会自动开始在下一个栏的开头录制
  5. 应用程序会自动关闭第3个小节结束时的录制(2个小节+前贴片)
  6. 然后,用户可以播放录制内容或将其删除并重新开始。
  7. 所以,使用avaudioplayer和avaudiorecorder,我只是使用大胆创建一个'caf',并在正确的bpm设置节拍器(为应用程序设置bpm)。然后我设置并播放avaudioplayer并使用audiodidfinishsuccessfully委托方法,执行一些逻辑来启动录音机,重启播放器,保持循环计数等以关闭录音和音频。

    正如我所提到的,我几乎能够实现我所追求的用户体验,但延迟问题是不可接受的。

    我一直在使用音频设备和远程IO,并设置了一个带回放回调和录音机回调等的项目,但现在面临着如何根据上述描述进行工作的问题。我试图为初学者制定以下内容:

    1. 如果我创建一个1拍的caf文件,我怎么能利用音频单元和远程IO播放x量的节拍然后停止?
    2. 如何进行前贴片并在4次节拍后开始录制回调
    3. 任何人都可以给我一些想法或指出我正确的方向。正如我所提到的,我已经完成了一系列研究,包括购买核心有声读物,阅读atastypixel.com上的每篇文章,timbolstad.com等,并浏览苹果文档。

      提前感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

我开始使用NSTimer。使用基于BPM(每分钟节拍数)/ 60的值。因此,如果用户想要记录带有计数的2 bar文件,可能会执行以下操作:

//timer interval=100BPM/60secs per minute
timerInterval=100/60;

    metroTimer = [NSTimer scheduledTimerWithTimeInterval:timerinterval target:self selector:@selector(blinkMetroLight) userInfo:nil repeats:YES];




 - (void)blinkMetroLight
    {

        if(beatNumber == 0)
        {
            beatNumber = 1;


        }
        else if (beatNumber == 5)
        {
            [self audioProcessorStart];
        }
        if (beatNumber == 8)
        {

                [self audioProcessorStop];
                [metroTimer invalidate]; metroTimer = nil;
        }

    beatNumber++ 
    }