Patrzę na niektóre przykłady midi wyjścia za pomocą rdzenia midi.Używanie MIDIPacketList w swift
Konkretnie this question
i this
Mam kod, który działa w oparciu o te w objc i teraz chcę spróbować przetłumaczyć, że do szybkich.
linia ja przynajmniej zrozumieć jest to jedno: MIDIPacketList* pktList = (MIDIPacketList*) pktBuffer;
czytałem to jako uznająca pktlist wskaźnik typu MIDIPacketList i przypisując mu wartość pktBuffer, oddanych do typu MIDIPacketList
jestem nowy do C i objC, a to nie ma dla mnie sensu.
MIDIPacketList jest struct zdefiniowane here:
w jaki sposób ma to sensu rzucać ByteArray do typu struct MIDIPacketList i jaka jest ta stara się osiągnąć? Domyślam się, że próbuje zdefiniować rozmiar listy pakietów, ale dlaczego musimy to zrobić tutaj i jak to się dzieje? dlaczego nie wystarczy zrobić z MIDIPacketListAdd, jak dzieje się kilka linii później?
Oto moja próba wykonania klasy midi w szybkim tempie - czy ktoś może zobaczyć, co się dzieje? ten kod nie powoduje żadnych błędów w Xcode, dopóki nie zostanie uruchomiony. Mam działającą wersję tego w objC, ale nie mogę uzyskać rozmiaru listy pakietów zdefiniowanej w swift. (Przynajmniej myślę, że to problem)
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
doc dla zniszczyć () func mówi: "Zniszcz obiekt, na który wskazuje wskaźnik". Więc nie potrzebujesz dealloc, ponieważ niszczyciel to robi. Ponadto, nie sądzisz: var pakiet = UnsafeMutablePointer .alloc (sizeof (MIDIPacket)) byłby lepszy? –
@GeneDeLisa Myślę, że parametr dla metody alloc jest liczbą obiektów, a nie bajtem. Nie wiem, w jaki sposób mógłby znać rozmiar pakietu. O ile mogę powiedzieć, przydziela więcej pamięci, niż myśli, że będziesz potrzebować, a nie dokładnie poprawną kwotę. Tak więc jest to odpowiednik bytearray w przykładzie objC. Jestem początkującym, więc mogłem źle zrozumieć. – Thomas
Nie wiedziałem o zniszczeniu obejmującym dealloc. Widziałem przykłady, w których oba zostały wyraźnie nazwane tak, jak ja tutaj. – Thomas