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 }