簡體   English   中英

AudioKit:如何動態改變節奏?

[英]AudioKit: How to change tempo on the fly?

我是 AudioKit 和編程音樂應用程序的新手。 我正在構建一個節拍器應用程序並使用 AudioKit 的 AKMetronome。 我想要一個功能,用戶可以指定一系列不同節奏的節拍模式。 但是我發現使用蘋果的 DispatchQueue 是不准確的。

我正在考慮使用 AKSequencer 重寫節拍器。 有沒有辦法使用 AudioKit 的音序器即時更改速度或生成具有多個不同速度的序列? (音序器示例: https://github.com/AudioKit/Cookbook/blob/main/Cookbook/Cookbook/Recipes/Shaker.swift

metronome.tempo = 120
let first_interval = 60.0 / 120.0
let switchTime1 = DispatchTime.now() + (first_interval * 4.0)
metronome.play()

DispatchQueue.main.asyncAfter(deadline: switchTime1, execute: {
    self.metronome.tempo = 200
})

let second_inter = 60.0 / 200.0
let switchTime2 = switchTime1 + (second_inter * 8.0)

DispatchQueue.main.asyncAfter(deadline: switchTime2, execute: {
    self.metronome.tempo = 120
})

更新:

我發現您可以使用 AKMetronome.callback 將回調 function 分配給 AKMetronome。 https://audiokit.io/docs/Classes/AKMetronome.html#/s:8AudioKit11AKMetronomeC8callbackyycvp )然后您可以在新序列開始時更新速度。

一個可能的解決方案是創建一個速度軌道,其中將包含速度事件,當處理這些事件時會改變音序器的速度。

這是應該做什么的大綱:

  1. 使用AKSequenceraddTrack方法創建一個包含速度事件的軌道。 將此軌道連接到AKCallbackInstrument 請參閱此答案,了解如何將 AKCallbackInstrument 連接到 AKSequencer 軌道。
  2. 在有速度變化的時間位置將速度事件添加到軌道。 據我所知,沒有用於指示速度變化的標准 MIDI 事件(例如速度的控制變化)。 但是由於您將使用回調 function 自己解釋事件,因此使用哪種類型的事件並不重要。 我在下面解釋如何表示速度。
  3. 處理回調 function 中的事件並將 AKSequencer 的速度設置為指示的速度。

在 MIDI 事件中表示速度值有點困難,因為通常 MIDI 參數 go 從 0 到 127。我要做的是使用Note On事件,在音符的音高中我將存儲tempo div 128和音符的速度, tempo % 128 .

這就是您的回調 function 的樣子:

func tempoCallback(status:UInt8, note:MIDINoteNumber, vel:MIDIVelocity) -> () {
    guard let status = AKMIDIStatus(byte: status),
        let type = status.type,
        type == .noteOn else { return }
    let tempo: Int = note * 128 + vel
    sequencer.tempo = Double(tempo)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM