/* this program interprets melodic line given in ABC notation as a chromesthete might. */ package chromesthesia0; import painter.SPainter; import javax.swing.*; import java.util.Scanner; public class Chromesthesia { //infratructure 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; //the interpreter private static void interpreter() { intialization();//miro and pitches while(true){ String input = getInput(); if(input.equalsIgnoreCase("Exit")){ break; }else{ 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[9]; 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; 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("### pitches " + token + "NOT FOUND"); } private static void display(Pitch[] pitches){ for(int i=0;i<pitches.length;i=i+1){ 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(); Pitch pitch = find(token,pitches); pitch.play("1"); } } //initiallization,cleanup,getting input, error message static private void showErrorMessage(String message){ miro.setVisible(false); JOptionPane.showMessageDialog(null,message); } public static void intialization(){ //established the painter and give it a substantial brush width{ miro=new SPainter("chromesthesia",500,500); miro.setVisible(false); miro.setBrushWidth(7); //established the chromestitic pitch class objext pitches=establishPitches(miro); display(pitches); } private static String getInput(){ miro.setVisible(false); String lable = "Please enter a melody in ABC notation, or Exit ... "; String input = JOptionPane.showInputDialog(null,lable); miro.setVisible(true); if(input==null){input="";} return input; } static private void cleanup(){ System.exit(0); } }