diff -ru audicle-1.0.0.7.orig//lang/chuck-1.2.1.3/src/util_hid.cpp audicle-1.0.0.7/lang/chuck-1.2.1.3/src/util_hid.cpp
--- audicle-1.0.0.7.orig//lang/chuck-1.2.1.3/src/util_hid.cpp	2012-03-17 10:23:39.000000000 +0100
+++ audicle-1.0.0.7/lang/chuck-1.2.1.3/src/util_hid.cpp	2012-03-17 10:25:03.000000000 +0100
@@ -7392,14 +7392,139 @@
 int WiiRemote_send( const HidMsg * msg ){ return -1; }
 const char * WiiRemote_name( int wr ){ return NULL; }
 
+#define SYSFS_TILTSENSOR_FILE "/sys/devices/platform/applesmc/position"
+#define TILTSENSOR_BUF_LEN 32
+
+static struct t_TiltSensor_data
+{
+	union
+	{
+		struct t_macbook
+		{
+			int x;
+			int y;
+			int z;
+		} macbook;
+	} data;
+	int dataType;
+	int detected;
+	int refcount;
+
+	t_TiltSensor_data()
+	{
+		refcount = 0;
+		dataType = -1;
+		detected = 0;
+	}
+
+} TiltSensor_data;
+enum
+{
+	linuxAppleSMCMacBookDataType
+};
+static int TiltSensor_detect()
+{
+	int fd;
+
+	fd = open(SYSFS_TILTSENSOR_FILE, O_RDONLY);
+
+	if (fd > 0)
+	{
+		TiltSensor_data.dataType = linuxAppleSMCMacBookDataType;
+		TiltSensor_data.detected = 1;
+		close(fd);
+		return 1;
+	}
+
+	TiltSensor_data.detected = -1;
+
+	return 0;
+}
+
+static int TiltSensor_do_read()
+{
+
+	switch(TiltSensor_data.dataType)
+	{
+		case linuxAppleSMCMacBookDataType:
+			char buf[TILTSENSOR_BUF_LEN];
+			int ret, fd;
+			fd = open(SYSFS_TILTSENSOR_FILE, O_RDONLY);
+
+			if (fd < 0) {
+				return -1;
+			}
+			ret = read(fd, buf, TILTSENSOR_BUF_LEN);
+			if (ret < 0) {
+				close(fd);
+				return -1;
+			}
+			if (sscanf(buf, "(%d,%d,%d)\n", &TiltSensor_data.data.macbook.x, &TiltSensor_data.data.macbook.y, &TiltSensor_data.data.macbook.z) != 3) {
+				close(fd);
+				return -1;
+			}
+			close(fd);
+			break;
+		default:
+			return 0;
+	}
+	return 1;
+}
 void TiltSensor_init(){}
 void TiltSensor_quit(){}
 void TiltSensor_probe(){}
-int TiltSensor_count(){ return 0; }
-int TiltSensor_open( int ts ){ return -1; }
-int TiltSensor_close( int ts ){ return -1; }
-int TiltSensor_read( int ts, int type, int num, HidMsg * msg ){ return -1; }
-const char * TiltSensor_name( int ts ){ return NULL; }
+int TiltSensor_count()
+{
+	if(TiltSensor_data.detected == 0)
+		TiltSensor_detect();
+
+	if(TiltSensor_data.detected == -1)
+		return 0;
+	else if(TiltSensor_data.detected == 1)
+		return 1;
+
+	return 0;
+}
+int TiltSensor_open( int ts )
+{
+	if(TiltSensor_data.detected == 0)
+		TiltSensor_detect();
+
+	if(TiltSensor_data.detected == -1)
+		return -1;
+
+	TiltSensor_data.refcount++;
+
+	return 0;
+}
+int TiltSensor_close( int ts )
+{
+	TiltSensor_data.refcount--;
+
+	return 0;
+}
+int TiltSensor_read( int ts, int type, int num, HidMsg * msg )
+{
+
+	if(TiltSensor_data.detected == -1)
+		return -1;
+
+	if(!TiltSensor_do_read())
+		return -1;
+
+	if(TiltSensor_data.dataType == linuxAppleSMCMacBookDataType)
+	{
+		msg->idata[0] = TiltSensor_data.data.macbook.x;
+		msg->idata[1] = TiltSensor_data.data.macbook.y;
+		msg->idata[2] = TiltSensor_data.data.macbook.z;
+	}
+
+	return 0;
+}
+const char * TiltSensor_name( int ts )
+{
+	return "Apple Sudden Motion Sensor";
+}
 
 
 #endif
Only in audicle-1.0.0.7/lang/chuck-1.2.1.3/src: util_hid.cpp.orig
