> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.nSZnmrvMorx/rev.270
 * 
 * authors: 
 *   Matt Perkins

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



// This sketch builds on a prior work, "metalgrass", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9PVX9Xa43Dpq9/rev.1510



// This sketch builds on a prior work, "ffil", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9DDvwNnc1V0ym/rev.306




// This sketch features a little interactivity to switch
// between rectangles and ellipses

// This sketch builds on a prior work, "focus minus minus", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.93QIjB0iv4-e8/rev.5995

// This sketch builds on a prior work, "walking songs discretization mode your mom", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.98lTGFWhlh2uY/rev.379

// This sketch builds on a prior work, "walking songs micro 10", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9PRHItsoDswkz/rev.1

// This sketch builds on a prior work, "walking songs macro 5475", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9UUCOcOswLbyj/rev.539

// with this one, we'll lock down the step and foot sizes.

// Pressing Control-R will render this sketch.

int FOOTSIZE = 28;
int STEP = 32;

int FOOTWIDTH = 5;
int FOOTHEIGHT = 6;

int i = 0; 
PVector[] locations;

int lastLetterIndex=0;

HashMap letters;
string[] textArray;
int MAX_X_CONSTRAINT = 1000;


void setup() {  // this is run once.   

    String g = getText(); 
    textArray = g.split();

    locations = new PVector[textArray.length];
    for (int j=0; j<locations.length;j++)
    {
        int xoffset = (j * (FOOTWIDTH + 1)  * STEP) + 50;
        locations[j] = new PVector(xoffset, STEP+25);
    }
    
    letters = InitLetters();
        
    // set the background color
    background(255);
    
    // canvas size (Variable aren't evaluated. Integers only, please.)
    size(1000, 300); 
      
    // smooth edges
    smooth();
    
    // limit the number of frames per second
    frameRate(30);
    
    // set the width of the line. 
    strokeWeight(1);
    
    fill(255,255,255,0);
    
    cursor(TEXT);
} 

void draw() {  // this is run repeatedly.  

    for(int j=0; j< locations.length; j++)
    {
        drawMass(
            color(random(255), 0, random(255), 15),
            locations[j], 
            textArray[j]);
    }
                
    // move over a pixel
    if (i < 50) {
        i++;
    } else {
        i = 0; 
    }
}

void keyPressed() {
    for(int j=1;j<textArray.length;j++)
    {
        textArray[j-1] = textArray[j];
    }     
    textArray[textArray.length-1] = new String(key);
    background(255);
    
}


void drawMass(color c, PVector v, String letter)
{
    int[] bits;
    if (letters.containsKey(letter.toLowerCase())) {
        bits = (int[]) letters.get(letter.toLowerCase());
    } else {
        bits = GetBits('0')
    }
    
    for(int k=0;k<FOOTHEIGHT;k++)
    {
        for(int l=0; l<FOOTWIDTH ;l++)
        {
            if (bits[k*FOOTWIDTH  + l] == 1)
            {
                stroke(c);
                fill(c);
                
                for(q=0;q<22;q++)
                {    
                    int locx = v.x + (l * STEP);
                    int locy = v.y + (k * STEP);
                        
                    int startx = random(locx, locx + FOOTSIZE) 
                        + random(-FOOTSIZE,FOOTSIZE);
                    int starty = random(locy, locy + FOOTSIZE) 
                        + random(-FOOTSIZE,FOOTSIZE);
                    int endx = random(locx, locx + FOOTSIZE) 
                        + random(-FOOTSIZE,FOOTSIZE);                        
                    int endy = random(locy, locy + FOOTSIZE)
                        + random(-FOOTSIZE,FOOTSIZE);            
            
                    line(startx,
                        starty,
                        endx,
                        endy);
                }
            }
                        
            
        }
    }
}

string nextLetter()
{
    string next = textArray[lastLetterIndex];
    lastLetterIndex++;
    if (lastLetterIndex >= textArray.length)
        lastLetterIndex = 0;
    return next;
}

int getWholeRandom(min, max)
{     
    return int(random(min-1,max+1));    
}

