Xylophone
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()<curFloor))&&(e.getY()<233))
ml.mousePressed(e);
}
public void destroy() {
removeMouseMotionListener(this);
}
public boolean action(Event e, Object arg) {
if (e.target instanceof Button) {
if (((Button)e.target).equals(playButton)) {
if (playButton.getLabel().equals(new String("Play"))) {
playButton.setLabel("Pause");
ss.play();
}
else {
ss.pause();
}
}
else if (((Button)e.target).equals(stopButton)) {
ss.stop();
}
else if (((Button)e.target).equals(deleteButton)) {
ss.stop();
ss.erase();
repaint(0,233,600,150);
}
else if (((Button)e.target).equals(deleteLastButton)) {
ss.stop();
ss.eraseLast();
repaint(0,233,600,150);
}
}
return super.action(e, arg);
}
}
public class SongSaver {
int[] noteList, rhythmList;
int currentSlot;
static int currentPlayingNote;
static boolean paused;
static boolean stopped;
SongSaver() {
noteList=new int[20];
rhythmList=new int[20];
currentSlot=0;
paused=false;
currentPlayingNote=0;
}
public void play() {
paused=false;
new PlayThread(this).start();
}
public void pause() {
paused=true;
}
public void stop() {
stopped=true;
paused=true;
}
public void addNote(int n) {
if (noteList[19]==0) {
noteList[currentSlot]=n+1;
rhythmList[currentSlot]=Xylophone.rhythmChoice.getSelectedIndex();
currentSlot++;
}
}
public void erase() {
noteList=new int[20];
currentSlot=0;
}
public void eraseLast() {
currentSlot--;
int i;
for (i=-1;i<19;i++) {
if (noteList[i+1]==0) {
noteList[i]=0;
i=20;
}
}
if (i==19) {
noteList[19]=0;
}
}
}
public class PlayThread extends Thread {
int[] noteList, rhythmList;
int currentSlot;
int currentPlayingNote;
PlayThread(SongSaver ss) {
this.noteList=ss.noteList;
this.rhythmList=ss.rhythmList;
this.currentPlayingNote=ss.currentPlayingNote;
}
public void run() {
int s;
for (int i=this.currentPlayingNote;(i<20)&&(noteList[i]!=0);i++) {
Xylophone.acArray[noteList[i]-1].play();
s=rhythmList[i];
if (s==0)
s=100*(Xylophone.tempoChoice.getSelectedIndex()*2+6)-80;
else if (s==1)
s=50*(Xylophone.tempoChoice.getSelectedIndex()*2+6)-80;
else
s=25*(Xylophone.tempoChoice.getSelectedIndex()*2+6)-80;
try {
Thread.sleep(s);
} catch(Exception e) {}
if (SongSaver.paused) {
currentPlayingNote=i;
i=20;
}
}
if (SongSaver.stopped) {
SongSaver.currentPlayingNote=0;
SongSaver.stopped=false;
}
else
SongSaver.currentPlayingNote=this.currentPlayingNote+1;
Xylophone.playButton.setLabel("Play");
if (!SongSaver.paused)
SongSaver.currentPlayingNote=0;
}
}
public class XyloListener implements MouseListener {
Xylophone xylo;
XyloListener(Xylophone xylo) {
super();
this.xylo=xylo;
}
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();
if (y<233) {
if (x<60) {
Xylophone.curFloor=-1; //negative denotes N/A
Xylophone.curCeiling=60;
}
else if (x<93) {
Xylophone.curFloor=60;
Xylophone.curCeiling=93;
if ((y<233) && (y>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();
}
}
Back to the Xylophone applet page.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|