我正在使用带有音序器的电脑鼓机。鼓计算机工作正常,编写音序器也没有那么大的问题。但是,音序器目前只能进行直接拍(每一步都有相同的持续时间)。我想添加一个swing(或者像某些人似乎称之为shuffle)选项,但是我无法弄清楚如何。
如果我理解正确的话,通过用可配置的数量抵消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];
}
}
编辑:添加代码
答案 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个音符。把声音放在第一和第三个三连音上然后摆动。玩摇摆的音乐家也使用第二个三重奏。 抵消笔记以创建随机播放不会让您访问中间三元组。