package chromesthesia2; import painter.SPainter; import javax.swing.*; import java.awt.*; import java.util.Scanner; public class Chromesthesia { 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; //The Interpreter public static void interpreter() { String initialinput = " "; intialization(); //miro and pitches while (true) { String input = getInput(); if (input.equalsIgnoreCase("AGAIN")) { if (initialinput != " ") try { playMelody(initialinput, pitches); } catch (Exception ex) { showErrorMessage(ex.toString()); } else { showErrorMessage("please enter input"); } } else if (input.equalsIgnoreCase("EXIT")) { break; } else { initialinput = input; try { playMelody(input, pitches); } catch (Exception ex) { showErrorMessage(ex.toString()); } } } cleanup(); //miro has to go } //Methods pertaining to the chromesthetic 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 pitchMiddleF= new Pitch("F", painter); pitches[9]=pitchMiddleF; Pitch pitchLowF= new Pitch("F,", painter); pitches[10]=pitchLowF; Pitch pitchHighF= new Pitch("f", painter); pitches[11] = pitchHighF; Pitch pitchMiddleG= new Pitch("G", painter); pitches[12]=pitchMiddleG; Pitch pitchLowG= new Pitch("G,", painter); pitches[13]=pitchLowG; Pitch pitchHighG= new Pitch("g", painter); pitches[14] = pitchHighG; Pitch pitchMiddleA= new Pitch("A", painter); pitches[15]=pitchMiddleA; Pitch pitchLowA= new Pitch("A,", painter); pitches[16]=pitchLowA; Pitch pitchHighA= new Pitch("a", painter); pitches[17] = pitchHighA; Pitch pitchMiddleB= new Pitch("B", painter); pitches[18]=pitchMiddleB; Pitch pitchLowB= new Pitch("B,", painter); pitches[19]=pitchLowB; Pitch pitchHighB= new Pitch("b", painter); pitches[20] = pitchHighB; return pitches; } private static Pitch find(String token, Pitch[]pitches)throws Exception{ for (int i=0; i<pitches.length; i=i+1){ Pitch pitch= pitches[i]; if (pitch.abcName().equals(token)){ return pitch; } } throw new Exception("### PITCH" + token+ "NOT FOUND"); } 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); } } private static void display(Pitch[] pitches) { for (int i = 0; i < pitches.length; i = i + 1) { System.out.println(pitches[i].toString()); } } //INITIALIZATION, CLEAN UP, GETTING INPUT, ERROR MESSAGING static private void showErrorMessage(String message){ miro.setVisible(false); JOptionPane.showMessageDialog(null, message); } private static void intialization() { //ESTABLISH A PAINTER AND GIVE A SUBSTANTIAL BRUSH WIDTH miro= new SPainter("Chromesthesia2", 500, 500); 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 AGAIN to replay it or EXIT.. " ; String input= JOptionPane.showInputDialog(null, label); miro.setVisible(true); if (input==null){input=""; } return input; } private static void cleanup() { System.exit(0); } }