我正在使用现有应用(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消息是否应由多个数据条目构成?
答案 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消息少。