gpt4 book ai didi

objective-c - 在 swift 中使用 MIDIPacketList

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:52 24 4
gpt4 key购买 nike

我正在查看一些使用核心 midi 的 midi 输出示例。

特别是this question

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com