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 消息年龄有延迟的时间。
我从这里 (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 消息年龄有延迟的时间。