HashMap InitLetters()
{
    HashMap l = new HashMap();    
    l.put("a", GetBits('a')); 
    l.put("b", GetBits('b'));
    l.put("c", GetBits('c'));
    l.put("d", GetBits('d'));
    l.put("e", GetBits('e'));
    l.put("f", GetBits('f'));
    l.put("g", GetBits('g'));
    l.put("h", GetBits('h'));
    l.put("i", GetBits('i'));
    l.put("j", GetBits('j'));
    l.put("k", GetBits('k'));
    l.put("l", GetBits('l'));
    l.put("m", GetBits('m'));
    l.put("n", GetBits('n'));
    l.put("o", GetBits('o'));
    l.put("p", GetBits('p'));
    l.put("q", GetBits('q'));
    l.put("r", GetBits('r'));
    l.put("s", GetBits('s'));
    l.put("t", GetBits('t'));
    l.put("u", GetBits('u'));
    l.put("v", GetBits('v'));
    l.put("w", GetBits('w'));
    l.put("x", GetBits('x'));
    l.put("y", GetBits('y'));
    l.put("z", GetBits('z'));
    l.put(" ", GetBits(' '));
    l.put(",", GetBits(','));
    l.put(".", GetBits('.'));
    l.put("?", GetBits('?'));
    l.put("'", GetBits('\''));
    l.put("-", GetBits('-'));
    l.put("(", GetBits('('));
    l.put(")", GetBits(')'));
    l.put("2", GetBits('2'));
    l.put("4", GetBits('4'));
   
    return l;
}


