如何使用 AudioKit Sequencer 为节拍器配置拍号?

问题描述

感谢 AudioKit!

我是 Swift 和 AudioKit 的初学者,所以这可能是一个简单的问题:

我想构建一个节拍器应用程序。从Audiokit 的新CookBook 和旧的AKmetronome() 中的示例中,我可以看到如何使用AudioKit 构建一个简单的节拍器。但我不知道如何使用复合拍号(3/8、7/8 等)演奏节拍。这里的两个例子都使用拍号 4 作为固定的底部数字,顶部数字可以改变(即我们可以有 1/4、3/4、6/4 但不能有 3/8、6/8)。>

有没有办法改变底部的数字?

AKmetronome 链接https://audiokit.io/docs/Classes/AKMetronome.html#/s:8AudioKit11AKMetronomeC5resetyyF

AudioKit Cookbook 的 Shaker 节拍器: https://github.com/AudioKit/Cookbook/blob/main/Cookbook/Cookbook/Recipes/Shaker.swift

解决方法

我对 Shaker Metronome 的代码进行了一些更改,以说明如何创建一个可以播放不同拍号(例如 6/8、5/8、7/8 等)的节拍器。

首先我向 ShakerMetronomeData 结构添加了一些信息:

enum Figure: Double {
    case quarter = 1.0
    case eighth = 0.5
}

struct ShakerMetronomeData {
    var isPlaying = false
    var tempo: BPM = 120
    var timeSignatureTop: Int = 4
    var downbeatNoteNumber = MIDINoteNumber(6)
    var beatNoteNumber = MIDINoteNumber(10)
    var beatNoteVelocity = 100.0
    var currentBeat = 0
    var figure: Figure = .quarter
    var pattern: [Int] = [4]
}

然后,播放节拍器点击的 updateSequences 函数部分将变为:

func updateSequences() {
    var track = sequencer.tracks.first!

    track.length = Double(data.timeSignatureTop)

    track.clear()
    var startTime: Double = 0.0
    for numberOfBeatsInGroup in data.pattern {
        track.sequence.add(noteNumber: data.downbeatNoteNumber,position: 0.0,duration: 0.4)
        startTime += data.figure.rawValue
        let vel = MIDIVelocity(Int(data.beatNoteVelocity))
        for beat in 1 ..< numberOfBeatsInGroup {
            track.sequence.add(noteNumber: data.beatNoteNumber,velocity: vel,position: startTime,duration: 0.1)
            startTime += data.figure.rawValue
        }
    }
}

这些将是结构中不同拍号的 figurepattern 成员的值:

/*
    Time signature  Figure    Pattern
    4/4             .quarter  [4]
    3/4             .quarter  [3]
    6/8             .eighth   [3,3]
    5/8             .eighth   [5]
    7/8             .eighth   [2,2,3]
*/

请注意,我尚未测试此代码,但它说明了如何使用复合拍号演奏节拍。

这可以通过使用三种不同的声音而不是两种来改善:一种用于每个小节的开始,一种用于每组的开始,一种用于强拍。