All posts by kaicheng



At the beginning, I wanted to design an MIDI glove that could adapt people’s natural way for playing music.

I often tap my fingers on my leg following the beat/rhythm when I enjoy music on the subway. It’s not only my personal habit, it’s a common behavior. I want to design some instrument can adapt to this behavior. Besides, the fingers are agile enough for playing complicated music. That’s why I choose a glove for adapting people’s natural way for playing music.

Music is relaxing for me. I just want to sit in such a place, somewhere like a garden, or a place full of nature, for enjoying some chill music, wasting my whole day without feeling guilty.



That’s why I came up with the concept of MUSIC GARDEN.

This piece is for my major studio.


But when I finished and played, I found although it was easier to generate sounds than keyboard, it was hard to create music, as creating needed inspiration and coincidence (I believe). I could hardly break the music patten I have done, as I’ve gotten used to the sequence of tapping fingers. I just wondered whether I could design some instruments which was not only easy to use, but also could provide inspirations. So I designed another instrument.

As the natural way for playing music was not that helpful, I wanted to use an ironic way to design the new instrument. What is the life resource of a garden or plant? That’s light. So I want to use this“natural” way for playing.

When I play with this, I can create some unexpected music which is more satisfying.

I have chosen Future Instrument as my Collab next semester. I will think about the instruments in this direction, which is not only for usability and accessibility, but also for helping break the habit of creating, and for more playful enjoyments.

Some documentation of design process.

pcompFinal2_bbIMG_5944 IMG_5955 IMG_5956 IMG_5969IMG_5962 IMG_5976


Code for MusicGarden,

int note = 0;
int hitavg = 0;
int dtcolor = 0;
int led = 12;
char pinAssignments[] ={‘A0’, ‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’};
byte PadNote[] = {58, 57, 55, 53, 50};

void setup()
Serial.begin(57600); // Default speed of the Serial to MIDI Converter serial port
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);


