- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在查看一些使用核心 midi 的 midi 输出示例。
和this
我在 objC 中有基于这些的代码,我现在想尝试将其转换为 swift。
我最不理解的是这一行:MIDIPacketList* pktList = (MIDIPacketList*) pktBuffer;
我将其理解为声明了一个 MIDIPacketList 类型的指针 pktlist 并为其分配了 pktBuffer 的值,转换为 MIDIPacketList 类型
我是 C 和 objC 的新手,这对我来说毫无意义。
MIDIPacketList 是一个定义的结构 here :
以何种方式将字节数组转换为结构类型 MIDIPacketList 是有意义的,这试图实现什么?我猜它正在尝试定义数据包列表的大小,但为什么我们需要在这里这样做,它是如何做到的呢?为什么仅在几行之后用 MIDIPacketListAdd 完成它是不够的?
这是我在 swift 中对 midi 输出类的尝试 - 谁能看出哪里出了问题?此代码在运行之前不会在 Xcode 中给出任何错误。我在 objC 中有这个的工作版本,但我无法获得在 swift 中定义的数据包列表的大小。 (至少我认为这是问题所在)
import Foundation
import CoreMIDI
class MidiOutClass {
var midiClient = MIDIClientRef()
var midiSource = MIDIEndpointRef()
func openOutput() {
MIDIClientCreate("MIDI client", nil, nil, &midiClient)
MIDISourceCreate(midiClient, "MIDI Source",&midiSource)
println("midi out opened")//should only do this if successful
}
func noteOn(channel: Int, note: Int, velocity:Int) {
midisend((0x90+channel), note: note, value: velocity)
}
func polyAfter(channel: Int, note: Int, value:Int) {
midisend((0xA0+channel), note: note, value: value)
}
func noteOff(channel: Int, note: Int) {
midisend((0x90+channel), note: note, value: 0 )
}
func midisend(status:Int, note: Int, value:Int) {
var packet: UnsafeMutablePointer<MIDIPacket> = nil
//var buffer = [Byte](count:1024, repeatedValue: 0)
//this is the array I'm trying to use in a similar way to the obj C.
var packetList: UnsafeMutablePointer<MIDIPacketList> = nil
let midiDataToSend:[Byte] = [Byte(status), Byte(note), Byte(value)];
packet = MIDIPacketListInit(packetList);
packet = MIDIPacketListAdd(packetList, 1024, packet, 0, 3, midiDataToSend);
if (packet == nil ) {
println("failed to send the midi.")
} else {
MIDIReceived(midiSource, packetList)
println("sent some stuff")
}
}
}//end MidiOutClass
最佳答案
我找到了答案 at this question
objC 版本中的字节数组是为 packetList 分配一些内存的讨厌的 hack
这是我修改后的代码,现在可以使用了。
func midisend(status:Int, note: Int, value:Int) {
var packet = UnsafeMutablePointer<MIDIPacket>.alloc(1)
var packetList = UnsafeMutablePointer<MIDIPacketList>.alloc(1)
let midiDataToSend:[Byte] = [Byte(status), Byte(note), Byte(value)];
packet = MIDIPacketListInit(packetList);
packet = MIDIPacketListAdd(packetList, 1024, packet, 0, 3, midiDataToSend);
if (packet == nil ) {
println("failed to send the midi.")
} else {
MIDIReceived(midiSource, packetList)
println("sent some stuff")
}
packet.destroy()
//packet.dealloc(1)
packetList.destroy()
packetList.dealloc(1)
}
然而,注释掉的dealloc似乎是不必要的,我还不确定为什么。 MIDIReceived 会处理它吗?
如果有人有更好的解决方案 - 也许根本不使用指针,请发布!
关于objective-c - 在 swift 中使用 MIDIPacketList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26494434/
我正在 iPad 上处理 Midi,一切工作正常,我可以记录传入的所有内容,并且一切都按预期工作。然而,在尝试接收长消息(即 Sysex)时,我只能收到一个最大 256 字节的数据包,之后什么也没有。
我正在查看一些使用核心 midi 的 midi 输出示例。 特别是this question 和this 我在 objC 中有基于这些的代码,我现在想尝试将其转换为 swift。 我最不理解的是这一行
我正在尝试发送包含两个数据包的 MIDIPacketList,这两个数据包描述与 x-y 样式 Controller 相关的 Controller 位置更改消息。 我尝试实现的功能采用 x 和 y 位
我是一名优秀的程序员,十分优秀!