由于AKMIDIEvent数据包的长度,未触发AKMIDIListener

时间:2019-05-26 05:34:23

标签: swift audiokit

我正在使用现有应用(Midi Link Sync)将MIDI时钟数据发送到我单独的AudioKit iOS应用。

AudioKit 不会提取消息,但是AKMIDIListener不会触发。

AKMIDIListener从游乐场演示中按原样实现:link

这是因为在_AKMIDI+Receiving.swift_ file, the handleMIDIMessage function is not called (line 155) due to the event status & command being nil中。

  

错误触发发生在 AKMIDIEvent.swift 的第69-70行(请参见   AudioKit master上的源代码)。   在我这端,通过MIDI链接发送的带有MIDI时钟的数据包   同步应用包含一个数据条目:0xF8(时钟)。第69行强制执行   数据长度应> 1而不是> = 1。

这是AudioKit框架的错误吗?还是默认情况下,MIDI消息是否应由多个数据条目构成?

1 个答案:

答案 0 :(得分:1)

您应该签出AKMIDITempoListener。它是处理时钟事件的辅助对象。此辅助对象通过观察时钟消息来确定速度,并为观察时钟消息事件和速度事件提供了一些便利。它可用于观察时钟量子事件和节拍事件(24个时钟滴答),量子事件(6个时钟滴答),速度事件,开始/继续和停止事件。它还可以用于将开始与下一个时钟事件同步。

您可以通过打开位于AudioKit中的MacOS开发项目来查看我的测试用法示例⁩▸⁨开发人员▸⁨macOS⁩▸⁨macOSDevelopment⁩。然后打开“ MIDI Connection Manger.swift”。

public let tempoListener = AKMIDITempoListener(smoothing: 0.98, bpmHistoryLimit: 1)

init() {
    midi.addListener(tempoListener)
    tempoListener.clockListener?.addObserver(self)
    tempoListener.addObserver(self)
}

然后在文件的最下方有扩展名来接收事件:

extension MIDIConnectionManger: AKMIDIBeatObserver {

    func preparePlay(continue: Bool) {
        debugPrint("MMC Start Prepare Play")
    }

    func startFirstBeat(continue: Bool) {
        debugPrint("MMC Start First Beat")
    }

    func stopSRT() {
        debugPrint("MMC Stop")
    }

    func receivedBeatEvent(beat: UInt64) {

    }

    func receivedQuantum(quarterNote: UInt8, beat: UInt64, quantum: UInt64) {

    }

    func receivedQuarterNoteBeat(quarterNote: UInt8) {
        //debugPrint("Quarter Note: ", quarterNote)
    }
}

如果您只关心时钟事件,则可能只想着重于ReceivedQuantum函数。主要的Midi侦听器非常关注midi音符事件,而这种情况要比单字节midi消息少。