midi 包列表不会更改时间戳

midi packet list dose not change timestamp

我从这里 (Using MIDIPacketList in swift) 得到了这段代码,但我不能私信用户或对那个问题发表评论,所以我会问我的问题。 @ephemer dude 如果你看到我的问题,我喜欢你在 midi 列表上的代码并且它工作得很好,但是当我更改时间戳时,没有任何反应,它必须产生一些延迟但它与 0 时间戳相同。 有谁知道如何解决这个问题?

以及我如何从这个扩展中获得时间戳以在 MIDI 事件中使用它,我希望能够为每个 MIDI 事件更改时间戳, 在这里:

 var packets = MIDIPacketList(midiEvents: [[0x90, 60, 100]])

 public typealias MidiEvent = [UInt8]

 extension MIDIPacketList {

    init(midiEvents: [MidiEvent]) {

    let timestamp = MIDITimeStamp(0) // do it now
    let totalBytesInAllEvents = midiEvents.reduce(0) { total, event in
        return total + event.count
    }

    // Without this, we'd run out of space for the last few MidiEvents
    let listSize = MemoryLayout<MIDIPacketList>.size + totalBytesInAllEvents

    // CoreMIDI supports up to 65536 bytes, but in practical tests it seems
    // certain devices accept much less than that at a time. Unless you're
    // turning on / off ALL notes at once, 256 bytes should be plenty.
    assert(totalBytesInAllEvents < 256,
           "The packet list was too long! Split your data into multiple lists.")

    // Allocate space for a certain number of bytes
    let byteBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: listSize)

    // Use that space for our MIDIPacketList
    self = byteBuffer.withMemoryRebound(to: MIDIPacketList.self, capacity: 1) { packetList -> MIDIPacketList in
        var packet = MIDIPacketListInit(packetList)
        midiEvents.forEach { event in
            packet = MIDIPacketListAdd(packetList, listSize, packet, timestamp, event.count, event)
        }

        return packetList.pointee
    }

    byteBuffer.deallocate() // release the manually managed memory
 }
}

 // to send use this

 var packets = MIDIPacketList(midiEvents: [[0x90, 60, 100]])

 MIDISend(clientOutputPort, destination, &packetList)

我弄明白了,它应该如何工作,但不太正确。 根据苹果文档,它必须使用 mach_absolute_time() 。 所以我用了它,但我不知道如何使用 mach_absolute_time() 正常工作。如果有人知道,请也告诉我。 如果我使用 var timestamp = mach_absolute_time()+1000000000 它将延迟 1 分钟或 so.if 我将 1000000000 更改为任何低于此的数字,不会造成延迟。 有谁知道如何使用 mach_absolute_time()? 我在 mach_absolute_time() 上看到了一些代码,但他们将其用作计时器,它是一个从第一次启动开始就给出时间的计时器,但是如何将时间作为 mach_absolute_time() 来使用midi 时间戳。

我找到了答案。

将时间戳设置为:

var delay = 0.2

var timestamp: MIDITimeStamp = mach_absolute_time() + MIDITimeStamp(delay * 1_000_000_000)

延迟是您希望 MIDI 消息年龄有延迟的时间。