int[] GetBits(char c)
{
    string s = "";
    switch (c) {
        case ' ':
            s = "0,0,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," +
                "0,0,0,0,0," +                 
                "0,0,0,0,0";
            break;
        case ',':
            s = "0,0,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," +                 
                "0,0,0,0,0," + 
                "0,1,0,0,0," + 
                "1,0,0,0,0";
            break;
        case '.':
            s = "0,0,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," +                 
                "0,0,0,0,0," + 
                "1,1,0,0,0," + 
                "1,1,0,0,0";
            break;
        case '?':
            s = "0,1,1,1,0," + 
                "1,0,0,0,1," + 
                "0,0,0,1,0," + 
                "0,0,1,0,0," + 
                "0,0,0,0,0," +                 
                "0,0,1,0,0";
            break;
        case '\'':
            s = "0,1,0,0,0," + 
                "0,1,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," + 
                "0,0,0,0,0," +                 
                "0,0,0,0,0";
            break;
        case '-':
            s = "0,0,0,0,0," +                 
                "0,0,0,0,0," +                 
                "0,0,0,0,0," +                                 
                "1,1,1,1,1," + 
                "0,0,0,0,0," +                 
                "0,0,0,0,0";                 
            break;
        case '(':
            s = "0,1,0,0,0," + 
                "1,0,0,0,0," + 
                "1,0,0,0,0," + 
                "1,0,0,0,0," +                 
                "1,0,0,0,0," + 
                "0,1,0,0,0";
            break;
        case ')':
            s = "0,1,0,0,0," + 
                "0,0,1,0,0," + 
                "0,0,1,0,0," + 
                "0,0,1,0,0," + 
                "0,0,1,0,0," +                 
                "0,1,0,0,0";
            break;

        case 'A':
        case 'a':
            s = "0,0,1,0,0," + 
                "0,1,0,1,0," + 
                "1,0,0,0,1," + 
                "1,1,1,1,1," + 
                "1,0,0,0,1," + 
                "1,0,0,0,1";
            break;
        case 'B':
        case 'b':
            s = "1,1,1,1,0," +
                "1,0,0,0,1," +
                "1,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,1,1,1,0";
            break;
        case 'C':
        case 'c':
            s = "0,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +                
                "1,0,0,0,1," +
                "0,1,1,1,0";
            break;
        case 'D':
        case 'd': 
            s = "1,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,0,0,0,1," +
                "1,1,1,1,0";
            break;
        case 'E':
        case 'e':
            s = "1,1,1,1,1," +
                "1,0,0,0,0," +
                "1,1,1,1,0," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +                
                "1,1,1,1,1";
            break;
        case 'F':
        case 'f':
            s = "1,1,1,1,1," +
                "1,0,0,0,0," +                
                "1,1,1,1,0," +
                "1,0,0,0,0," +                
                "1,0,0,0,0," +                
                "1,0,0,0,0";                
            break;
        case 'G':
        case 'g':
            s = "0,1,1,1,0," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +                
                "1,0,0,1,1," +
                "1,0,0,0,1," +
                "0,1,1,1,0";
            break;
        case 'H':
        case 'h':
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,1,1,1,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,0,0,0,1";
            break;
        case 'I':
        case 'i':
            s = "1,1,1,1,1," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +                
                "0,0,1,0,0," +
                "1,1,1,1,1";
            break;
        case 'J':
        case 'j':
            s = "0,0,0,0,1," +
                "0,0,0,0,1," +
                "0,0,0,0,1," +
                "0,0,0,0,1," +                
                "1,0,0,0,1," +
                "0,1,1,1,0";
            break;
        case 'K':
        case 'k':
            s = "1,0,0,0,1," +
                "1,0,0,1,0," +
                "1,0,1,0,0," + 
                "1,1,1,0,0," +                 
                "1,0,0,1,0," +
                "1,0,0,0,1";
            break;
        case 'l':
        case 'L':
            s = "1,0,0,0,0," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +                
                "1,0,0,0,0," +
                "1,1,1,1,1";
            break;
        case 'M':
        case 'm':
            s = "1,0,0,0,1," +
                "1,1,0,1,1," +
                "1,0,1,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,0,0,0,1";
            break;
        case 'N':
        case 'n':            
            s = "1,0,0,0,1," +
                "1,1,0,0,1," +
                "1,0,1,0,1," +
                "1,0,0,1,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1";                
            break;
        case 'O':
        case 'o':            
            s = "0,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,0,0,0,1," +
                "0,1,1,1,0";
            break;
        case 'P':
        case 'p':            
            s = "1,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,1,1,1,0," +
                "1,0,0,0,0," +
                "1,0,0,0,0," +                
                "1,0,0,0,0";
            break;
        case 'Q':
        case 'q':            
            s = "0,1,1,1,0," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "0,1,1,1,1," +
                "0,0,0,1,0";
            break;
        case 'R':
        case 'r':            
            s = "1,1,1,1,0," +
                "1,0,0,0,1," +
                "1,1,1,1,0," +
                "1,0,1,0,0," +                
                "1,0,0,1,0," +
                "1,0,0,0,1";
            break;
        case 'S':
        case 's':            
            s = "0,1,1,1,0," +
                "1,0,0,0,1," +
                "0,1,1,0,0," +
                "0,0,1,1,0," +
                "1,0,0,0,1," +                
                "0,1,1,1,0";
            break;
        case 'T':
        case 't':            
            s = "1,1,1,1,1," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0";
            break;
        case 'U':
        case 'u':            
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,0,0,0,1," +
                "0,1,1,1,0";
            break;
        case 'V':
        case 'v':            
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "0,1,0,1,0," +
                "0,0,1,0,0";
            break;
        case 'W':
        case 'w':            
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,1,0,1," +                
                "1,1,0,1,1," +
                "1,0,0,0,1";
            break;
        case 'X':
        case 'x':            
            s = "1,0,0,0,1," +  
                "0,1,0,1,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +                
                "0,1,0,1,0," +
                "1,0,0,0,1";
            break;
        case 'Y':
        case 'y':            
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "0,1,0,1,0," +                
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0";
            break;
        case 'Z':
        case 'z':            
            s = "1,1,1,1,1," +
                "0,0,0,1,0," +
                "0,0,1,0,0," +
                "0,0,1,0,0," +
                "0,1,0,0,0," +
                "1,1,1,1,1";
            break;    
        case '2':
            s = "0,1,1,1,0," +
                "1,0,0,0,1," +
                "0,0,0,1,0," +
                "0,0,1,0,0," +                
                "0,1,0,0,0," +
                "1,1,1,1,1";
            break;
        case '4':
            s = "1,0,0,0,1," +
                "1,0,0,0,1," +
                "1,0,0,0,1," +                
                "1,1,1,1,1," +
                "0,0,0,0,1," +
                "0,0,0,0,1";
            break;
        default:
            s = "1,1,1,1,1," +
                "1,1,1,1,1," +
                "1,1,1,1,1," +
                "1,1,1,1,1," +                
                "1,1,1,1,1," +
                "1,1,1,1,1";
            break;
    }
    
    String[] bitletters = new String[FOOTWIDTH * FOOTHEIGHT];
    bitletters = split(s, ",");
    
    int[] bitnumbers = new int[FOOTWIDTH * FOOTHEIGHT];
    for(int j=0; j<bitnumbers.length;j++)
    {
        if (bitletters[j] == "0")
        {
            bitnumbers[j] = 0;   
        }
        else
        {
            bitnumbers[j] = 1;
        }
    }
    
    return bitnumbers;   
}

string getText()
{
    return "METAL";    
}


String[] getTextAsArray()
{
    String t = getText();
    String[] ts = split(t); 
    return ts
}