/******************************\
 *
 * SetTheory.java
 *
 * A Musical Set-Theory Machine
 * by Jay Tomlin
 * July 1997
 *
 *
\******************************/

import java.awt.*;
import java.util.*;
import java.applet.*;
import java.net.*;

public class SetTheory extends java.applet.Applet implements Runnable {

// Declare class variables:

    PitchSet theSet;
    Panel buttonPanel, cardsPanel; // all the main layout panels
    CardLayout theCard, playerCard;
    Panel mainCard, defineSetCard, matricesCard, aboutCard, helpCard, clockPanel; // all occupying space on the cardsPanel
    Panel stats, graph; // occupying the mainCard
    Panel mainMatrix, xMatrix, yMatrix; // you guessed it, for the matricesCard
    Panel pianoPanel, playerPanel, playButtonsPanel; // for the keyboard & the sound playing controls
    GridBagLayout gridbag;
    GridLayout grid;
    Button defineSetBtn, invertBtn, sortBtn, rotateBtn, complementsetBtn, matricesBtn, helpBtn;
    Button transposeUp, transposeDown;
    Button REDRAW, play;
    Button defineSetOK, matricesOK;
    Canvas titleCanvas, cp, mp, playerCanvas, xLine, yLine; 
    ClickableCanvas clockCanvas, pianoCanvas; // Canvases who know where they were clicked
    Rectangle r;
    TextField setclassTF, normalformTF, primeformTF, fortenumberTF, intervalvectorTF, tnTF, tniTF, defineSetTF;
    int transposer; // For the Tn and TnI fields    
    Scrollbar scroller;
    Label lblTn, lblTnI;
    Hashtable triadsHash, seventhsHash, scalesHash, forteNumberHash, mainMatrixHash, xMatrixHash, yMatrixHash;
    List presets;  
    CheckboxGroup preset_choices, axis_choices, matrix_types, play_choices;
    Checkbox triads, sevenths, scales, fortes, normalAxis, invertedAxis, Tmatrix, Imatrix, melody, simultaneity;
    String cardShowing; // a flag to keep track of which card (in cardsPanel) is currently visible
    URL helpURL;
    Color tan;
    AudioClip SoundArray[];
    Thread playerThread;
    Polygon piano0, piano1, piano2, piano3, piano4, piano5, piano6, piano7, piano8, piano9, piano10, piano11; // piano keys
    Polygon clock0, clock1, clock2, clock3, clock4, clock5, clock6, clock7, clock8, clock9, clock10, clock11; // clockface digits    
    
    // for the mainMatrix panel:
    Label aa, ba, ca, da, ea, fa, ga, ha, ia, ja, ka, la;
    Label ab, bb, cb, db, eb, fb, gb, hb, ib, jb, kb, lb;
    Label ac, bc, cc, dc, ec, fc, gc, hc, ic, jc, kc, lc;
    Label ad, bd, cd, dd, ed, fd, gd, hd, id, jd, kd, ld;
    Label ae, be, ce, de, ee, fe, ge, he, ie, je, ke, le;
    Label af, bf, cf, df, ef, ff, gf, hf, If, jf, kf, lf;
    Label ag, bg, cg, dg, eg, fg, gg, hg, ig, jg, kg, lg;
    Label ah, bh, ch, dh, eh, fh, gh, hh, ih, jh, kh, lh;
    Label ai, bi, ci, di, ei, fi, gi, hi, ii, ji, ki, li;
    Label aj, bj, cj, dj, ej, fj, gj, hj, ij, jj, kj, lj;
    Label ak, bk, ck, dk, ek, fk, gk, hk, ik, jk, kk, lk;
    Label al, bl, cl, dl, el, fl, gl, hl, il, jl, kl, ll;
    
    //for the xMatrix and y Matrix panels:
    Label ax, bx, cx, dx, ex, fx, gx, hx, ix, jx, kx, lx;
    Label ay, by, cy, dy, ey, fy, gy, hy, iy, jy, ky, ly;
    
