import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;
public class Xylophone extends Applet implements MouseMotionListener {
static Image xyloImage, malletImage, mdImage, curImage, trebleClefImage, eighthImage, eighthImage2;
static AudioClip[] acArray;
static int mx=0, my=0;
static int curFloor=0, curCeiling=0;
static int curNote;
static SongSaver ss;
static Button playButton, stopButton, deleteButton, deleteLastButton; //play/pause are integrated
static Choice rhythmChoice, tempoChoice;
// static MouseListener ml;
static XyloListener ml;
static boolean up=true;
public void init() {
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
acArray=new AudioClip[15];
xyloImage=getImage(getCodeBase(), "xylo.jpg");
malletImage=getImage(getCodeBase(), "mallet.gif");
mdImage=getImage(getCodeBase(), "mallet_down.gif");
trebleClefImage=getImage(getCodeBase(), "treble_clef.gif");
eighthImage=getImage(getCodeBase(), "eighth_note.gif");
eighthImage2=getImage(getCodeBase(), "eighth_note2.gif");
curImage=malletImage;
ss=new SongSaver();
playButton=new Button("Play");
stopButton=new Button("Stop");
deleteButton=new Button("Delete All");
deleteLastButton=new Button("Delete Last Note");
rhythmChoice=new Choice();
rhythmChoice.addItem("Quarter Note");
rhythmChoice.addItem("Eighth Note");
rhythmChoice.addItem("Sixteenth Note");
tempoChoice=new Choice();
tempoChoice.addItem("100 beats per minute");
tempoChoice.addItem("80 beats per minute");
tempoChoice.addItem("60 beats per minute");
add(playButton);
add(stopButton);
add(deleteLastButton);
add(deleteButton);
add(rhythmChoice);
add(tempoChoice);
try {
acArray[0]=getAudioClip(getCodeBase(), "x0.au");
acArray[1]=getAudioClip(getCodeBase(), "x1.au");
acArray[2]=getAudioClip(getCodeBase(), "x2.au");
acArray[3]=getAudioClip(getCodeBase(), "x3.au");
acArray[4]=getAudioClip(getCodeBase(), "x4.au");
acArray[5]=getAudioClip(getCodeBase(), "x5.au");
acArray[6]=getAudioClip(getCodeBase(), "x6.au");
acArray[7]=getAudioClip(getCodeBase(), "x7.au");
acArray[8]=getAudioClip(getCodeBase(), "x8.au");
acArray[9]=getAudioClip(getCodeBase(), "x9.au");
acArray[10]=getAudioClip(getCodeBase(), "x10.au");
acArray[11]=getAudioClip(getCodeBase(), "x11.au");
acArray[12]=getAudioClip(getCodeBase(), "x12.au");
acArray[13]=getAudioClip(getCodeBase(), "x13.au");
acArray[14]=getAudioClip(getCodeBase(), "x14.au");
} catch(Exception e) {System.out.println("ALL FILES MUST BE IN THE SAME DIRECTORY");}
addMouseMotionListener(this);
ml=new XyloListener(this);
// ml=new MouseAdapter() {
// public void mousePressed(MouseEvent e) {
// int x=e.getX();
// int y=e.getY();
// if (y<233) {
// if (x<60) {
// curFloor=-1; //negative denotes N/A
// curCeiling=60;
// }
// else if (x<93) {
// curFloor=60;
// curCeiling=93;
// // curNote=0;
// if ((y<233) && (y>0)) {
// acArray[0].play();
// ss.addNote(0);
// }
// }
// else if (x<125) {
// curFloor=93;
// curCeiling=125;
// // curNote=1;
// if ((y<233) && (y>0)) {
// acArray[1].play();
// ss.addNote(1);
// }
// }
// else if (x<158) {
// curFloor=125;
// curCeiling=158;
// //curNote=2;
// if ((y<223) && (y>0)) {
// acArray[2].play();
// ss.addNote(2);
// }
// }
// else if (x<191) {
// curFloor=158;
// curCeiling=191;
// //curNote=3;
// if ((y<220) && (y>0)) {
// acArray[3].play();
// ss.addNote(3);
// }
// }
// else if (x<223) {
// curFloor=191;
// curCeiling=223;
// // curNote=4;
// if ((y<218) && (y>0)) {
// acArray[4].play();
// ss.addNote(4);
// }
// }
// else if (x<257) {
// curFloor=223;
// curCeiling=257;
// // curNote=5;
// if ((y<215) && (y>0)) {
// acArray[5].play();
// ss.addNote(5);
// }
// }
// else if (x<289) {
// curFloor=257;
// curCeiling=289;
// if ((y<210) && (y>0)) {
// acArray[6].play();
// ss.addNote(6);
// }
// }
// else if (x<322) {
// curFloor=289;
// curCeiling=322;
// if ((y<207) && (y>0)) {
// acArray[7].play();
// ss.addNote(7);
// }
// }
// else if (x<354) {
// curFloor=322;
// curCeiling=354;
// if ((y<206) && (y>0)) {
// acArray[8].play();
// ss.addNote(8);
// }
// }
// else if (x<387) {
// curFloor=354;
// curCeiling=387;
// if ((y<202) && (y>0)) {
// acArray[9].play();
// ss.addNote(9);
// }
// }
// else if (x<416) {
// curFloor=387;
// curCeiling=416;
// if ((y<197) && (y>0)) {
// acArray[10].play();
// ss.addNote(10);
// }
// }
// else if (x<448) {
// curFloor=416;
// curCeiling=448;
// if ((y<194) && (y>0)) {
// acArray[11].play();
// ss.addNote(11);
// }
// }
// else if (x<478) {
// curFloor=448;
// curCeiling=478;
// if ((y<192) && (y>0)) {
// acArray[12].play();
// ss.addNote(12);
// }
// }
// else if (x<508) {
// curFloor=478;
// curCeiling=508;
// if ((y<189) && (y>25)) {
// acArray[13].play();
// ss.addNote(13);
// }
// }
// else if (x<538) {
// curFloor=508;
// curCeiling=538;
// if ((y<187) && (y>29)) {
// acArray[14].play();
// ss.addNote(14);
// }
// }
// else {
// curFloor=538;
// curCeiling=1601;
// }
// curImage=mdImage;
// repaint(mx, my, 37, 290);
// repaint(0,233, 575, 85);
// }
// else {
// if ((y>=236) && (y<241)) {
// ss.addNote(14);
// acArray[14].play();
// }
// else if (y<246) {
// ss.addNote(13);
// acArray[13].play();
// }
// else if (y<251) {
// ss.addNote(12);
// acArray[12].play();
// }
// else if (y<256) {
// ss.addNote(11);
// acArray[11].play();
// }
// else if (y<261) {
// ss.addNote(10);
// acArray[10].play();
// }
// else if (y<266) {
// ss.addNote(9);
// acArray[9].play();
// }
// else if (y<271) {
// ss.addNote(8);
// acArray[8].play();
// }
// else if (y<276) {
// ss.addNote(7);
// acArray[7].play();
// }
// else if (y<281) {
// ss.addNote(6);
// acArray[6].play();
// }
// else if (y<286) {
// ss.addNote(5);
// acArray[5].play();
// }
// else if (y<291) {
// ss.addNote(4);
// acArray[4].play();
// }
// else if (y<296) {
// ss.addNote(3);
// acArray[3].play();
// }
// else if (y<301) {
// ss.addNote(2);
// acArray[2].play();
// }
// else if (y<306) {
// ss.addNote(1);
// acArray[1].play();
// }
// else if (y<311) {
// ss.addNote(0);
// acArray[0].play();
// }
// repaint(0,233, 575, 85);
// }
// }
// public void mouseReleased(MouseEvent e) {
// curImage=malletImage;
// repaint(mx, my, 37, 290);
// }
// public void mouseClicked(MouseEvent e) {
// }
// public void mouseEntered(MouseEvent e) {
// int y=e.getY();
// if (y>233) {
// if (up) {
// up=false;
// setCursor(new Cursor(Cursor.HAND_CURSOR));
// }
// }
// else {
// if (!up) {
// up=true;
// setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
// }
// }
// repaint();
// }
//
// public void mouseExited(MouseEvent e) {
// repaint();
// }
//};
addMouseListener(ml);
}
public void paint(Graphics g) {
g.drawImage(xyloImage, 0,0,this);
g.drawImage(trebleClefImage, 0,250,this);
g.setColor(Color.black);
g.drawLine(0,258,575,258);
g.drawLine(0,268,575,268);
g.drawLine(0,278,575,278);
g.drawLine(0,288,575,288);
g.drawLine(0,298,575,298);
for(int i=0;i<20;i++) {
if (ss.noteList[i]!=0) {
g.fillOval(50+25*i, 303-5*(ss.noteList[i]-1)+1, 12, 9);
if (ss.noteList[i]==1)
g.drawLine(50+25*i-3,308,50+25*i+15,308);
else if (ss.noteList[i]>12) {
g.drawLine(50+25*i-3,248,50+25*i+15,248);
if (ss.noteList[i]==15)
g.drawLine(50+25*i-3,238,50+25*i+15,238);
}
if (ss.noteList[i]<7) {
g.drawLine(62+25*i, 303-5*(ss.noteList[i]-1)+5, 62+25*i, 303-5*(ss.noteList[i]-1)-28);
switch (ss.rhythmList[i]) {
case 2: g.drawImage(eighthImage, 62+25*i, 303-5*(ss.noteList[i]-1)-20, this);
case 1: g.drawImage(eighthImage, 62+25*i, 303-5*(ss.noteList[i]-1)-28, this);
}
}
else {
g.drawLine(50+25*i, 303-5*(ss.noteList[i]-1)+5, 50+25*i, 303-5*(ss.noteList[i]-1)+38);
switch (ss.rhythmList[i]) {
case 2: g.drawImage(eighthImage2, 50+25*i-6, 303-5*(ss.noteList[i]-1)+12, this);
case 1: g.drawImage(eighthImage2, 50+25*i-6, 303-5*(ss.noteList[i]-1)+20, this);
}
}
}
}
if (up) {
g.drawImage(curImage, mx, my, this);
}
}
public void mouseMoved(MouseEvent e) {
int x=e.getX();
int y=e.getY();
if (y>233) {
if (up) {
up=false;
setCursor(new Cursor(Cursor.HAND_CURSOR));
repaint();
}
}
else {
if (!up) {
up=true;
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
}
}
int tempY=0;
if (y-15-my>0)
tempY=my;
else
tempY=y-16;
if (y<233) {
if (x-mx>18) {
repaint(mx, tempY, x-mx+20, 290);
}
else {
repaint(x-18,tempY,54+mx-x,290);
}
}
mx=x-18;
my=y-15;
}
public void mouseDragged(MouseEvent e) {
int x=e.getX();
int y=e.getY();
if (y>233) {
if (up) {
up=false;
setCursor(new Cursor(Cursor.HAND_CURSOR));
repaint();
}
}
else {
if (!up) {
up=true;
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
}
}
int tempY=0;
if (y-15-my>0)
tempY=my;
else
tempY=y-16;
if (y<233) {
if (x-mx>18) {
repaint(mx, tempY, x-mx+20, 290);
}
else {
repaint(x-18,tempY,54+mx-x,290);
}
}
mx=x-18;
my=y-15;
if (((e.getX()>curCeiling)||(e.getX()0)) {
Xylophone.acArray[0].play();
Xylophone.ss.addNote(0);
}
}
else if (x<125) {
Xylophone.curFloor=93;
Xylophone.curCeiling=125;
if ((y<233) && (y>0)) {
Xylophone.acArray[1].play();
Xylophone.ss.addNote(1);
}
}
else if (x<158) {
Xylophone.curFloor=125;
Xylophone.curCeiling=158;
if ((y<223) && (y>0)) {
Xylophone.acArray[2].play();
Xylophone.ss.addNote(2);
}
}
else if (x<191) {
Xylophone.curFloor=158;
Xylophone.curCeiling=191;
if ((y<220) && (y>0)) {
Xylophone.acArray[3].play();
Xylophone.ss.addNote(3);
}
}
else if (x<223) {
Xylophone.curFloor=191;
Xylophone.curCeiling=223;
if ((y<218) && (y>0)) {
Xylophone.acArray[4].play();
Xylophone.ss.addNote(4);
}
}
else if (x<257) {
Xylophone.curFloor=223;
Xylophone.curCeiling=257;
if ((y<215) && (y>0)) {
Xylophone.acArray[5].play();
Xylophone.ss.addNote(5);
}
}
else if (x<289) {
Xylophone.curFloor=257;
Xylophone.curCeiling=289;
if ((y<210) && (y>0)) {
Xylophone.acArray[6].play();
Xylophone.ss.addNote(6);
}
}
else if (x<322) {
Xylophone.curFloor=289;
Xylophone.curCeiling=322;
if ((y<207) && (y>0)) {
Xylophone.acArray[7].play();
Xylophone.ss.addNote(7);
}
}
else if (x<354) {
Xylophone.curFloor=322;
Xylophone.curCeiling=354;
if ((y<206) && (y>0)) {
Xylophone.acArray[8].play();
Xylophone.ss.addNote(8);
}
}
else if (x<387) {
Xylophone.curFloor=354;
Xylophone.curCeiling=387;
if ((y<202) && (y>0)) {
Xylophone.acArray[9].play();
Xylophone.ss.addNote(9);
}
}
else if (x<416) {
Xylophone.curFloor=387;
Xylophone.curCeiling=416;
if ((y<197) && (y>0)) {
Xylophone.acArray[10].play();
Xylophone.ss.addNote(10);
}
}
else if (x<448) {
Xylophone.curFloor=416;
Xylophone.curCeiling=448;
if ((y<194) && (y>0)) {
Xylophone.acArray[11].play();
Xylophone.ss.addNote(11);
}
}
else if (x<478) {
Xylophone.curFloor=448;
Xylophone.curCeiling=478;
if ((y<192) && (y>0)) {
Xylophone.acArray[12].play();
Xylophone.ss.addNote(12);
}
}
else if (x<508) {
Xylophone.curFloor=478;
Xylophone.curCeiling=508;
if ((y<189) && (y>25)) {
Xylophone.acArray[13].play();
Xylophone.ss.addNote(13);
}
}
else if (x<538) {
Xylophone.curFloor=508;
Xylophone.curCeiling=538;
if ((y<187) && (y>29)) {
Xylophone.acArray[14].play();
Xylophone.ss.addNote(14);
}
}
else {
Xylophone.curFloor=538;
Xylophone.curCeiling=1601;
}
Xylophone.curImage=Xylophone.mdImage;
xylo.repaint(Xylophone.mx, Xylophone.my, 37, 290);
xylo.repaint(0,233, 575, 85);
}
else {
if (y<236)
;
else if (y<241) {
Xylophone.ss.addNote(14);
Xylophone.acArray[14].play();
}
else if (y<246) {
Xylophone.ss.addNote(13);
Xylophone.acArray[13].play();
}
else if (y<251) {
Xylophone.ss.addNote(12);
Xylophone.acArray[12].play();
}
else if (y<256) {
Xylophone.ss.addNote(11);
Xylophone.acArray[11].play();
}
else if (y<261) {
Xylophone.ss.addNote(10);
Xylophone.acArray[10].play();
}
else if (y<266) {
Xylophone.ss.addNote(9);
Xylophone.acArray[9].play();
}
else if (y<271) {
Xylophone.ss.addNote(8);
Xylophone.acArray[8].play();
}
else if (y<276) {
Xylophone.ss.addNote(7);
Xylophone.acArray[7].play();
}
else if (y<281) {
Xylophone.ss.addNote(6);
Xylophone.acArray[6].play();
}
else if (y<286) {
Xylophone.ss.addNote(5);
Xylophone.acArray[5].play();
}
else if (y<291) {
Xylophone.ss.addNote(4);
Xylophone.acArray[4].play();
}
else if (y<296) {
Xylophone.ss.addNote(3);
Xylophone.acArray[3].play();
}
else if (y<301) {
Xylophone.ss.addNote(2);
Xylophone.acArray[2].play();
}
else if (y<306) {
Xylophone.ss.addNote(1);
Xylophone.acArray[1].play();
}
else if (y<311) {
Xylophone.ss.addNote(0);
Xylophone.acArray[0].play();
}
xylo.repaint(0,233, 575, 85);
}
}
public void mouseReleased(MouseEvent e) {
Xylophone.curImage=Xylophone.malletImage;
xylo.repaint(Xylophone.mx, Xylophone.my, 37, 290);
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
int y=e.getY();
if (y>233) {
if (Xylophone.up) {
Xylophone.up=false;
xylo.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
}
else {
if (!Xylophone.up) {
Xylophone.up=true;
xylo.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
}
}
xylo.repaint();
}
public void mouseExited(MouseEvent e) {
xylo.repaint();
}
}