1

私はiPad用のシーケンサーを備えたドラムコンピューターで作業しています。ドラムコンピューターは問題なく動作しており、シーケンサーの作成もそれほど問題ではありませんでした。ただし、シーケンサーは現在、ストレートビートのみが可能です(各ステップの持続時間は同じです)。スイング(または一部の人がそれを呼んでいるように見えるシャッフル)オプションを追加したいのですが、その方法を理解するのに苦労しています。

  1. ウィキペディアによると「スイング」
  2. ストレートビート(ミディ、小音量)
  3. スイングで叩く(ミディ、小音量)

私が正しく理解していれば、スイングは、1-2-3-4の間の8の音符を設定可能な量でオフセットすることによってほぼ達成されます。だから代わりに

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 = 1、「無限」スイングの場合は s=2 です。おそらく、1.1 や 1.2 のような値を使用したいと思うでしょう。簡単にするために、線形補間を使用して新しい位置を決定します。(ちなみに、線形補間とそれがオーディオにどのように関係するかについては、私は小さなチュートリアルを書きました)16 の前後の時間を 2 つのセクションに分割する必要があります。 after 圧縮されます。

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

丸めをどのように扱うかはあなた次第です。明らかに、丸めのために元の値を正確に復元することはできないため、再生時にのみこれを行い、新しい値を保存したくないでしょう。

于 2012-08-01T21:56:17.010 に答える
0

ステップの数を 16 ではなく 12 に変更します。次に、各ビートは 4 ではなく 3 ステップになります。16 分音符の代わりに 3 連符。1 番目と 3 番目のトリプレットに音を乗せるとスイングします。スイングを演奏するミュージシャンは、2 番目のトリプレットも使用します。音符をオフセットしてシャッフルを作成しても、中央の 3 連符にはアクセスできません。

于 2013-08-22T15:04:00.963 に答える