~hidCtrl = ( defName: \hidCtrl, // Array of HIDInfo objects devices: [], // List of HID objects. Maybe should be private later connected: List.new(), eventsMap: IdentityDictionary[ \X -> { | val | val.postln }, ], connect: { |self| self.devices.do { |hidinfo| var device = HID.open( hidinfo.vendorID, hidinfo.productID, hidinfo.path ); if(device.notNil) { self.connected.add(device); } }; }, free: { |self| if(self.connected.size > 0) { self.connected.do { |hid| hid.close }; self.connected.clear; } HIDdef(self.defName).free; }, listen: { |self| HIDdef.usage(self.defName, { |value, rawValue, usage, page, elid, ele, devid, device| var name = HIDUsage.idsToName(page, usage); var handler = self.eventsMap[name]; if(handler.notNil) { handler.(value) }; }); } );