gpt4 book ai didi

objective-c - 带有摇摆(随机播放)Obj-C 的音频音序器

转载 作者:行者123 更新时间:2023-12-02 22:58:55 26 4
gpt4 key购买 nike

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

  • 'Swing' according to Wikipedia
  • Straight beat (midi, low volume)
  • Beat with Swing (midi, low volume)

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

    编辑:添加代码

    最佳答案

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

    1    +    2    +    3    +    4    +

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

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

    更新:

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

    让我们将移动它的数量称为“摆动因子”,s。对于无摆动,s = 1,对于“无限”摆动,s=2。您可能想要使用像 1.1 或 1.2 这样的值。为简单起见,我们将使用线性插值来确定新位置。 (作为旁注,关于线性插值及其与音频的关系,我写了一个 little tutorial )我们需要将 16 之前和之后的时间分成两个部分,因为之前的时间将被拉伸(stretch),而之后的时间将被压缩。
    if( tick <= 16 )
    tick *= s; //stretch
    else
    tick = (2-s)*tick + 32*(s-1) //compress

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

    关于objective-c - 带有摇摆(随机播放)Obj-C 的音频音序器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11759459/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com