GraphemeToColorSynesthesia.java
1    /* 
2     * Program to simulate the phenomenon known as grapheme to color synesthesia. 
3     * This program is written as an interpreter that recognizes and responds to : 
4     * - exit | terminate the program 
5     * - remap | redefine the mapping from letters to colors 
6     *  - WORD OR PHRASE | simply show the word or phrase in synthetic color 
7     */
8    
9    package synesthesia;
10   
11   import java.awt.Color;
12   import java.awt.Point;
13   import javax.swing.JOptionPane;
14   import javax.swing.SwingUtilities;
15   import painter.SPainter;
16   
17   public class GraphemeToColorSynesthesia {
18   
19       private static final int fontsize = 30;
20       private static final String theLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
21       private static String [] letters;
22       private static Color[] colors;
23   
24       private void paintingCode() {
25   
26           // INITIALIZATION
27           SPainter miro = new SPainter("Grapheme To Color Synesthesia", 1200, 220);
28           miro.setScreenLocation(30,30);
29           miro.setFontSize(fontsize);
30           initializeColorMap(theLetters);
31   
32           //INTERPRETATION
33           while (true) {
34               String input = JOptionPane.showInputDialog(null, "Please enter a word, or a few words ...");
35               if (input == null) {
36                   input = "EXIT";
37               }
38               input = input.toUpperCase();
39               if (input.equals("EXIT")) {
40                   break;
41               } else if (input.equals("REMAP")) {
42                   initializeColorMap(theLetters);
43                   showLetters(miro, theLetters);
44               } else {
45                   showLetters(miro, input.toUpperCase());
46               }
47           }
48           miro.end();
49       }
50   
51       private static void showLetters(SPainter miro, String input) {
52           //READY
53           eraseWhiteBoard(miro);
54           // SET
55           miro.moveTo(new Point.Double(100,100));
56           // GO
57           for (int i = 0; i < input.length(); i = i + 1) {
58               String letter = input.substring(i, i+1);
59               Color color = getLetterColor(letter);
60               miro.setColor(color);
61               miro.draw(letter);
62               miro.mrt(fontsize);
63           }
64       }
65   
66       private void initializeColorMap(String specialLetters) {
67           letters = new String[specialLetters.length()];
68           colors = new Color[specialLetters.length()];
69           for (int i = 0; i < specialLetters.length(); i = i + 1) {
70               letters[i] = specialLetters.substring(i,i+1);
71               colors[i] = randomColor();
72           }
73       }
74   
75       private static Color getLetterColor(String letter) {
76           for (int i = 0; i < letters.length; i = i + 1) {
77               if (letter.equalsIgnoreCase(letters[i])) {
78                   return colors[i];
79               }
80           }
81           return Color.BLACK;
82       }
83   
84       private Color randomColor() {
85           int rv = (int)(Math.random() * 256);
86           int gv = (int)(Math.random() * 256);
87           int bv = (int)(Math.random() * 256);
88           return new Color(rv,gv,bv);
89       }
90   
91       private static void eraseWhiteBoard(SPainter miro) {
92           miro.setColor(Color.WHITE);
93           miro.wash();
94           miro.paintFrame(Color.black, 5);
95       }
96   
97       // INFRASTRUCTURE FOR SIMPLE PAINTING
98       public GraphemeToColorSynesthesia() {
99           paintingCode();
100      }
101  
102      public static void main(String[] args) {
103          SwingUtilities.invokeLater(new Runnable() {
104              public void run() {
105                  new GraphemeToColorSynesthesia();
106              }
107          });
108      }
109  }
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125  
126  
127  
128  
129  
130  
131  
132  
133  
134  
135  
136  
137  
138  
139  
140  
141  
142  
143  
144  
145  
146  
147  
148  
149  
150  
151  
152  
153  
154