AKMIDIListener无法接收SysEx数据。

8

我正在使用AudioKit的AKMIDIListener协议来监听MIDI消息的一个类。对于像Note On这样的标准消息,这很好用,但是SysEx消息没有传递。

func receivedMIDINoteOn(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
    NSLog("Note On \(noteNumber), \(velocity), \(channel)") // works perfectly
}
func receivedMIDISystemCommand(_ data: [MIDIByte]) {
    NSLog("SysEx \(data)") // never triggers

    // More code to handle the messages...
}

SysEx消息是从外部硬件或测试软件发送的。我使用了MIDI监视应用程序来确保消息被正确发送,但在我的应用程序中它们没有触发receivedMIDISystemCommand

是否需要执行其他步骤才能接收SysEx消息?

提前感谢您提供任何线索。

1个回答

0

编辑:感谢您提醒我们。SysEx接收问题现已在AudioKit的develop分支中得到修复:https://github.com/AudioKit/AudioKit/pull/1017

--

不要使用

NSLog("SysEx \(data)")

你试过了吗?
if let sysExCommand = AKMIDISystemCommand(rawValue: data[0]) {
   print("MIDI System Command: \(sysExCommand)")
}

AKMIDISystemCommand将把您的SysEx数据转换为更易用的格式,并定义如下:

public enum AKMIDISystemCommand: MIDIByte {
    /// Trivial Case of None
    case none = 0
    /// System Exclusive
    case sysex = 240
    /// Song Position
    case songPosition = 242
    /// Song Selection
    case songSelect = 243
    /// Request Tune
    case tuneRequest = 246
    /// End System Exclusive
    case sysexEnd = 247
    /// Clock
    case clock = 248
    /// Start
    case start = 250
    /// Continue
    case `continue` = 251
    /// Stop
    case stop = 252
    /// Active Sensing
    case activeSensing = 254
    /// System Reset
    case sysReset = 255
}

-- matthew @ audiokit


1
我已经编写了必要的代码来检查第一个字节是否为0xF0,并适当处理所有其他字节。有趣的是,提到的 NSLog("SysEx \(data)") 根本没有触发。没有任何日志记录,这表明 receivedMIDISystemCommand 从未运行。感谢您的建议,使用 AKMIDISystemCommand 肯定会使我的代码更加简洁。 - Oscar
@Oscar - 感谢您向我们提出此问题。我们正在努力解决。 - analogcode
3
我们在这个拉取请求中修复了这个问题,所以它已经在 develop 分支上得到了解决并将会在下一个版本中发布:https://github.com/AudioKit/AudioKit/pull/1017 - Aurelius Prochazka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接