1

我正在为 iPad 开发带有音序器的鼓计算机。鼓计算机工作得很好,编写音序器也不是什么大问题。但是,音序器目前只能进行直拍(每个步进的持续时间相同)。我想添加一个摇摆(或某些人似乎称之为随机播放)选项,但我无法弄清楚如何。

  1. 根据维基百科的“摇摆”
  2. 直拍(中、低音量)
  3. 用 Swing 节拍(中、低音量)

如果我理解正确的话,摇摆几乎是通过以可配置的数量抵消 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];
    }
}

编辑:添加代码

4

2 回答 2

2

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

1    +    2    +    3    +    4    +

不是像那样播放它,而是将落在“and”上的任何音符向后移动多少个滴答声(取决于它落在哪里,使用了多少“摇摆”,以及每个节拍有多少个“滴答声”)

1      +  2      +  3      +  4      +

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

更新:

所以说每拍有 32 个滴答声。这意味着上图中的“+”是第 16 号刻度——这就是需要移动的地方。(这并不是真正的分辨率,所以有更多的刻度会更好)。

让我们将移动它的数量称为“摆动因子”,s。对于无摆动,s = 1,对于“无限”摆动,s=2。您可能想要使用像 1.1 或 1.2 这样的值。为简单起见,我们将使用线性插值来确定新位置。(作为旁注,关于线性插值以及它如何与音频相关的更多信息,我写了一个小教程)我们需要将 16 点之前和之后的时间分成两部分,因为之前的时间将被拉伸,而时间after 将被压缩。

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

如何处理舍入取决于您。显然,您只想在播放时执行此操作,而不是存储新值,因为由于舍入,您将无法准确恢复原始值。

于 2012-08-01T21:56:17.010 回答
0

将步数更改为 12 而不是 16。然后每个节拍有 3 步而不是 4。三连音而不是 16 分音符。将声音放在第一个和第三个三连音上,它就会摆动。演奏摇摆乐的音乐家也使用第二个三连音。偏移音符以创建随机播放不会让您访问中间三连音。

于 2013-08-22T15:04:00.963 回答