package chromesthesia2; import painter.SPainter; import javax.swing.JOptionPane; import java.util.Scanner; import javax.swing.SwingUtilities; import painter.SPainter; public class Chromesthesia { //infrastructure for the program -- launching a "graphics" thread public static void main (String[] args){ SwingUtilities.invokeLater(new ThreadForGUI()); } private static class ThreadForGUI implements Runnable { @Override public void run() { new Chromesthesia(); } } public Chromesthesia() { interpreter(); } //Featured variables private static SPainter miro; private static Pitch[] pitches; private static void interpreter() { initialization(); // miro and pitched String last_play = new String(); while (true) { String input = getInput(); if (input.equalsIgnoreCase("EXIT")){ break; }else if (input.equalsIgnoreCase("AGAIN")){ try{ playMelody(last_play,pitches); }catch (Exception ex) { showErrorMessage (ex.toString()); } } else { try { playMelody(input,pitches); last_play = input; }catch (Exception ex) { showErrorMessage(ex.toString()); } } } cleanup(); //miro has to go } // Methods pertaining to the chromestheic pitches private static Pitch[] establishPitches (SPainter painter){ Pitch [] pitches = new Pitch[21]; Pitch pitchMiddleC = new Pitch("C", painter); pitches [0] = pitchMiddleC; Pitch pitchLowC = new Pitch ("C,", painter); pitches [1] =pitchLowC; Pitch pitchHighC = new Pitch("c", painter); pitches [2] = pitchHighC; Pitch pitchMiddleD = new Pitch("D", painter); pitches [3] = pitchMiddleD; Pitch pitchLowD = new Pitch("D,", painter); pitches [4] = pitchLowD; Pitch pitchHighD = new Pitch("d", painter); pitches [5] = pitchHighD; Pitch pitchMiddleE = new Pitch("E", painter); pitches [6] = pitchMiddleE; Pitch pitchLowE = new Pitch("E,", painter); pitches [7] = pitchLowE; Pitch pitchHighE = new Pitch ("e", painter); pitches [8] = pitchHighE; Pitch pitchHighF = new Pitch("F", painter); pitches [9] =pitchHighF; Pitch pitchLowF = new Pitch("F,",painter); pitches [10] =pitchLowF; Pitch pitchMiddleF = new Pitch("f",painter); pitches [11] = pitchMiddleF; Pitch pitchMiddleG = new Pitch("G,", painter); pitches [12] = pitchMiddleG; Pitch pitchHighG =new Pitch("G",painter); pitches [13] = pitchHighG; Pitch pitchLowG = new Pitch("g", painter); pitches [14] = pitchLowG; Pitch pitchMiddleA = new Pitch("A,", painter); pitches [15] = pitchMiddleA; Pitch pitchHighA=new Pitch("A",painter); pitches [16] = pitchHighA; Pitch pitchLowA = new Pitch("a", painter); pitches [17] = pitchLowA; Pitch pitchMiddleB = new Pitch("B,", painter); pitches [18] = pitchMiddleB; Pitch pitchHighB =new Pitch("B",painter); pitches [19] = pitchHighB; Pitch pitchLowB = new Pitch("b", painter); pitches [20] = pitchLowB; return pitches; } private static Pitch find (String token, Pitch[] pitches) throws Exception { for (int i = 0; i < pitches.length; i++){ Pitch pitch = pitches [i]; if (pitch.abcName().equals(token)){ return pitch; } } throw new Exception ("### PITCH " + token + "NOT FOUND"); } private static void display(Pitch[] pitches) { for (int i = 0; i< pitches.length; i++){ System.out.println (pitches[i].toString()); } } private static void playMelody (String input, Pitch[] pitches) throws Exception { Scanner scanner = new Scanner(input); while (scanner.hasNext()) { String token = scanner.next(); String pitchName; String duration = ""; if (token.indexOf(",")<0){ pitchName = token.substring(0,1); duration = token.substring(1); } else{ pitchName = token.substring(0,2); duration = token.substring(2); } if (duration.length() == 0) { duration = "1";} Pitch pitch = find(pitchName, pitches); pitch.play(duration); } } // initialization, cleanup, getting input, error messaging static private void showErrorMessage (String message){ miro.setVisible (false); JOptionPane.showMessageDialog(null, message); } private static void initialization() { // Establish the [ainter and give it a substantial brush width miro = new SPainter("Chromesthesia", 500,500); miro.setVisible(false); miro.setBrushWidth(7); // Establish the chromestitic pitch class objects pitches = establishPitches(miro); display(pitches); } private static String getInput() { miro.setVisible (false); String label = "Please enter a melody in ABC notation, or EXIT... "; String input = JOptionPane.showInputDialog(null, label); miro.setVisible (true); if (input == null) { input= ""; } return input; } static private void cleanup() { System.exit(0); } }