 
     /* TODO Add, if needed, like this:
     public var name: String? {
-        get { string(forProperty: kMIDIPropertyName) }
-        set { set(string: newValue, forProperty: kMIDIPropertyName) }
-    }
+        get { self[kMIDIPropertyName] }
+        set { self[kMIDIPropertyName] = newValue }
+    }
+
      */
 
 }


        // Immediately fetch the object's uniqueID, since it could become
        // inaccessible later, if the object is removed from CoreMIDI
        cachedUniqueID = int32(forProperty: kMIDIPropertyUniqueID) ?? 0
    }

    private var cachedUniqueID: MIDIUniqueID?
    public var uniqueID: MIDIUniqueID {
        get {
            switch cachedUniqueID {
            case .none:
                let value = int32(forProperty: kMIDIPropertyUniqueID) ?? 0
                cachedUniqueID = value
                return value
            case .some(let value):
                return value
            }
        }
        set {
            if cachedUniqueID != .some(newValue) {
                set(int32: newValue, forProperty: kMIDIPropertyUniqueID)
                cachedUniqueID = .none
            }
        }

    private var cachedName: String??
    public var name: String? {
        get {
            if let value = cachedName { return value }
            else {
                let value: String? = self[kMIDIPropertyName]
                cachedName = .some(value)
                return value
            }
        }
        set {
            if cachedName != .some(newValue) {
                self[kMIDIPropertyName] = newValue
                cachedName = .none
            }
        }
