Keyboard Functions

keyboard-functions.pde
/**
 * Keyboard Functions 
 * by Martin Gomez 
 * 
 * Click on the window to give it focus and press the letter keys to type colors. 
 * The keyboard function keyPressed() is called whenever
 * a key is pressed. keyReleased() is another keyboard
 * function that is called when a key is released.
 * 
 * Original 'Color Typewriter' concept by John Maeda. 
 */
 
int maxHeight = 40;
int minHeight = 20;
int letterHeight = maxHeight; // Height of the letters
int letterWidth = 20;         // Width of the letter

int x = -20;                  // X position of the letters
int y = 0;                    // Y position of the letters

bool newletter = false;      

int numChars = 26;            // There are 26 characters in the alphabet
color colors[26];             // C++ fixed-size array

void setup() {
    size(640, 360);
    noStroke();
    colorMode(HSB, numChars);
    background(numChars / 2);

    // Set a hue value for each key
    for (int i = 0; i < numChars; i++) {
        colors[i] = color(i, numChars, numChars);    
    }
}

void draw() {
    if (newletter == true) {
        int y_pos;

        if (letterHeight == maxHeight) {
            y_pos = y;
            rect(x, y_pos, letterWidth, letterHeight);
        } else {
            y_pos = y + minHeight;
            rect(x, y_pos, letterWidth, letterHeight);

            fill(numChars / 2);
            rect(x, y_pos - minHeight, letterWidth, letterHeight);
        }

        newletter = false;
    }
}

void keyPressed() {
    // If the key is between 'A' to 'Z' or 'a' to 'z'
    if ((key >= 'A' && key <= 'Z') || (key >= 'a' && key <= 'z')) {

        int keyIndex;

        if (key <= 'Z') {
            keyIndex = key - 'A';
            letterHeight = maxHeight;
            fill(colors[keyIndex]);
        } else {
            keyIndex = key - 'a';
            letterHeight = minHeight;
            fill(colors[keyIndex]);
        }

    } else {
        fill(0);
        letterHeight = 10;
    }

    newletter = true;

    // Update the "letter" position
    x = x + letterWidth;

    // Wrap horizontally
    if (x > width - letterWidth) {
        x = 0;
        y += maxHeight;
    }

    // Wrap vertically
    if (y > height - letterHeight) {
        y = 0;
    }
}