【问题标题】:Swift - AudioKit AKMidi to AKSequencerSwift - AudioKit AKMidi 到 AKSequencer
【发布时间】:2018-09-03 11:59:03
【问题描述】:

我目前有一个应用程序,它使用 AKKeyboard 通过振荡器创建声音。每当弹奏键盘时,我也会得到 MIDI 数据。我想做的是根据收到的 MIDI 数据创建一个 AKSequence。

任何建议或指点将不胜感激,谢谢。

这是我的部分代码:

var bank = AKOscillatorBank()
var midi: AKMIDI!
let sequencer = AKSequencer()
let sequenceLength = AKDuration(beats: 8.0)

func configureBank() {
    AudioKit.output = bank

    do {
        try AudioKit.start()
    } catch {
        AKLog("AudioKit couldn't be started")
    }

    midi = AudioKit.midi
    midi.addListener(self)
    midi.openInput()
}

// AKKeyboard Protocol methods
func noteOn(note: MIDINoteNumber) {
    let event = AKMIDIEvent(noteOn: note, velocity: 80, channel: 5)
    midi.sendEvent(event)
    bank.play(noteNumber: note, velocity: 100)
}

func noteOff(note: MIDINoteNumber) {
    let event = AKMIDIEvent(noteOff: note, velocity: 0, channel: 5)
    midi.sendEvent(event)
    bank.stop(noteNumber: note)
}

// AKMIDIListener Protocol methods..
func receivedMIDINoteOff(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
    print("ReceivedMIDINoteOff: \(noteNumber), velocity: \(velocity), channel: \(channel)")
}

【问题讨论】:

    标签: ios swift audio audiokit


    【解决方案1】:

    您实际上不需要直接从 AKMIDIEvents 构建序列。只需在调用 AKKeyboardView 的 noteOn 和 noteOff 方法时查询序列的 currentPosition,并基于此以编程方式将事件添加到音序器轨道。

    流程基本与此相同(当然是最后一步除外):https://stackoverflow.com/a/50071028/2717159

    编辑 - 获取 noteOn 和 noteOff 时间和持续时间:

    // store notes and times in a dictionary:
    var noteDict = [MIDINoteNumber: MIDITimeStamp]()
    
    // when you get a noteOn, note the time
    noteDict[currentMIDINote] = seq.currentPosition.beats
    
    // when you get a noteOff
    let endTime = seq.currentPosition.beats
    if let startTime = noteDict[currentMIDINote] {
        let durationInBeats = endTime - startTime
        // use the startTime, duration and currentMIDINote to add event to track
        noteDict[currentMIDINote] = nil
    }
    

    【讨论】:

    • 谢谢你,这个参考肯定有帮助。你能解释一下我如何用 currentPosition 计算 timeAtNoteOn 和 timeAtNoteOff 吗?我现在被困住了。
    • 另外,当我想播放音序器来听所有的 MIDI 时,我只有一两个音序器吗?我问这个是因为当我创建音序器时我必须播放它才能看到当前位置,希望从 AKKeyboard 录制 MIDI 并通过单击按钮将其回放给用户。
    • 在您的第一条评论中添加了代码。关于第二个,你可以只用一个音序器来做。只需将要写入事件的轨道的输出设置为触发外部 MIDI 事件的 AKCallbackInstrument(就像在上面的 AKKeyboardDelegate 中所做的那样)。 github.com/AudioKit/AudioKit/tree/master/Examples/iOS/… 的自述文件提供了一个设置示例。所以 AKKeyboardDelegate 方法会触发实时事件,而音序器轨道会触发录制的事件。
    • 感谢您在这方面的帮助,您真的是 AudioKit 之王。我很可能会提出另一个可能与 Audiobus 有关的问题,但现在我有一个问题(至少我认为这是一个问题)。当我查询 currentPosition.beats 时,我总是收到 0.0。
    • 我如何将 MIDITimestamp 转换为 AKDuration?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多