Chromesthesiav1.java
1    package chromesthesia1;
2    
3    import java.util.Scanner;
4    import javax.swing.JOptionPane;
5    import javax.swing.SwingUtilities;
6    import painter.SPainter;
7    
8    public class Chromesthesiav1 {
9        public static void main(String[] args) {
10           SwingUtilities.invokeLater(new ThreadForGUI());
11       }
12       private static class ThreadForGUI implements Runnable {
13           @Override
14           public void run() {
15               new Chromesthesiav1();
16           }
17       }
18       public Chromesthesiav1() {
19           interpreter();
20       }
21       private static SPainter miro;
22       private static Pitchv1[] pitches;
23       public static void interpreter() {
24           initialization();
25           while ( true ) {
26               String input = getInput();
27               if ( input.equalsIgnoreCase("EXIT") ) {
28                   break;
29               } else {
30                   try {
31                       playMelody(input,pitches);
32                   } catch (Exception ex) {
33                       showErrorMessage(ex.toString());
34                   }
35               }
36           }
37           cleanup();
38       }
39       private static Pitchv1[] establishPitches(SPainter painter) {
40           Pitchv1[] pitches = new Pitchv1[21];
41           Pitchv1 pitchMiddleC = new Pitchv1("C",painter);
42           pitches[0] = pitchMiddleC;
43           Pitchv1 pitchLowC = new Pitchv1("C,",painter);
44           pitches[1] = pitchLowC;
45           Pitchv1 pitchHighC = new Pitchv1("c",painter);
46           pitches[2] = pitchHighC;
47           Pitchv1 pitchMiddleD = new Pitchv1("D",painter);
48           pitches[3] = pitchMiddleD;
49           Pitchv1 pitchLowD = new Pitchv1("D,",painter);
50           pitches[4] = pitchLowD;
51           Pitchv1 pitchHighD = new Pitchv1("d",painter);
52           pitches[5] = pitchHighD;
53           Pitchv1 pitchMiddleE = new Pitchv1("E",painter);
54           pitches[6] = pitchMiddleE;
55           Pitchv1 pitchLowE = new Pitchv1("E,",painter);
56           pitches[7] = pitchLowE;
57           Pitchv1 pitchHighE = new Pitchv1("e",painter);
58           pitches[8] = pitchHighE;
59           Pitchv1 pitchMiddleF = new Pitchv1("F",painter);
60           pitches[9] = pitchMiddleF;
61           Pitchv1 pitchLowF = new Pitchv1("F,",painter);
62           pitches[10] = pitchLowF;
63           Pitchv1 pitchHighF = new Pitchv1("f",painter);
64           pitches[11] = pitchHighF;
65           Pitchv1 pitchMiddleG = new Pitchv1("G",painter);
66           pitches[12] = pitchMiddleG;
67           Pitchv1 pitchLowG = new Pitchv1("G,",painter);
68           pitches[13] = pitchLowG;
69           Pitchv1 pitchHighG = new Pitchv1("g",painter);
70           pitches[14] = pitchHighG;
71           Pitchv1 pitchMiddleA = new Pitchv1("A",painter);
72           pitches[15] = pitchMiddleA;
73           Pitchv1 pitchLowA = new Pitchv1("A,",painter);
74           pitches[16] = pitchLowA;
75           Pitchv1 pitchHighA = new Pitchv1("a",painter);
76           pitches[17] = pitchHighA;
77           Pitchv1 pitchMiddleB = new Pitchv1("B",painter);
78           pitches[18] = pitchMiddleB;
79           Pitchv1 pitchLowB = new Pitchv1("B,",painter);
80           pitches[19] = pitchLowB;
81           Pitchv1 pitchHighB = new Pitchv1("B",painter);
82           pitches[20] = pitchHighB;
83           return pitches;
84       }
85       private static Pitchv1 find(String token, Pitchv1[] pitches) throws Exception {
86           for ( int i = 0; i < pitches.length; i = i + 1 ) {
87               Pitchv1 pitch = pitches[i];
88               if ( pitch.abcName().equals(token) ) {
89                   return pitch;
90               }
91           }
92           throw new Exception("### PITCH " + token + " NOT FOUND");
93       }
94       private static void display(Pitchv1[] pitches) {
95           for ( int i = 0; i < pitches.length; i = i + 1 ) {
96               System.out.println(pitches[i].toString());
97           }
98       }
99       private static void playMelody(String input, Pitchv1[] pitches) throws Exception {
100          Scanner scanner = new Scanner(input);
101          while ( scanner.hasNext() ) {
102              String token = scanner.next();
103              Pitchv1 pitch = find(token,pitches);
104              pitch.play("1");
105          }
106      }
107      static private void showErrorMessage(String message) {
108          miro.setVisible(false);
109          JOptionPane.showMessageDialog(null, message);
110      }
111      private static void initialization() {
112          miro = new SPainter("Chromesthesia",500,500);
113          miro.setVisible(false);
114          miro.setBrushWidth(7);
115          pitches = establishPitches(miro);
116          display(pitches);
117      }
118      private static String getInput() {
119          miro.setVisible(false);
120          String label = "Please enter a melody in ABC notation, or EXIT ... ";
121          String input = JOptionPane.showInputDialog(null,label);
122          miro.setVisible(true);
123          if ( input == null ) { input = ""; }
124          return input;
125      }
126      static private void cleanup() {
127          System.exit(0);
128      }
129  }