void loop(){

for(int pin=0; pin < 5; pin++){

hitavg = analogRead(pin);
// Serial.println(hitavg);

dtcolor = analogRead(A5);

//sense the color
if(dtcolor < 300){
if(hitavg > 300){
MIDI_TX(144,PadNote[pin] -5,127); // NOTE ON
MIDI_TX(128,PadNote[pin]-5 ,127); // NOTE OFF

if(dtcolor > 300){
if(hitavg > 300){
MIDI_TX(144,PadNote[pin], 127); // NOTE ON
MIDI_TX(128,PadNote[pin], 127); // NOTE OFF


void MIDI_TX(unsigned char MESSAGE, unsigned char PITCH, unsigned char VELOCITY)


I believe machines should adapt to humans, instead humans adapting to machines. Based on this perspective, I am designing a MIDI glove, that activates a range of sounds by tapping on different color surfaces.



Normally, people have to learn the instruments for a while, before they play them. Such as piano, the players have to remember the locations of the keys. For guitar, it will be more complicated. There’re 6 strings and more than 19 frets on a guitar. For generating pitches, the players have to use the fingers in their left hands to press the strings in different fret, and use the fingers in their right hands to clip the strings.



Is the learning necessary?

How to make the instruments adapt to the players, instead the players adapting to them?

What’s the most natural and direct way for playing music?



I will put sensors in the glove. Wearing it, the player can naturally tap his/her fingers on anywhere to create the sounds. It’s much easier than playing piano or guitar. There’s only one glove for the left hand. As only 5 fingers in one hand, are there only 5 pitches?

Definitely not. When tapping on another surface with a different color, the glove can generate another 5 pitches. The signals generated by tapping, will be transmitted to GarageBand ( music software) to generate sounds.

Screen Shot 2014-11-21 at 12.08.49 PM

pcompFinal_bb IMG_1958


Download the presentation here,


My work for Midterm is a toy. The concept is, “Dark Gives Me Life”.

It’s a ghost toy for Halloween. When night (dark) comes, the ghost will be alive.

There is a photocell sensor to detect the light. If the light is weak, it can give signal to Arduino. Then, Arduino will turn on the LEDs, piezo speaker and servo. So the ghost can shake, scream and blink his green evil eyes.

There are 1 photocell for detecting the light, 1 force sensor for detecting people pressing his hand. And 2 LEDs (for blinking eyes), 1 servo (for shaking head) and 1 piezo speaker (for screaming) as outputs.

IMG_1521 IMG_1523 IMG_1524 IMG_1526 IMG_1527 IMG_1528 IMG_1529 IMG_1530 IMG_1531 IMG_1532 IMG_1535 IMG_1542 IMG_1580 IMG_1581 IMG_1582




code is here,


#include <Servo.h>

Servo myservo;

int speaker = 9;
int ledPin1 = 6;
int ledPin2 = 5;

void setup(){
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(speaker, OUTPUT);

void loop(){
int sensorValue = analogRead(A0);
int sensorValue2 = analogRead(A1);
// Serial.println(sensorValue);
// Serial.println(sensorValue2);


//turn off the light
if(sensorValue < 50){
// myservo.write(180);
int thisPitch = map(sensorValue, 0, 100, 1000, 1500);
tone(speaker, thisPitch, 800);
for(int fadeValue = 0; fadeValue <= 255; fadeValue +=1){
int i = 0;
analogWrite(ledPin1, fadeValue);
// delay(3);
for(int fadeValue = 255; fadeValue >= 0; fadeValue -=1){
int i = 90;
analogWrite(ledPin1, fadeValue);
// delay(3);

if(sensorValue2 > 200){
int powerValue = map(sensorValue2, 400, 900, 1000, 2000);
tone(speaker, powerValue, 800);



LoL Shield Animation


Basic LoL Shield Test

Writen for the LoL Shield, designed by Jimmie Rodgers:

This needs the Charliplexing library, which you can get at the
LoL Shield project page:

Created by Jimmie Rodgers on 12/30/2009.
Adapted from:

December 30, 2009 – V1.0 first version written at 26C3/Berlin

This is free software; you can redistribute it and/or
modify it under the terms of the GNU Version 3 General Public
License as published by the Free Software Foundation;
or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

#include <avr/pgmspace.h> //AVR library for writing to ROM
#include <Charliplexing.h> //Imports the library, which needs to be
//Initialized in setup.

//Sets the time each frame is shown (milliseconds)
const unsigned int blinkdelay = 1000 / 50;

The BitMap array is what contains the frame data. Each line is one full frame.
Since each number is 16 bits, we can easily fit all 14 LEDs per row into it.
The number is calculated by adding up all the bits, starting with lowest on
the left of each row. 18000 was chosen as the kill number, so make sure that
is at the end of the matrix, or the program will continue to read into memory.

Here PROGMEM is called, which stores the array into ROM, which leaves us
with our RAM. You cannot change the array during run-time, only when you
upload to the Arduino. You will need to pull it out of ROM, which is covered
below. If you want it to stay in RAM, just delete PROGMEM
PROGMEM const uint16_t BitMap[][9] = {
//Diaganal swipe across the screen
{0, 0, 128, 320, 544, 320, 128, 0, 0},
{0, 128, 320, 544, 1040, 544, 320, 128, 0},
{128, 320, 544, 1040, 2056, 1040, 544, 320, 128},
{320, 544, 1040, 2056, 4100, 2072, 1072, 608, 320},
{544, 1040, 2056, 4100, 8194, 4100, 2056, 1040, 544},
{1040, 2056, 4100, 8194, 1, 8194, 4100, 2056, 1040},
{2056, 4100, 8194, 1, 0, 1, 8194, 4100, 2056},
{4100, 8194, 1, 0, 0, 0, 1, 8194, 4100},
{8194, 1, 0, 0, 0, 0, 0, 1, 8194},
{1, 0, 0, 0, 0, 0, 0, 0, 1},

void setup() {
LedSign::Init(DOUBLE_BUFFER | GRAYSCALE); //Initializes the screen
void loop() {
for (uint8_t gray = 1; gray < SHADES; gray++)
DisplayBitMap(gray); //Displays the bitmap

void DisplayBitMap(uint8_t grayscale)
boolean run=true; //While this is true, the screen updates
byte frame = 0; //Frame counter
byte line = 0; //Row counter
unsigned long data; //Temporary storage of the row data
unsigned long start = 0;

while(run == true) {

for(line = 0; line < 9; line++) {

//Here we fetch data from program memory with a pointer.
data = pgm_read_word_near (&BitMap[frame][line]);

//Kills the loop if the kill number is found
if (data==18000){

//This is where the bit-shifting happens to pull out
//each LED from a row. If the bit is 1, then the LED
//is turned on, otherwise it is turned off.
else for (byte led=0; led<14; ++led) {
if (data & (1<<led)) {
LedSign::Set(led, line, grayscale);
else {
LedSign::Set(led, line, 0);


unsigned long end = millis();
unsigned long diff = end – start;
if ( start && (diff < blinkdelay) )
delay( 5*blinkdelay – diff );
start = end;



My originally idea was to make a eye mask for my trip in airplane or train. When I nearly finished my wife suddenly found it was very suitable for me when I sat on the beach. So it gave me inspiration.

We made the lens as heart shape.  If I laid down the mask would be on. So I could hide myself from the sunshine. If I sat up the mask would be off. So it wouldn’t bother me for enjoying bikini girls ;-D

IMG_1337 IMG_1336

The code is here,


#include <Servo.h>

Servo myservo;

int switchPin = 3; // tilt sensor input to 3
int val; // the tilt value, 0 or 1

void setup()
pinMode(switchPin, INPUT);

void loop()
val = digitalRead(switchPin);

if (val == 1){
if (val == 0){



It’s instrument box. When you move it, tilt it or press its sensor, the sound and RGB LED will change.

IMG_1195 IMG_1197

int piezo = 9;
int speaker = 9;
int sensor = A0;
int sensorValue = 0;
int sensorValue2 = 0;

int ledPin1 = 6;
int ledPin2 = 3;
int ledPin3 = 5;
int sensorPress = A5;

void setup() {
pinMode(sensor, INPUT);
pinMode(sensorPress, INPUT);

pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);


void loop() {
sensorValue = analogRead(sensor);
sensorValue2 = analogRead(sensorPress);
// Serial.println(sensorValue2);

analogWrite(ledPin1, sensorValue);
analogWrite(ledPin3, sensorValue2/2 + 50);
analogWrite(ledPin2, sensorValue2/2);

sensorValue = map(sensorValue,1,500,1000,4000);
// Serial.println(sensorValue);



I used a physical line and a digital line to switch the lighting LED. The LED which was controlled by digital had a fading effect. At the beginning when the switch button was unclosed, the fading LED is lighting and gave the fading effect. When the button was closed, the fading LED turned off, but the other LED turned on.

bread schem pcb


I tried to switch LEDs by button.

One LED is with fading, controlled by code. The other one is just physics. Some magical thing was happened that I could turn on/off the LED by air…. LOL

My code:

const int buttonPin = 7; // the number of the pushbutton pin
const int ledPin = 9; // the number of the LED pin
int brightness = 0;
int fadeAmount = 5;

// variables will change:
int buttonState; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);

void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == LOW) {
// turn LED on:
digitalWrite(ledPin, HIGH);
analogWrite(ledPin, brightness);
brightness = brightness + fadeAmount;

if(brightness == 0 || brightness == 255){
fadeAmount = -fadeAmount;
else {
// turn LED off:
digitalWrite(ledPin, LOW);





I’m kAi, also from Beijing, China.

My background is graphic design and graphic user interface design. I was working in a social network in China recent 3 years. I do UI for mobile apps.

I have great interest in wearable devices. love pcomp things and I want to use wearable things to create music. And I also have interest in Audio Visualization.

I’m also a dog lover. There is a fur body in my Beijing home. He’s a fox terrier, which is very rebellious.

My portfolio,

My recent project was a concept design for smart watch.