音频音序器与swing(shuffle)Obj-C

时间:2012-08-01 12:39:44

标签: objective-c ipad audio

我正在使用带有音序器的电脑鼓机。鼓计算机工作正常,编写音序器也没有那么大的问题。但是,音序器目前只能进行直接拍(每一步都有相同的持续时间)。我想添加一个swing(或者像某些人似乎称之为shuffle)选项,但是我无法弄清楚如何。

  1. 'Swing' according to Wikipedia
  2. Straight beat (midi, low volume)
  3. Beat with Swing (midi, low volume)
  4. 如果我理解正确的话,通过用可配置的数量抵消1-2-3-4之间的八个音符来实现摆动。而不是

      

    1 + 2 + 3 + 4 +

    它变得像

      

    1 +2 +3 +4 +

    链接的midi文件更好地说明了这一点......

    然而,音序器使用1/16或甚至1/32步,因此如果2/8(4/16)音符被偏移,那将如何影响5/16音符。

    我可能没有以正确的方式接近这一点。有什么指针吗?

    音序器代码

    这是我如何实现音序器的基础知识。我想改变stepDuration在某些点应该给我我想要的挥杆效果,但是如何?

    #define STEPS_PER_BAR 32
    
    // thread
    - (void) sequencerLoop
    {
        while(isRunning)
        {
            NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    
            // prepare for step
            currentStep++;
            if(currentStep >= STEPS_PER_BAR * activePatternNumBars)
                currentStep = 0;
    
            // handle the step/tick
            ...
    
            //calculate the time to sleep until the next step
            NSTimeInterval stepDuration = (60.0f / (float)bpm) / (STEPS_PER_BAR / 4);
            nextStepStartTime = nextStepStartTime + stepDuration;
            NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
    
            // sleep if there is time left
            if(nextStepStartTime > now)
                [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceReferenceDate:nextStepStartTime]];
            else {
                NSLog(@"WARNING: sequencer loop is lagging behind");
            }
    
            [pool release];
        }
    }
    

    编辑:添加代码

2 个答案:

答案 0 :(得分:2)

我不熟悉iOS上的音序器,但是通常音序器将步或节拍细分为“音符”,所以这样做的方法是将不正确的音符移动到一个节拍上。播放时很少有“滴答声”。因此,如果用户编程:

1    +    2    +    3    +    4    +

不是像那样回放它,而是将任何落在“和”上的音符移动多少蜱(取决于它的确切位置,使用了多少“挥杆”,以及每次击打多少“嘀嗒”) )

1      +  2      +  3      +  4      +

很抱歉,如果这没有多大帮助,或者我只是重述这个问题,但关键是你应该能够做到这一点,可能会使用一种叫做“滴答声”的东西。您可能需要访问API的另一层才能执行此操作。

更新

所以说每节拍有32个刻度。这意味着上图中的“+”是#16号 - 这就是需要转移的内容。 (这不是很多分辨率,所以有更多的刻度更好)。

让我们调用我们移动它的数量,即“摆动因子”,s。对于无摆动,s = 1,对于“无限”摆动,s = 2。您可能希望使用类似1.1或1.2的值。为简单起见,我们将使用线性插值来确定新位置。 (作为旁注,有关线性插值以及它与音频的关系的更多信息,我写了一个little tutorial)我们需要将16之前和之后的时间分成两部分,因为之前的时间会被拉伸以及压缩之后的时间。

if( tick <= 16 )
    tick *= s; //stretch
else
    tick = (2-s)*tick + 32*(s-1) //compress

你如何应对舍入取决于你。显然,您只想在播放时执行此操作而不存储新值,因为由于四舍五入,您将无法完全恢复原始值。

答案 1 :(得分:0)

将步数改为12而不是16.然后每个节拍有3个步骤而不是4.三个而不是16个音符。把声音放在第一和第三个三连音上然后摆动。玩摇摆的音乐家也使用第二个三重奏。 抵消笔记以创建随机播放不会让您访问中间三元组。