         return s
     }
     
-    // can't type to CFString since it is not Hashable
+    // can't type Dictionary to CFString since it is not Hashable
     func getProperties(midiObject:MIDIObjectRef) -> (OSStatus, Dictionary<String, AnyObject>?) {
         var properties:Unmanaged<CFPropertyList>?
         let status = MIDIObjectGetProperties(midiObject, &properties, true)

    func MIDIPassThru(packetList: UnsafePointer<MIDIPacketList>, srcConnRefCon: UnsafeMutablePointer<Void>) -> Void {
        print("sending packets to source \(packetList)")
        MIDIReceived(virtualSourceEndpointRef, packetList)
    }
    
    //MARK: - Utilities
    

            CheckError(status)
            return "status error"
        }
        let cfstring = Unmanaged.fromOpaque(
            property!.toOpaque()).takeUnretainedValue() as CFStringRef
        if CFGetTypeID(cfstring) == CFStringGetTypeID() {
            return cfstring as String
        }
        
        return "unknown error"
    }
    
    // send directly to the midi source
    func noteOnReceive() {
        var packet       = MIDIPacket()
        packet.timeStamp = MIDITimeStamp(AudioConvertHostTimeToNanos(AudioGetCurrentHostTime()))
        packet.length    = 3
        packet.data.0    = UInt8(0x90)
        packet.data.1    = UInt8(60)
        packet.data.2    = UInt8(100)
        
        var packetlist = MIDIPacketList(numPackets: 1,
                                        packet: packet)
        let status = MIDIReceived(virtualSourceEndpointRef, &packetlist)
        if status != noErr {
            print("bad status \(status) receiving msg")