    public void init() {
        // Define some class variables:
        theSet = new PitchSet();
        r = this.bounds();
        gridbag = new GridBagLayout();
        transposer = 0;
        defineHashes();
        tan = new Color(204, 204, 170);
        this.setBackground(tan);
        try { helpURL = new URL(getCodeBase(), "help.html"); } catch(MalformedURLException e) {;}
        definePianoPolygons();
        defineClockPolygons();
    
        // Create the panels and add elements. This could take a while.        
        
        //////////////////////////////////////////
        // layout of the buttonPanel:
        buttonPanel = new Panel();    buttonPanel.setBackground(tan);
        defineSetBtn = new Button("Define Set...");
        invertBtn = new Button("Invert");
        REDRAW = new Button("Redraw");
        sortBtn = new Button("Sort");
        rotateBtn = new Button("Rotate");
        complementsetBtn = new Button("Get Complement");
        matricesBtn = new Button("Matrices...");
        helpBtn = new Button("Help...");
        grid = new GridLayout(9,1); // 8 buttons and a blank canvas in a single column
        buttonPanel.setLayout(grid);
        buttonPanel.add(defineSetBtn);
        buttonPanel.add(invertBtn);
        buttonPanel.add(sortBtn);
        buttonPanel.add(rotateBtn);
        buttonPanel.add(complementsetBtn);
        buttonPanel.add(matricesBtn);
        buttonPanel.add(new Canvas()); // creates a gap
        buttonPanel.add(REDRAW);
        buttonPanel.add(helpBtn);
        
        //////////////////////////////////////////
        // layout of the titleCanvas:
        titleCanvas = new Canvas();
        titleCanvas.resize(r.width, 36);
       
        //////////////////////////////////////////
        // layout of the clockPanel:
        clockPanel = new Panel();     clockPanel.setBackground(tan);
        clockCanvas = new ClickableCanvas();
        clockCanvas.resize(150,150);
        transposeUp = new Button(">");
        transposeDown = new Button("<");
        clockPanel.setLayout(new BorderLayout());
        clockPanel.add("Center", clockCanvas);
        Panel transposePanel = new Panel();
        transposePanel.add(transposeDown);
        transposePanel.add(transposeUp);
        clockPanel.add("South", transposePanel);

        //////////////////////////////////////////
        // layout of the mainCard:
        mainCard = new Panel();       mainCard.setBackground(tan); 
        setclassTF = new TextField(24);
        normalformTF = new TextField(24); normalformTF.setEditable(false);
        primeformTF = new TextField(24); primeformTF.setEditable(false);
        fortenumberTF = new TextField(24); fortenumberTF.setEditable(false);
        intervalvectorTF = new TextField(24); intervalvectorTF.setEditable(false);
        tnTF = new TextField(24); tnTF.setEditable(false);
        tniTF = new TextField(24); tniTF.setEditable(false);
        lblTn = new Label(" T(0) : ", Label.RIGHT);
        lblTnI = new Label(" T(0)I : ", Label.RIGHT);
        scroller = new Scrollbar(Scrollbar.VERTICAL, 0, 11, 0, 11); scroller.setPageIncrement(3);
        mainCard.setLayout(gridbag);
        //addComponent(mainCard, clockPanel, 2, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        addComponent(mainCard, new Label("Pitch Class Set : ", Label.RIGHT), 0, 1, 2, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);        
        addComponent(mainCard, new Label("Normal Form : ", Label.RIGHT), 0, 2, 2, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, new Label("Prime Form : ", Label.RIGHT), 0, 3, 2, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, new Label("Forte Number : ", Label.RIGHT), 0, 4, 2, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, new Label("Interval Class Vector : ", Label.RIGHT), 0, 5, 2, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, scroller, 0, 6, 1, 2, GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE); 
        addComponent(mainCard, lblTn, 1, 6, 1, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, lblTnI, 1, 7, 1, 1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(mainCard, setclassTF, 2, 1, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, normalformTF, 2, 2, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, primeformTF, 2, 3, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, fortenumberTF, 2, 4, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, intervalvectorTF, 2, 5, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, tnTF, 2, 6, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(mainCard, tniTF, 2, 7, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
        
        //////////////////////////////////////////
        // layout of the defineSetCard:
        defineSetCard = new Panel();  defineSetCard.setBackground(tan);
        preset_choices = new CheckboxGroup();
        triads = new Checkbox("Triads", preset_choices, true);
        sevenths = new Checkbox("Seventh Chords", preset_choices, false);
        scales = new Checkbox("Scales and Modes", preset_choices, false);
        fortes = new Checkbox("Forte Numbers", preset_choices, false);
        presets = new List(6, false); // 6 rows, not nulti-selectable
        listTriads(); // puts the triad options into the list
        defineSetTF = new TextField(24);
        defineSetTF.setText(theSet.toString());
        defineSetOK = new Button(" OK ");
        Label lbla = new Label("Type a list of pitch classes separated by"); 
        Label lblb = new Label("commas or select a set class from the list");
        Label lblc = new Label("of presets, and then click OK.");
        Label lbld = new Label("Presets:");
        defineSetCard.setLayout(gridbag);
        addComponent(defineSetCard, lbla, 0,0,4,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, lblb, 0,1,4,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, lblc, 0,2,4,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, lbld, 0,4,4,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, new Label("    "), 0,6,1,5, GridBagConstraints.WEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, triads, 1,6,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, sevenths, 1,7,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, scales, 1,8,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, fortes, 1,9,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, presets, 2,5,2,5, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(defineSetCard, defineSetTF, 1,10,2,1, GridBagConstraints.EAST, GridBagConstraints.NONE);
        addComponent(defineSetCard, defineSetOK, 3,10,1,1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
    
        //////////////////////////////////////////    
        // layout of the matricesCard:
        matricesCard = new Panel();   matricesCard.setBackground(tan);
        mainMatrix = new Panel();   mainMatrix.setLayout(new GridLayout(12,12));
        xMatrix = new Panel();      xMatrix.setLayout(new GridLayout(1,12)); // across the top
        yMatrix = new Panel();      yMatrix.setLayout(new GridLayout(12,1)); // down the side
        layoutMatrix(); // this was so long I stuck it as a method at the bottom
        axis_choices = new CheckboxGroup();
        normalAxis = new Checkbox("Normal", axis_choices, true);
        invertedAxis = new Checkbox("Inverted", axis_choices, false);
        matrix_types = new CheckboxGroup();
        Tmatrix = new Checkbox("T-matrix", matrix_types, true);
        Imatrix = new Checkbox("I-matrix", matrix_types, false);
        xLine = new Canvas(); xLine.resize(250,6);
        yLine = new Canvas(); yLine.resize(6,250);
        matricesOK = new Button(" OK ");
        matricesCard.setLayout(gridbag);
        addComponent(matricesCard, mainMatrix, 2,2,1,7, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, xMatrix, 2,0,1,1, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, yMatrix, 0,2,1,7, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE);
        addComponent(matricesCard, xLine, 2,1,1,1, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, yLine, 1,2,1,7, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE);
        addComponent(matricesCard, Tmatrix, 3,2,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, Imatrix, 3,3,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, new Label(""), 3,4,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, new Label("Y axis is:"), 3,5,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, normalAxis, 3,6,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(matricesCard, invertedAxis, 3,7,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        
        addComponent(matricesCard, matricesOK, 3, 8, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        
        //////////////////////////////////////////
        //layout of the cardsPanel:
        cardsPanel = new Panel();     cardsPanel.setBackground(tan);
        theCard = new CardLayout();
        cardsPanel.setLayout(theCard);
        cardsPanel.add("MAIN", mainCard);
        cardsPanel.add("DEFINESET", defineSetCard);
        cardsPanel.add("MATRICES", matricesCard);        
        theCard.show(cardsPanel, "MAIN"); cardShowing = new String("MAIN");
    
        //////////////////////////////////////////        
        //layout of the pianoPanel & playerCard:
        pianoCanvas = new ClickableCanvas();
        pianoCanvas.resize(285, 105);
        playerCanvas = new Canvas();
        playerCanvas.resize(285, 50);
        pianoPanel = new Panel();
        pianoPanel.setLayout(gridbag);
        play = new Button("Play");
        play_choices = new CheckboxGroup();
        melody = new Checkbox("Melody", play_choices, true);
        simultaneity = new Checkbox("Simultaneity", play_choices, false);
        playButtonsPanel = new Panel();
        playButtonsPanel.setLayout(gridbag);
        addComponent(playButtonsPanel, play, 0,1,1,2, GridBagConstraints.NORTH, GridBagConstraints.NONE);
        addComponent(playButtonsPanel, melody, 1,1,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        addComponent(playButtonsPanel, simultaneity, 1,2,1,1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE);
        playerPanel = new Panel();
        playerCard = new CardLayout();
        playerPanel.setLayout(playerCard);
        playerPanel.add("PRGOGRESS", playerCanvas);
        playerPanel.add("PLAYBUTTONS", playButtonsPanel);
        playerCard.show(playerPanel, "PROGRESS");
        addComponent(pianoPanel, pianoCanvas, 0,0,2,1, GridBagConstraints.NORTH, GridBagConstraints.NONE);
        addComponent(pianoPanel, playerPanel, 0,1,2,1, GridBagConstraints.NORTH, GridBagConstraints.NONE);
        
        //////////////////////////////////////////
        // layout of the applet itself:
        this.setLayout(gridbag);
        addComponent(this, titleCanvas, 0, 0, 3, 1, GridBagConstraints.SOUTH, GridBagConstraints.NONE);
        addComponent(this, cardsPanel, 0, 1, 2, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
        addComponent(this, buttonPanel, 2, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        addComponent(this, pianoPanel, 1, 2, 2, 1, GridBagConstraints.CENTER, GridBagConstraints.NONE);
        addComponent(this, clockPanel, 0, 2, 1, 1, GridBagConstraints.NORTH, GridBagConstraints.NONE);
        this.show();
        
    } // ends init()


    public void start() { 
        fillFields(); 
        super.repaint();
        
        /////////////////////////////////////////
        // Now get the sounds
        // String snd;
        int x = 15; // top-left corner of progress bar is at x,y
        int y = 25;
        Graphics progress = playerCanvas.getGraphics();
        progress.setColor(Color.black);
        progress.drawString("Loading sounds . . .", x, y-4);
        progress.drawRect(x, y, 253, 10); // 12 x 21 is 252, plus one for the black line 
        progress.setColor(Color.blue);
        long k;
        SoundArray = new AudioClip[12];
        String snd;
        for (int i=0; i<12; i++) {
            snd = new String(new Integer(i).toString() + ".au");
            SoundArray[i] = getAudioClip(getCodeBase(), snd);
            progress.setColor(Color.black);
            progress.drawString("Loading sounds . . .", x, y-4);
            progress.drawRect(x, y, 253, 10); // 12 x 21 is 252, plus one for the black line 
            progress.setColor(Color.blue);
            progress.fillRect(x+1, y+1, 21*(i+1), 9);
        }
        
        progress.setColor(this.getBackground());
        progress.fillRect(0,0,285,50);
        
        playerCard.show(playerPanel, "PLAYBUTTONS");
        
    }
    
    public void paint(Graphics g) {
        Rectangle a = this.bounds();
        Graphics aplt = this.getGraphics();
        aplt.setColor(tan);
        aplt.fillRect(0,0,a.width, a.height);
        Rectangle t = titleCanvas.bounds();
        String title = new String("Jay's Set Theory Calculator");
        Font titleFont = new Font("Helvetica", Font.BOLD, 18);
        Graphics titleGraphics = titleCanvas.getGraphics();
        titleGraphics.setFont(titleFont);
        FontMetrics titleFM = titleCanvas.getFontMetrics(titleFont);
        int titleWidth = titleFM.stringWidth(title);
        double titleX = (t.width - titleWidth) / 2; // center the title text on the titlePanel
        if (titleX < 0) titleX = 0;
        if ((titleX % 2) == 1) titleX = titleX + 0.5;
        titleGraphics.setColor(Color.black);
        titleGraphics.drawString(title, new Double(titleX).intValue(), 24);
        titleGraphics.setColor(getBackground().brighter());
        titleGraphics.drawLine(20, t.height-1, t.width-20, t.height-1);
        titleGraphics.setColor(getBackground().darker());
        titleGraphics.drawLine(20, t.height-2, t.width-20, t.height-2);
        Graphics clock = clockCanvas.getGraphics();
        clock.setColor(getBackground().brighter());
        clock.drawLine(149,10,149,140);
        clock.setColor(getBackground().darker());
        clock.drawLine(148,10,148,140);
        Graphics piano = pianoCanvas.getGraphics();
        drawPiano(piano);
        hilite(theSet);
        for (int c = 0; c < 12; c++) {
            drawClockDigit(c, clock);
            drawPianoDigit(c, piano);
        }
        if (cardShowing.equals("MATRICES")) {
            Graphics xl = xLine.getGraphics(); 
            Rectangle x = xMatrix.bounds();
            xl.setColor(tan.darker());    xl.drawLine(0,3,x.width,3);
            xl.setColor(tan.brighter());  xl.drawLine(0,4,x.width,4);
            Graphics yl = yLine.getGraphics(); 
            Rectangle y = yMatrix.bounds();
            yl.setColor(tan.darker());    yl.drawLine(3,0,3,y.height);
            yl.setColor(tan.brighter());  yl.drawLine(4,0,4,y.height);
        }
    } // ends paint()

       
  
/////////////////////////////
//
//
// Handle all user actions:
//
//
/////////////////////////////

public boolean handleEvent(Event e) {
    switch(e.id) {
        case Event.ACTION_EVENT:
        // BUTTONS
        // Button defineSetBtn, invertBtn, transposeBtn, sortBtn, 
        // rotateBtn, complementset Btn, matricesBtn, helpBtn, aboutBtn;
        
            if(e.target == defineSetBtn) {  
                theCard.show(cardsPanel, "DEFINESET"); cardShowing = new String("DEFINESET");
                defineSetTF.setText(theSet.toString());
                hilite(theSet);
                defineSetTF.selectAll();
                return true;   }
            else if(e.target == matricesBtn) {    
                theCard.show(cardsPanel, "MATRICES"); cardShowing = new String("MATRICES");
                hilite(theSet);
                fillFields();
                return true;   }     
            else if(e.target == invertBtn) {
                erase(theSet);
                theSet = theSet.invert();
                hilite(theSet);
                fillFields();
                return true;      }
            else if(e.target == transposeUp) {
                erase(theSet);
                theSet = theSet.transpose(1);
                hilite(theSet);
                fillFields();
                return true;      }
            else if(e.target == transposeDown) {
                erase(theSet);
                theSet = theSet.transpose(11);
                hilite(theSet);
                fillFields();
                return true;      }
            else if(e.target == sortBtn) {  
                theSet = theSet.sort();
                fillFields(); 
                return true;   }
            else if(e.target == complementsetBtn) {
                erase(theSet);
                theSet = theSet.getComplement();
                hilite(theSet);
                fillFields();
                return true;   }
            else if(e.target == rotateBtn) {
                theSet = theSet.rotate(1);
                fillFields();  
                return true;        }
            else if(e.target == defineSetOK) {
                erase(theSet);
                theSet = new PitchSet(defineSetTF.getText());
                theCard.show(cardsPanel, "MAIN"); cardShowing = new String("MAIN");
                fillFields();
                hilite(theSet);
                super.repaint();
                return true;       }
            else if(e.target == matricesOK) {
                theCard.show(cardsPanel, "MAIN"); cardShowing = new String("MAIN");
                fillFields();
                hilite(theSet);
                return true;     }
            else if(e.target == play) {
                if (simultaneity.getState()) { 
                    playSimultaneity(); 
                } else {
                    playMelody();
                }
                return true;     }

            // Checkboxes:
            else if(e.target == triads) { listTriads(); return true; }
            else if(e.target == sevenths) { listSevenths(); return true; }
            else if(e.target == scales) { listScales(); return true;  }
            else if(e.target == fortes) { listFortes(); return true; }
            else if(e.target == presets) { // this only happens when one double-clicks on a list item
                erase(theSet);
                theSet = new PitchSet(defineSetTF.getText());
                theCard.show(cardsPanel, "MAIN"); cardShowing = new String("MAIN");
                fillFields();
                hilite(theSet);
                super.repaint();
                return true;
            }
            else if(e.target == normalAxis || e.target == invertedAxis
                    || e.target == Tmatrix || e.target ==Imatrix) {  fillFields(); return true; }
            else if(e.target == REDRAW) { super.repaint(); return true; }
            else if(e.target == helpBtn) { this.getAppletContext().showDocument(helpURL, "SetTheoryWindow"); return true; }
            else {return false;}                            
           
        case Event.MOUSE_UP:  
            if(e.target == clockCanvas) { handleClockClick(e.x, e.y); return true; }
            else if (e.target == pianoCanvas) { handlePianoClick(e.x, e.y); return true; }
            else { super.handleEvent(e); }
        case Event.SCROLL_LINE_UP:  transposer = scroller.getValue(); fillTFields(); return true;
        case Event.SCROLL_LINE_DOWN:    transposer = scroller.getValue(); fillTFields(); return true;
        case Event.SCROLL_PAGE_UP:  transposer = scroller.getValue(); fillTFields(); return true;
        case Event.SCROLL_PAGE_DOWN:    transposer = scroller.getValue(); fillTFields(); return true;
        case Event.SCROLL_ABSOLUTE: transposer = scroller.getValue(); fillTFields(); return true;
        case Event.KEY_PRESS:       if(e.key==44 || // Comma
                           e.key==32 || // Spacebar
                           e.key==8 || // Backspace
                           e.key==127 || // Delete
                           (e.key >= 48 && e.key <= 57) ) {  // numbers 0-9
                            super.handleEvent(e); 
                        } else if (e.key==10) { // Enter key
                            erase(theSet);
                            if (cardShowing.equals("MAIN")) theSet = new PitchSet(setclassTF.getText());
                            if (cardShowing.equals("DEFINESET")) theSet = new PitchSet(defineSetTF.getText());
                            theCard.show(cardsPanel, "MAIN"); cardShowing = new String("MAIN");
                            fillFields();
                            hilite(theSet);
                            super.repaint();
                            return true;
                        } else { return true; } // i.e., don't type it
        case Event.LIST_SELECT: if (e.target==presets) {
                        if (triads.getState()) { defineSetTF.setText((String)triadsHash.get(e.arg)); }
                        if (sevenths.getState()) { defineSetTF.setText((String)seventhsHash.get(e.arg)); }
                        if (scales.getState()) { defineSetTF.setText((String)scalesHash.get(e.arg)); }
                        if (fortes.getState()) { defineSetTF.setText((String)forteNumberHash.get(e.arg)); }
                        erase(theSet);
                        theSet = new PitchSet(defineSetTF.getText());
                        hilite(theSet);
                        return true;
                    }

    } //ends switch
        return false; // this way the super.handleEvent(e) is called

} // ends handleEvent


////////////////////////
//
//
//    My Methods
//
//
////////////////////////

    // clockPoint returns the coordinates on clockCanvas where
    // the number c would be centered on a clock
   
    public Point clockPoint(int c) {
        Point origin = new Point(75,75);
        int radius = 50;
        double x = origin.x + (radius * Math.sin(c * Math.PI / 6)); // you do the math
        double y = origin.y - (radius * Math.cos(c * Math.PI / 6));
        return new Point(new Double(x).intValue(), new Double(y).intValue());
    }

    // pianoPoint returns the coordinates on pianoCanvas where
    // the number c would be drawn on the key

    public Point pianoPoint(int c) {
        int[] xpoints = {20,40,60,80,100,140,160,180,200,220,240,260};
        int[] ypoints = {85,35,85,35,85,85,35,85,35,85,35,85}; 
        return new Point(xpoints[c], ypoints[c]);
    }
    
    public void drawClockDigit(int c, Graphics g) { // Draws numbers on the clockCanvas
        Point coord = clockPoint(c);
        Font f = new Font("TimesRoman", Font.BOLD, 14);
        g.setFont(f);
        g.setColor(Color.black);
        String num = new Integer(c).toString();
        FontMetrics fm = this.getFontMetrics(f);
        int sw = fm.stringWidth(num); // the width of the number in this font
        g.drawString(num, coord.x-(sw/2), coord.y+5); // so that the number is centered *on* the point
    }

    public void drawPianoDigit(int c, Graphics g) { // Draws numbers on the pianoCanvas
        Point coord = pianoPoint(c);
        Font f = new Font("TimesRoman", Font.BOLD, 14);
        g.setFont(f);

        // we need to draw white digits on black keys and black digits on white keys,
        // unless theSet contains c, in which case it will be black on yellow:

        if (theSet.contains(c)) {
            g.setColor(Color.black);
        } else if(c==1 || c==3 || c==6 || c==8 || c==10) { // the black notes
            g.setColor(Color.white);
        } else {
            g.setColor(Color.black);
        }
        String num = new Integer(c).toString();
        FontMetrics fm = this.getFontMetrics(f);
        int sw = fm.stringWidth(num); // the width of the number in this font
        g.drawString(num, coord.x-(sw/2), coord.y+5); // so that the number is centered *on* the point
    }
    
    public void drawDigitHilite(int c, Graphics g) {
        g.setColor(Color.yellow);
        Point p = clockPoint(c);
        g.fillOval(p.x-12, p.y-12, 24, 24);
        drawClockDigit(c, g);
    }

    public void drawKeyboardHilite(int c, Graphics g) {
        g.setColor(Color.yellow);
        Point p = pianoPoint(c);
        g.fillOval(p.x-12, p.y-12, 24, 24);
        drawPianoDigit(c, g);
    }

    public void eraseDigitHilite(int c, Graphics g) {
        g.setColor(clockCanvas.getBackground());
        Point p = clockPoint(c);
        g.fillOval(p.x-12, p.y-12, 24, 24);
        drawClockDigit(c, g);
    }

    public void eraseKeyboardHilite(int c, Graphics g) {
        if(c==1 || c==3 || c==6 || c==8 || c==10) { // the black notes
        g.setColor(Color.black);
        } else {
        g.setColor(Color.white);
        }
        Point p = pianoPoint(c);
        g.fillOval(p.x-12, p.y-12, 24, 24);
        Font f = new Font("TimesRoman", Font.BOLD, 14);
        g.setFont(f);
       // we need to draw white digits on black keys and black digits on white keys,
        if(c==1 || c==3 || c==6 || c==8 || c==10) { // the black notes
            g.setColor(Color.white);
        } else {
            g.setColor(Color.black);
        }
        String num = new Integer(c).toString();
        FontMetrics fm = this.getFontMetrics(f);
        int sw = fm.stringWidth(num); // the width of the number in this font
        g.drawString(num, p.x-(sw/2), p.y+5); // so that the number is centered *on* the point
    }


    public void hilite(PitchSet PS) {
        Graphics g = clockCanvas.getGraphics();
        Graphics p = pianoCanvas.getGraphics();
        int l = PS.noteArray.length;
        for(int i=0; i<l; i++) {
            drawDigitHilite(PS.noteArray[i], g);
        drawKeyboardHilite(PS.noteArray[i], p);
        }
    }

    public void drawPiano(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0,0,280,100);
        g.setColor(Color.black);
        g.drawRect(0,0,280,100);
        for (int i=1; i<7; i++) {
            if (i != 3) { // no black note between E and F
            g.fillRect((40*i)-12, 0, 24, 60);
            g.drawLine(40*i, 0, 40*i, 100);
            } else {
            g.drawLine(40*i, 0, 40*i, 100);
            } // ends if
        } // ends for
    } // ends drawPiano(g)
    
    public void erase(PitchSet PS) {
        Graphics g = clockCanvas.getGraphics();
        Graphics p = pianoCanvas.getGraphics();
        int l = PS.noteArray.length;
        for(int i=0; i<l; i++) {
            eraseDigitHilite(PS.noteArray[i], g);
        eraseKeyboardHilite(PS.noteArray[i], p);    
        }
    }
    
    void fillFields() {
        // TextField setclassTF, normalformTF, primeformTF, fortenumberTF, intervalvectorTF, tnTF, tniTF;
        if(theSet.noteArray.length != 0) {
            setclassTF.setText(theSet.toString());   defineSetTF.setText(theSet.toString());
            normalformTF.setText(theSet.getNormalForm().toString());
            primeformTF.setText(theSet.getPrimeForm().toString());
            fortenumberTF.setText(new ForteNumber(theSet).toString());
            intervalvectorTF.setText(new IntervalVector(theSet).toString());
            fillTFields();
        } else { // the empty set
            setclassTF.setText("");
            normalformTF.setText("");
            primeformTF.setText("");
            fortenumberTF.setText("");
            intervalvectorTF.setText("");
            tnTF.setText("");
            tniTF.setText("");
        } // ends if
        if (cardShowing.equals("MATRICES")) { calculateMatrix(); }
        super.repaint();
    } // ends fillFields

    void fillTFields() {
       String tn = new String("T(" + transposer + ") : ");
        String tni = new String("T(" + transposer + ")I : ");
        lblTn.setText(tn);
        lblTnI.setText(tni);
        PitchSet TN = theSet.transpose(transposer);
        PitchSet TNI = theSet.invert().transpose(transposer);
        tnTF.setText(TN.toString());
        tniTF.setText(TNI.toString());
    }
    
    void calculateMatrix() { 
        // first clear all cells:
        clearMatrix();
        if (normalAxis.getState()) {  // y axis is normal
            populateXaxis(theSet);
            populateYaxis(theSet);
            populateMainMatrix(theSet);
        } else { // y axis is inverted
            populateXaxis(theSet);
            populateYaxis(theSet.invert());
            populateMainMatrix(theSet.invert());
        }
        
    } // ends calculateMatrix   

    void populateXaxis(PitchSet PS) {
        int l = PS.noteArray.length;
        for (int i=0; i<l; i++) {
            Label target = (Label)xMatrixHash.get(new Point(i,-1));
            target.setText(new Integer(PS.noteArray[i]).toString());
        }
    }
    
    void populateYaxis(PitchSet PS) {
        int l = PS.noteArray.length;
        for (int i=0; i<l; i++) {
            Label target = (Label)yMatrixHash.get(new Point(-1, i));
            target.setText(new Integer(PS.noteArray[i]).toString());
        }
    }
    
    void populateMainMatrix(PitchSet Y) {
        int l = theSet.noteArray.length;
        for (int j=0; j<l; j++) {
            for (int i=0; i<l; i++) {
                Label target = (Label)mainMatrixHash.get(new Point(j,i));
                int val;
                if (Tmatrix.getState()) {
                    val = theSet.modTwelve(theSet.noteArray[j] - Y.noteArray[i]);
                } else {
                    val = theSet.modTwelve(theSet.noteArray[j] + Y.noteArray[i]);
                }
                target.setText(new Integer(val).toString());
            }  // ends i loop
        } // ends j loop
    }
    
    void clearMatrix() {
        for (int i=0; i < 12; i++) {
            Label Xtarget = (Label)xMatrixHash.get(new Point(i, -1));
            Xtarget.setText("");  
            Label Ytarget = (Label)yMatrixHash.get(new Point(-1, i));
            Ytarget.setText("");            
        }
        for (int j=0; j<12; j++) {
            for (int i=0; i<12; i++) {
                Label target = (Label)mainMatrixHash.get(new Point(j,i));
                target.setText("");
            }  // ends i loop
        } // ends j loop    
    }
    
    void playSimultaneity() {
        int l = theSet.noteArray.length;
        for (int i=0; i < l; i++) {
            SoundArray[theSet.noteArray[i]].play();
        }
    } // ends playSimultaneity()  
    
    void playMelody() {
        playerThread = new Thread(this);
        playerThread.start(); // calls my run() method
    } // ends playMelody()
    
    void handlePianoClick(int x, int y) { 
        Polygon poly[] = {piano0, piano1, piano2, piano3, piano4, piano5, piano6, piano7, piano8, piano9, piano10, piano11};
        for (int c=0; c<12; c++) {
            if (poly[c].inside(x, y)) { SoundArray[c].play(); }
        }
    }
    
    void handleClockClick(int x, int y) { 
        Polygon poly[] = {clock0, clock1, clock2, clock3, clock4, clock5, clock6, clock7, clock8, clock9, clock10, clock11};
        for (int c=0; c<12; c++) {
            if (poly[c].inside(x,y)) { toggle(c); }
        }
    }                     
    
    void toggle(int aNote) {
        boolean containsNote = false;
        int where = 0; // if the note is in the set, where is it? (array index)
        String s; // the new set will start in s
        for(int i=0; i < theSet.noteArray.length; i++) {
            if (aNote == theSet.noteArray[i]) { containsNote = true; where = i; }    
        }
        
        if (containsNote) { // remove it
            s = new String();
            for (int j=0; j < theSet.noteArray.length; j++) {
                if (j != where) s += theSet.noteArray[j] + ",";
            }
        } else {            // add it
            s = theSet.toString();
            s += "," + aNote;        // tack it onto the end
        }
        erase(theSet);
        theSet = new PitchSet(s);
        hilite(theSet);
        fillFields();
    }
    
    public void run() {
        int l = theSet.noteArray.length;
        for (int i=0; i<l; i++) {
            SoundArray[theSet.noteArray[i]].play();
            try { playerThread.sleep(500); } catch(InterruptedException e) {;} // pause for half a second
        }
    }    // ends run()

    ///////////// addComponent Convenience methods for the GridBagLayout manager 
      
    void addComponent(Container cont, Component comp, int grid_x, 
                              int grid_y, int grid_w, int grid_h) {
               
        GridBagConstraints c = new GridBagConstraints();
        c.gridx=grid_x; c.gridy=grid_y;
        c.gridwidth=grid_w; c.gridheight=grid_h;
        gridbag.setConstraints(comp, c);
        cont.add(comp);
                
    } //ends addComponent(cont, comp, x, y, w, h)
                
        
    void addComponent(Container cont, Component comp, int grid_x, int grid_y,
                                int grid_w, int grid_h, int anchor, int fill) {
                
        GridBagConstraints c = new GridBagConstraints();
        c.gridx=grid_x; c.gridy=grid_y;
        c.gridwidth=grid_w; c.gridheight=grid_h;
        c.anchor = anchor;
        c.fill = fill;
                
        gridbag.setConstraints(comp, c);
        cont.add(comp);
          
    } //ends addComponent(cont, comp, x, y, w, h, anchor, fill)

    ////////////// Hashtables for the Set class presets

    void defineHashes() {
        triadsHash = new Hashtable(5);
            triadsHash.put(new Integer(0), new String("0,1,6"));
            triadsHash.put(new Integer(1), new String("0,4,7"));
            triadsHash.put(new Integer(2), new String("0,3,7"));
            triadsHash.put(new Integer(3), new String("0,4,8"));
            triadsHash.put(new Integer(4), new String("0,3,6"));
        seventhsHash = new Hashtable(5);
            seventhsHash.put(new Integer(0), "0,4,7,10");
            seventhsHash.put(new Integer(1), "0,4,7,11");
            seventhsHash.put(new Integer(2), "0,3,7,10");
            seventhsHash.put(new Integer(3), "0,3,6,10");
            seventhsHash.put(new Integer(4), "0,3,6,9");
        scalesHash = new Hashtable(13);
            scalesHash.put(new Integer(0),"0,2,4,5,7,9,11");
            scalesHash.put(new Integer(1),"0,2,3,5,7,8,10");
            scalesHash.put(new Integer(2),"0,2,3,5,7,9,11");
            scalesHash.put(new Integer(3),"0,2,3,5,7,8,11");
            scalesHash.put(new Integer(4),"0,2,4,5,7,9,11");
            scalesHash.put(new Integer(5),"0,2,3,5,7,9,10");
            scalesHash.put(new Integer(6),"0,1,3,5,7,8,10");
            scalesHash.put(new Integer(7),"0,2,4,6,7,9,11");
            scalesHash.put(new Integer(8),"0,2,4,5,7,9,10");
            scalesHash.put(new Integer(9),"0,2,3,5,7,8,10");
            scalesHash.put(new Integer(10),"0,1,3,5,6,8,10");
            scalesHash.put(new Integer(11),"0,2,4,6,8,10");
            scalesHash.put(new Integer(12),"0,1,3,4,6,7,9,10");
        forteNumberHash = new Hashtable(208);
        forteNumberHash.put(new Integer(0), "0,1,2");
        forteNumberHash.put(new Integer(1), "0,1,3");
        forteNumberHash.put(new Integer(2), "0,1,4");
        forteNumberHash.put(new Integer(3), "0,1,5");
        forteNumberHash.put(new Integer(4), "0,1,6");
        forteNumberHash.put(new Integer(5), "0,2,4");
        forteNumberHash.put(new Integer(6), "0,2,5");
        forteNumberHash.put(new Integer(7), "0,2,6");
        forteNumberHash.put(new Integer(8), "0,2,7");
        forteNumberHash.put(new Integer(9), "0,3,6");
        forteNumberHash.put(new Integer(10), "0,3,7");
        forteNumberHash.put(new Integer(11), "0,4,8");
        forteNumberHash.put(new Integer(12), "0,1,2,3");
        forteNumberHash.put(new Integer(13), "0,1,2,4");
        forteNumberHash.put(new Integer(14), "0,1,3,4");
        forteNumberHash.put(new Integer(15), "0,1,2,5");
        forteNumberHash.put(new Integer(16), "0,1,2,6");
        forteNumberHash.put(new Integer(17), "0,1,2,7");
        forteNumberHash.put(new Integer(18), "0,1,4,5");
        forteNumberHash.put(new Integer(19), "0,1,5,6");
        forteNumberHash.put(new Integer(20), "0,1,6,7");
        forteNumberHash.put(new Integer(21), "0,2,3,5");
        forteNumberHash.put(new Integer(22), "0,1,3,5");
        forteNumberHash.put(new Integer(23), "0,2,3,6");
        forteNumberHash.put(new Integer(24), "0,1,3,6");
        forteNumberHash.put(new Integer(25), "0,2,3,7");
        forteNumberHash.put(new Integer(26), "0,1,4,6");
        forteNumberHash.put(new Integer(27), "0,1,5,7");
        forteNumberHash.put(new Integer(28), "0,3,4,7");
        forteNumberHash.put(new Integer(29), "0,1,4,7");
        forteNumberHash.put(new Integer(30), "0,1,4,8");
        forteNumberHash.put(new Integer(31), "0,1,5,8");
        forteNumberHash.put(new Integer(32), "0,2,4,6");
        forteNumberHash.put(new Integer(33), "0,2,4,7");
        forteNumberHash.put(new Integer(34), "0,2,5,7");
        forteNumberHash.put(new Integer(35), "0,2,4,8");
        forteNumberHash.put(new Integer(36), "0,2,6,8");
        forteNumberHash.put(new Integer(37), "0,3,5,8");
        forteNumberHash.put(new Integer(38), "0,2,5,8");
        forteNumberHash.put(new Integer(39), "0,3,6,9");
        forteNumberHash.put(new Integer(40), "0,1,3,7");
        forteNumberHash.put(new Integer(41), "0,1,2,3,4");
        forteNumberHash.put(new Integer(42), "0,1,2,3,5");
        forteNumberHash.put(new Integer(43), "0,1,2,4,5");
        forteNumberHash.put(new Integer(44), "0,1,2,3,6");
        forteNumberHash.put(new Integer(45), "0,1,2,3,7");
        forteNumberHash.put(new Integer(46), "0,1,2,5,6");
        forteNumberHash.put(new Integer(47), "0,1,2,6,7");
        forteNumberHash.put(new Integer(48), "0,2,3,4,6");
        forteNumberHash.put(new Integer(49), "0,1,2,4,6");
        forteNumberHash.put(new Integer(50), "0,1,3,4,6");
        forteNumberHash.put(new Integer(51), "0,2,3,4,7");
        forteNumberHash.put(new Integer(52), "0,1,3,5,6");
        forteNumberHash.put(new Integer(53), "0,1,2,4,8");
        forteNumberHash.put(new Integer(54), "0,1,2,5,7");
        forteNumberHash.put(new Integer(55), "0,1,2,6,8");
        forteNumberHash.put(new Integer(56), "0,1,3,4,7");
        forteNumberHash.put(new Integer(57), "0,1,3,4,8");
        forteNumberHash.put(new Integer(58), "0,1,4,5,7");
        forteNumberHash.put(new Integer(59), "0,1,3,6,7");
        forteNumberHash.put(new Integer(60), "0,1,5,6,8");
        forteNumberHash.put(new Integer(61), "0,1,4,5,8");
        forteNumberHash.put(new Integer(62), "0,1,4,7,8");
        forteNumberHash.put(new Integer(63), "0,2,3,5,7");
        forteNumberHash.put(new Integer(64), "0,1,3,5,7");
        forteNumberHash.put(new Integer(65), "0,2,3,5,8");
        forteNumberHash.put(new Integer(66), "0,2,4,5,8");
        forteNumberHash.put(new Integer(67), "0,1,3,5,8");
        forteNumberHash.put(new Integer(68), "0,2,3,6,8");
        forteNumberHash.put(new Integer(69), "0,1,3,6,8");
        forteNumberHash.put(new Integer(70), "0,1,4,6,8");
        forteNumberHash.put(new Integer(71), "0,1,3,6,9");
        forteNumberHash.put(new Integer(72), "0,1,4,6,9");
        forteNumberHash.put(new Integer(73), "0,2,4,6,8");
        forteNumberHash.put(new Integer(74), "0,2,4,6,9");
        forteNumberHash.put(new Integer(75), "0,2,4,7,9");
        forteNumberHash.put(new Integer(76), "0,1,2,4,7");
        forteNumberHash.put(new Integer(77), "0,3,4,5,8");
        forteNumberHash.put(new Integer(78), "0,1,2,5,8");
        forteNumberHash.put(new Integer(79), "0,1,2,3,4,5");
        forteNumberHash.put(new Integer(80), "0,1,2,3,4,6");
        forteNumberHash.put(new Integer(81), "0,1,2,3,5,6");
        forteNumberHash.put(new Integer(82), "0,1,2,4,5,6");
        forteNumberHash.put(new Integer(83), "0,1,2,3,6,7");
        forteNumberHash.put(new Integer(84), "0,1,2,5,6,7");
        forteNumberHash.put(new Integer(85), "0,1,2,6,7,8");
        forteNumberHash.put(new Integer(86), "0,2,3,4,5,7");
        forteNumberHash.put(new Integer(87), "0,1,2,3,5,7");
        forteNumberHash.put(new Integer(88), "0,1,3,4,5,7");
        forteNumberHash.put(new Integer(89), "0,1,2,4,5,7");
        forteNumberHash.put(new Integer(90), "0,1,2,4,6,7");
        forteNumberHash.put(new Integer(91), "0,1,3,4,6,7");
        forteNumberHash.put(new Integer(92), "0,1,3,4,5,8");
        forteNumberHash.put(new Integer(93), "0,1,2,4,5,8");
        forteNumberHash.put(new Integer(94), "0,1,4,5,6,8");
        forteNumberHash.put(new Integer(95), "0,1,2,4,7,8");
        forteNumberHash.put(new Integer(96), "0,1,2,5,7,8");
        forteNumberHash.put(new Integer(97), "0,1,3,4,7,8");
        forteNumberHash.put(new Integer(98), "0,1,4,5,8,9");
        forteNumberHash.put(new Integer(99), "0,2,3,4,6,8");
        forteNumberHash.put(new Integer(100), "0,1,2,4,6,8");
        forteNumberHash.put(new Integer(101), "0,2,3,5,6,8");
        forteNumberHash.put(new Integer(102), "0,1,3,4,6,8");
        forteNumberHash.put(new Integer(103), "0,1,3,5,6,8");
        forteNumberHash.put(new Integer(104), "0,1,3,5,7,8");
        forteNumberHash.put(new Integer(105), "0,1,3,4,6,9");
        forteNumberHash.put(new Integer(106), "0,1,3,5,6,9");
        forteNumberHash.put(new Integer(107), "0,2,3,6,7,9");
        forteNumberHash.put(new Integer(108), "0,1,3,6,7,9");
        forteNumberHash.put(new Integer(109), "0,1,4,5,7,9");
        forteNumberHash.put(new Integer(110), "0,2,4,5,7,9");
        forteNumberHash.put(new Integer(111), "0,2,3,5,7,9");
        forteNumberHash.put(new Integer(112), "0,1,3,5,7,9");
        forteNumberHash.put(new Integer(113), "0,2,4,6,8,10");
        forteNumberHash.put(new Integer(114), "0,1,2,3,4,7");
        forteNumberHash.put(new Integer(115), "0,1,2,3,4,8");
        forteNumberHash.put(new Integer(116), "0,1,2,3,7,8");
        forteNumberHash.put(new Integer(117), "0,2,3,4,5,8");
        forteNumberHash.put(new Integer(118), "0,1,2,3,5,8");
        forteNumberHash.put(new Integer(119), "0,1,2,3,6,8");
        forteNumberHash.put(new Integer(120), "0,1,2,3,6,9");
        forteNumberHash.put(new Integer(121), "0,1,2,5,6,8");
        forteNumberHash.put(new Integer(122), "0,1,2,5,6,9");
        forteNumberHash.put(new Integer(123), "0,2,3,4,6,9");
        forteNumberHash.put(new Integer(124), "0,1,2,4,6,9");
        forteNumberHash.put(new Integer(125), "0,1,2,4,7,9");
        forteNumberHash.put(new Integer(126), "0,1,2,5,7,9");
        forteNumberHash.put(new Integer(127), "0,1,3,4,7,9");
        forteNumberHash.put(new Integer(128), "0,1,4,6,7,9");
        forteNumberHash.put(new Integer(129), "0,1,2,3,4,5,6");
        forteNumberHash.put(new Integer(130), "0,1,2,3,4,5,7");
        forteNumberHash.put(new Integer(131), "0,1,2,3,4,5,8");
        forteNumberHash.put(new Integer(132), "0,1,2,3,4,6,7");
        forteNumberHash.put(new Integer(133), "0,1,2,3,5,6,7");
        forteNumberHash.put(new Integer(134), "0,1,2,3,4,7,8");
        forteNumberHash.put(new Integer(135), "0,1,2,3,6,7,8");
        forteNumberHash.put(new Integer(136), "0,2,3,4,5,6,8");
        forteNumberHash.put(new Integer(137), "0,1,2,3,4,6,8");
        forteNumberHash.put(new Integer(138), "0,1,2,3,4,6,9");
        forteNumberHash.put(new Integer(139), "0,1,3,4,5,6,8");
        forteNumberHash.put(new Integer(140), "0,1,2,3,4,7,9");
        forteNumberHash.put(new Integer(141), "0,1,2,4,5,6,8");
        forteNumberHash.put(new Integer(142), "0,1,2,3,5,7,8");
        forteNumberHash.put(new Integer(143), "0,1,2,4,6,7,8");
        forteNumberHash.put(new Integer(144), "0,1,2,3,5,6,9");
        forteNumberHash.put(new Integer(145), "0,1,2,4,5,6,9");
        forteNumberHash.put(new Integer(146), "0,1,2,3,6,7,10");
        forteNumberHash.put(new Integer(147), "0,1,2,3,6,7,9");
        forteNumberHash.put(new Integer(148), "0,1,2,5,6,7,9");
        forteNumberHash.put(new Integer(149), "0,1,2,4,5,8,9");
        forteNumberHash.put(new Integer(150), "0,1,3,4,7,8,9");
        forteNumberHash.put(new Integer(151), "0,2,3,4,5,7,9");
        forteNumberHash.put(new Integer(152), "0,1,2,3,5,7,9");
        forteNumberHash.put(new Integer(153), "0,2,3,4,6,7,9");
        forteNumberHash.put(new Integer(154), "0,1,3,4,5,7,9");
        forteNumberHash.put(new Integer(155), "0,1,2,4,5,7,9");
        forteNumberHash.put(new Integer(156), "0,1,3,5,6,7,9");
        forteNumberHash.put(new Integer(157), "0,1,2,4,6,7,9");
        forteNumberHash.put(new Integer(158), "0,1,2,4,6,8,9");
        forteNumberHash.put(new Integer(159), "0,1,3,4,6,7,9");
        forteNumberHash.put(new Integer(160), "0,1,3,4,6,8,9");
        forteNumberHash.put(new Integer(161), "0,1,2,4,6,8,10");
        forteNumberHash.put(new Integer(162), "0,1,3,4,6,8,10");
        forteNumberHash.put(new Integer(163), "0,1,3,5,6,8,10");
        forteNumberHash.put(new Integer(164), "0,1,2,3,5,6,8");
        forteNumberHash.put(new Integer(165), "0,1,3,4,5,7,8");
        forteNumberHash.put(new Integer(166), "0,1,2,4,5,7,8");
        forteNumberHash.put(new Integer(167), "0,1,2,3,4,5,6,7");
        forteNumberHash.put(new Integer(168), "0,1,2,3,4,5,6,8");
        forteNumberHash.put(new Integer(169), "0,1,2,3,4,5,6,9");
        forteNumberHash.put(new Integer(170), "0,1,2,3,4,5,7,8");
        forteNumberHash.put(new Integer(171), "0,1,2,3,4,6,7,8");
        forteNumberHash.put(new Integer(172), "0,1,2,3,5,6,7,8");
        forteNumberHash.put(new Integer(173), "0,1,2,3,4,5,8,9");
        forteNumberHash.put(new Integer(174), "0,1,2,3,4,7,8,9");
        forteNumberHash.put(new Integer(175), "0,1,2,3,6,7,8,9");
        forteNumberHash.put(new Integer(176), "0,2,3,4,5,6,7,9");
        forteNumberHash.put(new Integer(177), "0,1,2,3,4,5,7,9");
        forteNumberHash.put(new Integer(178), "0,1,3,4,5,6,7,9");
        forteNumberHash.put(new Integer(179), "0,1,2,3,4,6,7,9");
        forteNumberHash.put(new Integer(180), "0,1,2,4,5,6,7,9");
        forteNumberHash.put(new Integer(181), "0,1,2,3,4,6,8,9");
        forteNumberHash.put(new Integer(182), "0,1,2,3,5,7,8,9");
        forteNumberHash.put(new Integer(183), "0,1,3,4,5,6,8,9");
        forteNumberHash.put(new Integer(184), "0,1,2,3,5,6,8,9");
        forteNumberHash.put(new Integer(185), "0,1,2,4,5,6,8,9");
        forteNumberHash.put(new Integer(186), "0,1,2,4,5,7,8,9");
        forteNumberHash.put(new Integer(187), "0,1,2,3,5,7,9,11");
        forteNumberHash.put(new Integer(188), "0,1,2,3,5,6,8,10");
        forteNumberHash.put(new Integer(189), "0,2,3,4,5,7,9,10");
        forteNumberHash.put(new Integer(190), "0,1,2,4,5,6,8,10");
        forteNumberHash.put(new Integer(191), "0,1,2,4,6,7,8,10");
        forteNumberHash.put(new Integer(192), "0,1,3,4,5,7,8,10");
        forteNumberHash.put(new Integer(193), "0,1,2,4,5,7,8,10");
        forteNumberHash.put(new Integer(194), "0,1,3,4,6,7,9,10");
        forteNumberHash.put(new Integer(195), "0,1,2,3,5,6,7,9");
        forteNumberHash.put(new Integer(196), "0,1,2,3,4,5,6,7,8");
        forteNumberHash.put(new Integer(197), "0,1,2,3,4,5,6,7,9");
        forteNumberHash.put(new Integer(198), "0,1,2,3,4,5,6,8,9");
        forteNumberHash.put(new Integer(199), "0,1,2,3,4,5,7,8,9");
        forteNumberHash.put(new Integer(200), "0,1,2,3,4,6,7,8,9");
        forteNumberHash.put(new Integer(201), "0,1,2,3,4,5,6,8,10");
        forteNumberHash.put(new Integer(202), "0,1,2,3,4,5,7,8,10");
        forteNumberHash.put(new Integer(203), "0,1,2,3,4,6,7,8,10");
        forteNumberHash.put(new Integer(204), "0,1,2,3,5,6,7,8,10");
        forteNumberHash.put(new Integer(205), "0,1,2,3,4,6,7,9,10");
        forteNumberHash.put(new Integer(206), "0,1,2,3,5,6,7,9,10");
        forteNumberHash.put(new Integer(207), "0,1,2,4,5,6,8,9,10");

    }
    
    void listTriads() {
        presets.clear();
        presets.addItem("Viennese trichord");
        presets.addItem("Major");
        presets.addItem("Minor");
        presets.addItem("Augmented");
        presets.addItem("Diminished");
    }

    void listSevenths() {
        presets.clear();
        presets.addItem("Dominant (Mm)");
        presets.addItem("Major (MM)");
        presets.addItem("Minor (mm)");
        presets.addItem("Half-diminished");
        presets.addItem("Fully-diminished");
    }

    void listScales() {
        presets.clear();
        presets.addItem("Major");
        presets.addItem("Natural Minor");
        presets.addItem("Ascending Minor");
        presets.addItem("Harmonic Minor");
        presets.addItem("Ionian");
        presets.addItem("Dorian");
        presets.addItem("Phrygian");
        presets.addItem("Lydian");
        presets.addItem("Mixolydian");
        presets.addItem("Aeolian");
        presets.addItem("Locrian");
        presets.addItem("Whole-tone");
        presets.addItem("Octatonic");
    }
    
    void listFortes() {
        presets.clear();
        presets.addItem("3-1");
        presets.addItem("3-2");
        presets.addItem("3-3");
        presets.addItem("3-4");
        presets.addItem("3-5");
        presets.addItem("3-6");
        presets.addItem("3-7");
        presets.addItem("3-8");
        presets.addItem("3-9");
        presets.addItem("3-10");
        presets.addItem("3-11");
        presets.addItem("3-12");
        presets.addItem("4-1");
        presets.addItem("4-2");
        presets.addItem("4-3");
        presets.addItem("4-4");
        presets.addItem("4-5");
        presets.addItem("4-6");
        presets.addItem("4-7");
        presets.addItem("4-8");
        presets.addItem("4-9");
        presets.addItem("4-10");
        presets.addItem("4-11");
        presets.addItem("4-12");
        presets.addItem("4-13");
        presets.addItem("4-14");
        presets.addItem("4-Z15");
        presets.addItem("4-16");
        presets.addItem("4-17");
        presets.addItem("4-18");
        presets.addItem("4-19");
        presets.addItem("4-20");
        presets.addItem("4-21");
        presets.addItem("4-22");
        presets.addItem("4-23");
        presets.addItem("4-24");
        presets.addItem("4-25");
        presets.addItem("4-26");
        presets.addItem("4-27");
        presets.addItem("4-28");
        presets.addItem("4-Z29");
        presets.addItem("5-1");
        presets.addItem("5-2");
        presets.addItem("5-3");
        presets.addItem("5-4");
        presets.addItem("5-5");
        presets.addItem("5-6");
        presets.addItem("5-7");
        presets.addItem("5-8");
        presets.addItem("5-9");
        presets.addItem("5-10");
        presets.addItem("5-11");
        presets.addItem("5-Z12");
        presets.addItem("5-13");
        presets.addItem("5-14");
        presets.addItem("5-15");
        presets.addItem("5-16");
        presets.addItem("5-Z17");
        presets.addItem("5-Z18");
        presets.addItem("5-19");
        presets.addItem("5-20");
        presets.addItem("5-21");
        presets.addItem("5-22");
        presets.addItem("5-23");
        presets.addItem("5-24");
        presets.addItem("5-25");
        presets.addItem("5-26");
        presets.addItem("5-27");
        presets.addItem("5-28");
        presets.addItem("5-29");
        presets.addItem("5-30");
        presets.addItem("5-31");
        presets.addItem("5-32");
        presets.addItem("5-33");
        presets.addItem("5-34");
        presets.addItem("5-35");
        presets.addItem("5-Z36");
        presets.addItem("5-Z37");
        presets.addItem("5-Z38");
        presets.addItem("6-1");
        presets.addItem("6-2");
        presets.addItem("6-Z3");
        presets.addItem("6-Z4");
        presets.addItem("6-5");
        presets.addItem("6-Z6");
        presets.addItem("6-7");
        presets.addItem("6-8");
        presets.addItem("6-9");
        presets.addItem("6-Z10");
        presets.addItem("6-Z11");
        presets.addItem("6-Z12");
        presets.addItem("6-Z13");
        presets.addItem("6-14");
        presets.addItem("6-15");
        presets.addItem("6-16");
        presets.addItem("6-Z17");
        presets.addItem("6-18");
        presets.addItem("6-Z19");
        presets.addItem("6-20");
        presets.addItem("6-21");
        presets.addItem("6-22");
        presets.addItem("6-Z23");
        presets.addItem("6-Z24");
        presets.addItem("6-Z25");
        presets.addItem("6-Z26");
        presets.addItem("6-27");
        presets.addItem("6-Z28");
        presets.addItem("6-Z29");
        presets.addItem("6-30");
        presets.addItem("6-31");
        presets.addItem("6-32");
        presets.addItem("6-33");
        presets.addItem("6-34");
        presets.addItem("6-35");
        presets.addItem("6-Z36");
        presets.addItem("6-Z37");
        presets.addItem("6-Z38");
        presets.addItem("6-Z39");
        presets.addItem("6-Z40");
        presets.addItem("6-Z41");
        presets.addItem("6-Z42");
        presets.addItem("6-Z43");
        presets.addItem("6-Z44");
        presets.addItem("6-Z45");
        presets.addItem("6-Z46");
        presets.addItem("6-Z47");
        presets.addItem("6-Z48");
        presets.addItem("6-Z49");
        presets.addItem("6-Z50");
        presets.addItem("7-1");
        presets.addItem("7-2");
        presets.addItem("7-3");
        presets.addItem("7-4");
        presets.addItem("7-5");
        presets.addItem("7-6");
        presets.addItem("7-7");
        presets.addItem("7-8");
        presets.addItem("7-9");
        presets.addItem("7-10");
        presets.addItem("7-11");
        presets.addItem("7-Z12");
        presets.addItem("7-13");
        presets.addItem("7-14");
        presets.addItem("7-15");
        presets.addItem("7-16");
        presets.addItem("7-Z17");
        presets.addItem("7-Z18");
        presets.addItem("7-19");
        presets.addItem("7-20");
        presets.addItem("7-21");
        presets.addItem("7-22");
        presets.addItem("7-23");
        presets.addItem("7-24");
        presets.addItem("7-25");
        presets.addItem("7-26");
        presets.addItem("7-27");
        presets.addItem("7-28");
        presets.addItem("7-29");
        presets.addItem("7-30");
        presets.addItem("7-31");
        presets.addItem("7-32");
        presets.addItem("7-33");
        presets.addItem("7-34");
        presets.addItem("7-35");
        presets.addItem("7-Z36");
        presets.addItem("7-Z37");
        presets.addItem("7-Z38");
        presets.addItem("8-1");
        presets.addItem("8-2");
        presets.addItem("8-3");
        presets.addItem("8-4");
        presets.addItem("8-5");
        presets.addItem("8-6");
        presets.addItem("8-7");
        presets.addItem("8-8");
        presets.addItem("8-9");
        presets.addItem("8-10");
        presets.addItem("8-11");
        presets.addItem("8-12");
        presets.addItem("8-13");
        presets.addItem("8-14");
        presets.addItem("8-Z15");
        presets.addItem("8-16");
        presets.addItem("8-17");
        presets.addItem("8-18");
        presets.addItem("8-19");
        presets.addItem("8-20");
        presets.addItem("8-21");
        presets.addItem("8-22");
        presets.addItem("8-23");
        presets.addItem("8-24");
        presets.addItem("8-25");
        presets.addItem("8-26");
        presets.addItem("8-27");
        presets.addItem("8-28");
        presets.addItem("8-Z29");
        presets.addItem("9-1");
        presets.addItem("9-2");
        presets.addItem("9-3");
        presets.addItem("9-4");
        presets.addItem("9-5");
        presets.addItem("9-6");
        presets.addItem("9-7");
        presets.addItem("9-8");
        presets.addItem("9-9");
        presets.addItem("9-10");
        presets.addItem("9-11");
        presets.addItem("9-12");

    
    }
    
    
    
    
  public void layoutMatrix() { //Layout of the matrixCard:
                        // Don't worry, I didn't type all this by hand . . .

    // for the main matrix
    aa = new Label("   ");   mainMatrix.add(aa);     ab = new Label("   ");   mainMatrix.add(ab);
    ac = new Label("   ");   mainMatrix.add(ac);
    ad = new Label("   ");   mainMatrix.add(ad);
    ae = new Label("   ");   mainMatrix.add(ae);
    af = new Label("   ");   mainMatrix.add(af);
    ag = new Label("   ");   mainMatrix.add(ag);
    ah = new Label("   ");   mainMatrix.add(ah);
    ai = new Label("   ");   mainMatrix.add(ai);
    aj = new Label("   ");   mainMatrix.add(aj);
    ak = new Label("   ");   mainMatrix.add(ak);
    al = new Label("   ");   mainMatrix.add(al);
    ba = new Label("   ");   mainMatrix.add(ba);
    bb = new Label("   ");   mainMatrix.add(bb);
    bc = new Label("   ");   mainMatrix.add(bc);
    bd = new Label("   ");   mainMatrix.add(bd);
    be = new Label("   ");   mainMatrix.add(be);
    bf = new Label("   ");   mainMatrix.add(bf);
    bg = new Label("   ");   mainMatrix.add(bg);
    bh = new Label("   ");   mainMatrix.add(bh);
    bi = new Label("   ");   mainMatrix.add(bi);
    bj = new Label("   ");   mainMatrix.add(bj);
    bk = new Label("   ");   mainMatrix.add(bk);
    bl = new Label("   ");   mainMatrix.add(bl);
    ca = new Label("   ");   mainMatrix.add(ca);
    cb = new Label("   ");   mainMatrix.add(cb);
    cc = new Label("   ");   mainMatrix.add(cc);
    cd = new Label("   ");   mainMatrix.add(cd);
    ce = new Label("   ");   mainMatrix.add(ce);
    cf = new Label("   ");   mainMatrix.add(cf);
    cg = new Label("   ");   mainMatrix.add(cg);
    ch = new Label("   ");   mainMatrix.add(ch);
    ci = new Label("   ");   mainMatrix.add(ci);
    cj = new Label("   ");   mainMatrix.add(cj);
    ck = new Label("   ");   mainMatrix.add(ck);
    cl = new Label("   ");   mainMatrix.add(cl);
    da = new Label("   ");   mainMatrix.add(da);
    db = new Label("   ");   mainMatrix.add(db);
    dc = new Label("   ");   mainMatrix.add(dc);
    dd = new Label("   ");   mainMatrix.add(dd);
    de = new Label("   ");   mainMatrix.add(de);
    df = new Label("   ");   mainMatrix.add(df);
    dg = new Label("   ");   mainMatrix.add(dg);
    dh = new Label("   ");   mainMatrix.add(dh);
    di = new Label("   ");   mainMatrix.add(di);
    dj = new Label("   ");   mainMatrix.add(dj);
    dk = new Label("   ");   mainMatrix.add(dk);
    dl = new Label("   ");   mainMatrix.add(dl);
    ea = new Label("   ");   mainMatrix.add(ea);
    eb = new Label("   ");   mainMatrix.add(eb);
    ec = new Label("   ");   mainMatrix.add(ec);
    ed = new Label("   ");   mainMatrix.add(ed);
    ee = new Label("   ");   mainMatrix.add(ee);
    ef = new Label("   ");   mainMatrix.add(ef);
    eg = new Label("   ");   mainMatrix.add(eg);
    eh = new Label("   ");   mainMatrix.add(eh);
    ei = new Label("   ");   mainMatrix.add(ei);
    ej = new Label("   ");   mainMatrix.add(ej);
    ek = new Label("   ");   mainMatrix.add(ek);
    el = new Label("   ");   mainMatrix.add(el);
    fa = new Label("   ");   mainMatrix.add(fa);
    fb = new Label("   ");   mainMatrix.add(fb);
    fc = new Label("   ");   mainMatrix.add(fc);
    fd = new Label("   ");   mainMatrix.add(fd);
    fe = new Label("   ");   mainMatrix.add(fe);
    ff = new Label("   ");   mainMatrix.add(ff);
    fg = new Label("   ");   mainMatrix.add(fg);
    fh = new Label("   ");   mainMatrix.add(fh);
    fi = new Label("   ");   mainMatrix.add(fi);
    fj = new Label("   ");   mainMatrix.add(fj);
    fk = new Label("   ");   mainMatrix.add(fk);
    fl = new Label("   ");   mainMatrix.add(fl);
    ga = new Label("   ");   mainMatrix.add(ga);
    gb = new Label("   ");   mainMatrix.add(gb);
    gc = new Label("   ");   mainMatrix.add(gc);
    gd = new Label("   ");   mainMatrix.add(gd);
    ge = new Label("   ");   mainMatrix.add(ge);
    gf = new Label("   ");   mainMatrix.add(gf);
    gg = new Label("   ");   mainMatrix.add(gg);
    gh = new Label("   ");   mainMatrix.add(gh);
    gi = new Label("   ");   mainMatrix.add(gi);
    gj = new Label("   ");   mainMatrix.add(gj);
    gk = new Label("   ");   mainMatrix.add(gk);
    gl = new Label("   ");   mainMatrix.add(gl);
    ha = new Label("   ");   mainMatrix.add(ha);
    hb = new Label("   ");   mainMatrix.add(hb);
    hc = new Label("   ");   mainMatrix.add(hc);
    hd = new Label("   ");   mainMatrix.add(hd);
    he = new Label("   ");   mainMatrix.add(he);
    hf = new Label("   ");   mainMatrix.add(hf);
    hg = new Label("   ");   mainMatrix.add(hg);
    hh = new Label("   ");   mainMatrix.add(hh);
    hi = new Label("   ");   mainMatrix.add(hi);
    hj = new Label("   ");   mainMatrix.add(hj);
    hk = new Label("   ");   mainMatrix.add(hk);
    hl = new Label("   ");   mainMatrix.add(hl);
    ia = new Label("   ");   mainMatrix.add(ia);
    ib = new Label("   ");   mainMatrix.add(ib);
    ic = new Label("   ");   mainMatrix.add(ic);
    id = new Label("   ");   mainMatrix.add(id);
    ie = new Label("   ");   mainMatrix.add(ie);
    If = new Label("   ");   mainMatrix.add(If); // using capital I since "if" is a keyword
    ig = new Label("   ");   mainMatrix.add(ig);
    ih = new Label("   ");   mainMatrix.add(ih);
    ii = new Label("   ");   mainMatrix.add(ii);
    ij = new Label("   ");   mainMatrix.add(ij);
    ik = new Label("   ");   mainMatrix.add(ik);
    il = new Label("   ");   mainMatrix.add(il);
    ja = new Label("   ");   mainMatrix.add(ja);
    jb = new Label("   ");   mainMatrix.add(jb);
    jc = new Label("   ");   mainMatrix.add(jc);
    jd = new Label("   ");   mainMatrix.add(jd);
    je = new Label("   ");   mainMatrix.add(je);
    jf = new Label("   ");   mainMatrix.add(jf);
    jg = new Label("   ");   mainMatrix.add(jg);
    jh = new Label("   ");   mainMatrix.add(jh);
    ji = new Label("   ");   mainMatrix.add(ji);
    jj = new Label("   ");   mainMatrix.add(jj);
    jk = new Label("   ");   mainMatrix.add(jk);
    jl = new Label("   ");   mainMatrix.add(jl);
    ka = new Label("   ");   mainMatrix.add(ka);
    kb = new Label("   ");   mainMatrix.add(kb);
    kc = new Label("   ");   mainMatrix.add(kc);
    kd = new Label("   ");   mainMatrix.add(kd);
    ke = new Label("   ");   mainMatrix.add(ke);
    kf = new Label("   ");   mainMatrix.add(kf);
    kg = new Label("   ");   mainMatrix.add(kg);
    kh = new Label("   ");   mainMatrix.add(kh);
    ki = new Label("   ");   mainMatrix.add(ki);
    kj = new Label("   ");   mainMatrix.add(kj);
    kk = new Label("   ");   mainMatrix.add(kk);
    kl = new Label("   ");   mainMatrix.add(kl);
    la = new Label("   ");   mainMatrix.add(la);
    lb = new Label("   ");   mainMatrix.add(lb);
    lc = new Label("   ");   mainMatrix.add(lc);
    ld = new Label("   ");   mainMatrix.add(ld);
    le = new Label("   ");   mainMatrix.add(le);
    lf = new Label("   ");   mainMatrix.add(lf);
    lg = new Label("   ");   mainMatrix.add(lg);
    lh = new Label("   ");   mainMatrix.add(lh);
    li = new Label("   ");   mainMatrix.add(li);
    lj = new Label("   ");   mainMatrix.add(lj);
    lk = new Label("   ");   mainMatrix.add(lk);
    ll = new Label("   ");   mainMatrix.add(ll);

    
    // for the label set across the top:
    ax = new Label("   ");       xMatrix.add(ax);
    bx = new Label("   ");       xMatrix.add(bx);
    cx = new Label("   ");       xMatrix.add(cx);
    dx = new Label("   ");       xMatrix.add(dx);
    ex = new Label("   ");       xMatrix.add(ex);
    fx = new Label("   ");       xMatrix.add(fx);
    gx = new Label("   ");       xMatrix.add(gx);
    hx = new Label("   ");       xMatrix.add(hx);
    ix = new Label("   ");       xMatrix.add(ix);
    jx = new Label("   ");       xMatrix.add(jx);
    kx = new Label("   ");       xMatrix.add(kx);
    lx = new Label("   ");       xMatrix.add(lx);
    
    // for the label set down the side:
    ay = new Label("   ");       yMatrix.add(ay);
    by = new Label("   ");       yMatrix.add(by);
    cy = new Label("   ");       yMatrix.add(cy);
    dy = new Label("   ");       yMatrix.add(dy);
    ey = new Label("   ");       yMatrix.add(ey);
    fy = new Label("   ");       yMatrix.add(fy);
    gy = new Label("   ");       yMatrix.add(gy);
    hy = new Label("   ");       yMatrix.add(hy);
    iy = new Label("   ");       yMatrix.add(iy);
    jy = new Label("   ");       yMatrix.add(jy);
    ky = new Label("   ");       yMatrix.add(ky);
    ly = new Label("   ");       yMatrix.add(ly);

    ///////////////////////////////////////////////////////////////////////////
    //
    // Since I can't name the labels with numbers, I'm associating a Point()
    // with each Label() in the matrix. That way I'll be able to loop through
    // the individual cells in a systematic fashion using integers.    
    //
    ///////////////////////////////////////////////////////////////////////////

    // for the mainMatrixHash:
    mainMatrixHash = new Hashtable(144); // 12x12
    mainMatrixHash.put(new Point(0,0), aa);
    mainMatrixHash.put(new Point(0,1), ba);
    mainMatrixHash.put(new Point(0,2), ca);
    mainMatrixHash.put(new Point(0,3), da);
    mainMatrixHash.put(new Point(0,4), ea);
    mainMatrixHash.put(new Point(0,5), fa);
    mainMatrixHash.put(new Point(0,6), ga);
    mainMatrixHash.put(new Point(0,7), ha);
    mainMatrixHash.put(new Point(0,8), ia);
    mainMatrixHash.put(new Point(0,9), ja);
    mainMatrixHash.put(new Point(0,10), ka);
    mainMatrixHash.put(new Point(0,11), la);
    mainMatrixHash.put(new Point(1,0), ab);
    mainMatrixHash.put(new Point(1,1), bb);
    mainMatrixHash.put(new Point(1,2), cb);
    mainMatrixHash.put(new Point(1,3), db);
    mainMatrixHash.put(new Point(1,4), eb);
    mainMatrixHash.put(new Point(1,5), fb);
    mainMatrixHash.put(new Point(1,6), gb);
    mainMatrixHash.put(new Point(1,7), hb);
    mainMatrixHash.put(new Point(1,8), ib);
    mainMatrixHash.put(new Point(1,9), jb);
    mainMatrixHash.put(new Point(1,10), kb);
    mainMatrixHash.put(new Point(1,11), lb);
    mainMatrixHash.put(new Point(2,0), ac);
    mainMatrixHash.put(new Point(2,1), bc);
    mainMatrixHash.put(new Point(2,2), cc);
    mainMatrixHash.put(new Point(2,3), dc);
    mainMatrixHash.put(new Point(2,4), ec);
    mainMatrixHash.put(new Point(2,5), fc);
    mainMatrixHash.put(new Point(2,6), gc);
    mainMatrixHash.put(new Point(2,7), hc);
    mainMatrixHash.put(new Point(2,8), ic);
    mainMatrixHash.put(new Point(2,9), jc);
    mainMatrixHash.put(new Point(2,10), kc);
    mainMatrixHash.put(new Point(2,11), lc);
    mainMatrixHash.put(new Point(3,0), ad);
    mainMatrixHash.put(new Point(3,1), bd);
    mainMatrixHash.put(new Point(3,2), cd);
    mainMatrixHash.put(new Point(3,3), dd);
    mainMatrixHash.put(new Point(3,4), ed);
    mainMatrixHash.put(new Point(3,5), fd);
    mainMatrixHash.put(new Point(3,6), gd);
    mainMatrixHash.put(new Point(3,7), hd);
    mainMatrixHash.put(new Point(3,8), id);
    mainMatrixHash.put(new Point(3,9), jd);
    mainMatrixHash.put(new Point(3,10), kd);
    mainMatrixHash.put(new Point(3,11), ld);
    mainMatrixHash.put(new Point(4,0), ae);
    mainMatrixHash.put(new Point(4,1), be);
    mainMatrixHash.put(new Point(4,2), ce);
    mainMatrixHash.put(new Point(4,3), de);
    mainMatrixHash.put(new Point(4,4), ee);
    mainMatrixHash.put(new Point(4,5), fe);
    mainMatrixHash.put(new Point(4,6), ge);
    mainMatrixHash.put(new Point(4,7), he);
    mainMatrixHash.put(new Point(4,8), ie);
    mainMatrixHash.put(new Point(4,9), je);
    mainMatrixHash.put(new Point(4,10), ke);
    mainMatrixHash.put(new Point(4,11), le);
    mainMatrixHash.put(new Point(5,0), af);
    mainMatrixHash.put(new Point(5,1), bf);
    mainMatrixHash.put(new Point(5,2), cf);
    mainMatrixHash.put(new Point(5,3), df);
    mainMatrixHash.put(new Point(5,4), ef);
    mainMatrixHash.put(new Point(5,5), ff);
    mainMatrixHash.put(new Point(5,6), gf);
    mainMatrixHash.put(new Point(5,7), hf);
    mainMatrixHash.put(new Point(5,8), If); 
    mainMatrixHash.put(new Point(5,9), jf);
    mainMatrixHash.put(new Point(5,10), kf);
    mainMatrixHash.put(new Point(5,11), lf);
    mainMatrixHash.put(new Point(6,0), ag);
    mainMatrixHash.put(new Point(6,1), bg);
    mainMatrixHash.put(new Point(6,2), cg);
    mainMatrixHash.put(new Point(6,3), dg);
    mainMatrixHash.put(new Point(6,4), eg);
    mainMatrixHash.put(new Point(6,5), fg);
    mainMatrixHash.put(new Point(6,6), gg);
    mainMatrixHash.put(new Point(6,7), hg);
    mainMatrixHash.put(new Point(6,8), ig);
    mainMatrixHash.put(new Point(6,9), jg);
    mainMatrixHash.put(new Point(6,10), kg);
    mainMatrixHash.put(new Point(6,11), lg);
    mainMatrixHash.put(new Point(7,0), ah);
    mainMatrixHash.put(new Point(7,1), bh);
    mainMatrixHash.put(new Point(7,2), ch);
    mainMatrixHash.put(new Point(7,3), dh);
    mainMatrixHash.put(new Point(7,4), eh);
    mainMatrixHash.put(new Point(7,5), fh);
    mainMatrixHash.put(new Point(7,6), gh);
    mainMatrixHash.put(new Point(7,7), hh);
    mainMatrixHash.put(new Point(7,8), ih);
    mainMatrixHash.put(new Point(7,9), jh);
    mainMatrixHash.put(new Point(7,10), kh);
    mainMatrixHash.put(new Point(7,11), lh);
    mainMatrixHash.put(new Point(8,0), ai);
    mainMatrixHash.put(new Point(8,1), bi);
    mainMatrixHash.put(new Point(8,2), ci);
    mainMatrixHash.put(new Point(8,3), di);
    mainMatrixHash.put(new Point(8,4), ei);
    mainMatrixHash.put(new Point(8,5), fi);
    mainMatrixHash.put(new Point(8,6), gi);
    mainMatrixHash.put(new Point(8,7), hi);
    mainMatrixHash.put(new Point(8,8), ii);
    mainMatrixHash.put(new Point(8,9), ji);
    mainMatrixHash.put(new Point(8,10), ki);
    mainMatrixHash.put(new Point(8,11), li);
    mainMatrixHash.put(new Point(9,0), aj);
    mainMatrixHash.put(new Point(9,1), bj);
    mainMatrixHash.put(new Point(9,2), cj);
    mainMatrixHash.put(new Point(9,3), dj);
    mainMatrixHash.put(new Point(9,4), ej);
    mainMatrixHash.put(new Point(9,5), fj);
    mainMatrixHash.put(new Point(9,6), gj);
    mainMatrixHash.put(new Point(9,7), hj);
    mainMatrixHash.put(new Point(9,8), ij);
    mainMatrixHash.put(new Point(9,9), jj);
    mainMatrixHash.put(new Point(9,10), kj);
    mainMatrixHash.put(new Point(9,11), lj);
    mainMatrixHash.put(new Point(10,0), ak);
    mainMatrixHash.put(new Point(10,1), bk);
    mainMatrixHash.put(new Point(10,2), ck);
    mainMatrixHash.put(new Point(10,3), dk);
    mainMatrixHash.put(new Point(10,4), ek);
    mainMatrixHash.put(new Point(10,5), fk);
    mainMatrixHash.put(new Point(10,6), gk);
    mainMatrixHash.put(new Point(10,7), hk);
    mainMatrixHash.put(new Point(10,8), ik);
    mainMatrixHash.put(new Point(10,9), jk);
    mainMatrixHash.put(new Point(10,10), kk);
    mainMatrixHash.put(new Point(10,11), lk);
    mainMatrixHash.put(new Point(11,0), al);
    mainMatrixHash.put(new Point(11,1), bl);
    mainMatrixHash.put(new Point(11,2), cl);
    mainMatrixHash.put(new Point(11,3), dl);
    mainMatrixHash.put(new Point(11,4), el);
    mainMatrixHash.put(new Point(11,5), fl);
    mainMatrixHash.put(new Point(11,6), gl);
    mainMatrixHash.put(new Point(11,7), hl);
    mainMatrixHash.put(new Point(11,8), il);
    mainMatrixHash.put(new Point(11,9), jl);
    mainMatrixHash.put(new Point(11,10), kl);
    mainMatrixHash.put(new Point(11,11), ll);
    
    // for the xMatrixHash:
    xMatrixHash = new Hashtable(12);
    xMatrixHash.put(new Point(0,-1), ax);
    xMatrixHash.put(new Point(1,-1), bx);
    xMatrixHash.put(new Point(2,-1), cx);
    xMatrixHash.put(new Point(3,-1), dx);
    xMatrixHash.put(new Point(4,-1), ex);
    xMatrixHash.put(new Point(5,-1), fx);
    xMatrixHash.put(new Point(6,-1), gx);
    xMatrixHash.put(new Point(7,-1), hx);
    xMatrixHash.put(new Point(8,-1), ix);
    xMatrixHash.put(new Point(9,-1), jx);
    xMatrixHash.put(new Point(10,-1), kx);
    xMatrixHash.put(new Point(11,-1), lx);
    
    // for the yMatrixHash:
    yMatrixHash = new Hashtable(12);
    yMatrixHash.put(new Point(-1,0), ay);
    yMatrixHash.put(new Point(-1,1), by);
    yMatrixHash.put(new Point(-1,2), cy);
    yMatrixHash.put(new Point(-1,3), dy);
    yMatrixHash.put(new Point(-1,4), ey);
    yMatrixHash.put(new Point(-1,5), fy);
    yMatrixHash.put(new Point(-1,6), gy);
    yMatrixHash.put(new Point(-1,7), hy);
    yMatrixHash.put(new Point(-1,8), iy);
    yMatrixHash.put(new Point(-1,9), jy);
    yMatrixHash.put(new Point(-1,10), ky);
    yMatrixHash.put(new Point(-1,11), ly);




  } // ends layoutMatrix()
  
  void definePianoPolygons() {   // man this is tedious
        piano0 = new Polygon();
            piano0.addPoint(0,0); piano0.addPoint(27,0); piano0.addPoint(27, 50);
            piano0.addPoint(39, 50); piano0.addPoint(39, 100); piano0.addPoint(0,100); 
        piano1 = new Polygon();
            piano1.addPoint(28,0); piano1.addPoint(51,0); piano1.addPoint(51,50); piano1.addPoint(28,50);
        piano2 = new Polygon();
            piano2.addPoint(52,0); piano2.addPoint(67,0); piano2.addPoint(67, 50);
            piano2.addPoint(79, 50); piano2.addPoint(79, 100); piano2.addPoint(40,100);
            piano2.addPoint(40, 50); piano2.addPoint(52, 50);
        piano3 = new Polygon();
            piano3.addPoint(68,0); piano3.addPoint(91,0); piano3.addPoint(91,50); piano3.addPoint(68,50);
        piano4 = new Polygon();
            piano4.addPoint(92,0); piano4.addPoint(119,0); piano4.addPoint(119, 100);
            piano4.addPoint(80, 100); piano4.addPoint(80, 50); piano4.addPoint(92,50);
        piano5 = new Polygon();
            piano5.addPoint(120,0); piano5.addPoint(147,0); piano5.addPoint(147, 50);
            piano5.addPoint(159, 50); piano5.addPoint(159, 100); piano5.addPoint(120,100);
        
        piano6 = new Polygon();
            piano6.addPoint(148,0); piano6.addPoint(171,0); piano6.addPoint(171,50); piano6.addPoint(148,50);
        piano7 = new Polygon();
            piano7.addPoint(172,0); piano7.addPoint(187,0); piano7.addPoint(187, 50);
            piano7.addPoint(199, 50); piano7.addPoint(199, 100); piano7.addPoint(160,100);
            piano7.addPoint(160, 50); piano7.addPoint(172, 50);
        piano8 = new Polygon();
            piano8.addPoint(188,0); piano8.addPoint(211,0); piano8.addPoint(211,50); piano8.addPoint(188,50);
        piano9 = new Polygon();
            piano9.addPoint(212,0); piano9.addPoint(227,0); piano9.addPoint(227, 50);
            piano9.addPoint(239, 50); piano9.addPoint(239, 100); piano9.addPoint(200,100);
            piano9.addPoint(200, 50); piano9.addPoint(212, 50);
        piano10 = new Polygon();
            piano10.addPoint(228,0); piano10.addPoint(251,0); piano10.addPoint(251,50); piano10.addPoint(228,50);
        piano11 = new Polygon();
            piano11.addPoint(252,0); piano11.addPoint(280,0); piano11.addPoint(280, 100);
            piano11.addPoint(240, 100); piano11.addPoint(240, 50); piano11.addPoint(252,50);

  } // ends definePianoPolygons()
  
  void defineClockPolygons() {
    clock0 = new Polygon(); clock1 = new Polygon(); clock2 = new Polygon(); clock3 = new Polygon();
    clock4 = new Polygon(); clock5 = new Polygon(); clock6 = new Polygon(); clock7 = new Polygon();
    clock8 = new Polygon(); clock9 = new Polygon(); clock10 = new Polygon(); clock11 = new Polygon();
  
    Point p;
    Polygon poly[] = {clock0, clock1, clock2, clock3, clock4, clock5, clock6, clock7, clock8, clock9, clock10, clock11};
    for (int c = 0; c<12; c++) {
        p = clockPoint(c);
        poly[c].addPoint(p.x-12, p.y-12); poly[c].addPoint(p.x+12, p.y-12); 
        poly[c].addPoint(p.x+12, p.y+12); poly[c].addPoint(p.x-12, p.y+12);
    }
        
  } // ends defineClockPolygons()

} /////////////////////////////////////// ends class SetTheory


