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