D:\jtest> linenum < Piano.java
01 //Piano.java -- simple Piano, modified by tsaiwn@cs.nctu.edu.tw
02 // demo using MouseListener, KeyListener, MouseMotionListener
03 // .. as well as using Applet.newAudioClip, javax.sound.midi.*;
04 // This program can be run both as an Application and as an Applet
05 // *Note: MidiPlayer.java is required since we use it to play midi
06 import java.applet.*;
07 import java.awt.*;
08 import java.awt.event.*;
09 import java.net.*;
10
11 public class Piano extends MyApplet implements
12 MouseListener, KeyListener, MouseMotionListener
13 {
14 static boolean isApplication = false;
15 public static final String WELCOME = "welcome.au";
16 public static final int IMG_WIDTH=21;
17 public static final int IMG_HEIGHT=85;
18 public static final int NUM_KEYS = 20;
19 public static final int PIANO_WIDTH = IMG_WIDTH * NUM_KEYS + 18;
20 public final int STATE_UP = 0;
21 public final int STATE_DOWN=1;
22
23 Image m_ImgUp, m_ImgUp2; // image for key UP
24 Image m_ImgDown, m_ImgDown2; // image for key Down?
25 AudioClip[ ] m_AudioClip;
26 int[ ] m_nState;
27 int m_nOldDowkNumber = -1;
28
29 public Piano( ) { // Constructor
30 m_AudioClip = new AudioClip[NUM_KEYS]; // music tone
31 m_nState = new int[NUM_KEYS];
32 } // Piano(
33 public void start( ) {
34 super.start( );
35 //repaint( );
36 }// start(
37
38 public void init( ) {
39 for(int i=0; i < NUM_KEYS; i++) m_nState[i]=0;
40 //m_ImgUp=getImage(getDocumentBase( ),"img/up.gif");
41 //m_ImgDown=getImage(getDocumentBase( ),"img/down.gif");
42
43 m_ImgUp=newImageBoth("img/up.gif");
44 m_ImgDown=newImageBoth("img/down.gif");
45
46 m_ImgUp2=newImageBoth("img/up2.gif");
47 m_ImgDown2=newImageBoth("img/down2.gif");
48
49
50 MediaTracker mTracker=new MediaTracker(this);
51 mTracker.addImage(m_ImgUp, 0);
52 mTracker.addImage(m_ImgDown, 1);
53 mTracker.addImage(m_ImgUp2, 2);
54 mTracker.addImage(m_ImgDown2,3);
55 try {
56 mTracker.waitForID(0);
57 } catch(Exception e) {
58 System.out.println("m_ImgUp is not loaded!");
59 } // try..catch..
60
61 try {
62 mTracker.waitForID(1);
63 mTracker.waitForID(2);
64 mTracker.waitForID(3);
65 } catch(Exception e) {
66 System.out.println("m_ImgDown is not loaded!");
67 } //
68
69 for(int i=0; i < NUM_KEYS ; i++) {
70 String sFile = "au/" + i + ".au";
71 // m_AudioClip[i]=getAudioClip(getCodeBase( ), sFile);
72 AudioClip ac = newAudioBoth( sFile );
73 //if(ac==null) ... do other way
74 m_AudioClip[i]= ac;
75 } // for
76 addKeyListener(this);
77 addMouseListener(this);
78 addMouseMotionListener(this);
79 try { playSong( ); } catch(Exception e) {;}
80 } // init(
81
82 public void paint(Graphics g) {
83 for(int i=0;i < NUM_KEYS;i++) {
84 switch(m_nState[i]) {
85 case STATE_UP:
86 if(i>=7 && i<=13) g.drawImage(m_ImgUp2,i*IMG_WIDTH,0,this);
87 else g.drawImage(m_ImgUp,i*IMG_WIDTH,0,this);
88 System.out.print(" - ");
89 break;
90 case STATE_DOWN:
91 if(i>=7 && i<=13) g.drawImage(m_ImgDown2,i*IMG_WIDTH,0,this);
92 else g.drawImage(m_ImgDown,i*IMG_WIDTH,0,this);
93 System.out.print(" D ");
94 break;
95 } // switch
96 } // for
97 System.out.println("");
98 requestFocus( ); // so that we can use Keyboard
99 g.setFont( new Font("Arial", Font.BOLD, 24) );
100 setBackground(Color.CYAN);
101 setForeground( Color.magenta );
102 g.setColor( Color.blue );
103 g.drawString("Simple Piano", 28,118);
104 g.setColor( Color.magenta );
105 g.drawString("hit Y to change MIDI", 6, 150);
106 g.setColor( Color.RED );
107 g.drawString(" hit S to Stop MIDI", 6, 178);
108 } // paint(
109
110 void playSound(int kNumber) {
111 m_AudioClip[kNumber].play();
112 }
113
114 /////////////////////////////////////////////////////
115 ////////////// MouseListener handlers
116
117 public void mouseClicked(MouseEvent e) {
118 //Invoked when the mouse has been clicked on a component.
119 int nMouseCount = e.getClickCount();
120 System.out.println(" Mouse ClickCount = " + nMouseCount);
121 } //mouseClicked(
122
123 public void mouseEntered(MouseEvent e) { ; }
124
125 public void mouseExited(MouseEvent e) {
126 if(m_nOldDowkNumber!=-1)m_nState[m_nOldDowkNumber]=STATE_UP;
127 m_nOldDowkNumber=-1;
128 } // mouseExited(
129
130 public void mousePressed(MouseEvent e) {
131 int nX=e.getX();
132 int nY=e.getY();
133 System.out.println(" mouse pressed at "+nX +", " + nY);
134
135 int kNumber = nX/IMG_WIDTH;
136 m_nState[kNumber] = STATE_DOWN;
137 playSound(kNumber);
138 m_nOldDowkNumber=kNumber;
139 Graphics g=getGraphics();
140 g.fillRect(kNumber*IMG_WIDTH, 0, IMG_WIDTH, IMG_HEIGHT);
141 if(kNumber >= 7 && kNumber <= 13)
142 g.drawImage(m_ImgDown2, kNumber*IMG_WIDTH, 0, this);
143 else g.drawImage(m_ImgDown, kNumber*IMG_WIDTH, 0, this);
144 // repaint();
145 }
146 public void mouseReleased(MouseEvent e) {
147 //Invoked when a mouse button has been released on a component.
148 int nX=e.getX();
149 int nY=e.getY();
150 System.out.println(" mouse Releases at "+nX +", " + nY);
151
152 int kNumber=nX/IMG_WIDTH;
153 m_nState[kNumber]=STATE_UP;
154 m_nOldDowkNumber=-1;
155 Graphics g=getGraphics( );
156 if(kNumber >= 7 && kNumber <= 13)
157 g.drawImage(m_ImgUp2,kNumber*IMG_WIDTH,0,this);
158 else g.drawImage(m_ImgUp,kNumber*IMG_WIDTH,0,this);
159 // repaint();
160 } // mouseReleased(
161
162 /**************************************************
163 * KeyListener functions
164 *******/
165 int nc = 0;
166 public void keyPressed(KeyEvent e) {
167 //Invoked when a key has been pressed.
168 System.out.println("\nKey pressed: " + nc++ + "\n "+ e);
169 int nKeyCode=e.getKeyCode();
170 //System.out.println(" === the KeyCode is "+nKeyCode);
171 String sKeyName=e.getKeyText(nKeyCode);
172 //System.out.println(" === the KeyName is "+sKeyName);
173
174 boolean bControlDown=e.isControlDown( );
175 if(bControlDown)System.out.println(" .. Ctrl key is pressed");
176 else System.out.println(" .. without Ctrl key");
177
178 int kNumber = getkNumber(nKeyCode);
179 if(kNumber < 0) return;
180 if(bControlDown) kNumber += 7; // Raise tone
181
182 setPianoKeyDown(kNumber);
183 playSound(kNumber);
184 Graphics g=getGraphics( );
185 if(kNumber >= 7 && kNumber <= 13)
186 g.drawImage(m_ImgDown2, kNumber*IMG_WIDTH,0,this);
187 else g.drawImage(m_ImgDown, kNumber*IMG_WIDTH,0,this);
188 repaint( );
189 } // keyPressed(
190
191 private int getkNumber(int nKeyCode) {
192 int kNumber = -1;
193 switch(nKeyCode) { // do NOT forget Falling through
194 case KeyEvent.VK_1: kNumber=0;
195 break;
196 case KeyEvent.VK_2: kNumber=1;
197 break;
198 case KeyEvent.VK_3: kNumber=2;
199 break;
200 case KeyEvent.VK_4: kNumber=3;
201 break;
202 case KeyEvent.VK_5: kNumber=4;
203 break;
204 case KeyEvent.VK_6: kNumber=5;
205 break;
206 case KeyEvent.VK_7: kNumber=6;
207 break;
208 ///
209 case KeyEvent.VK_8: kNumber=7; break;
210 case KeyEvent.VK_9: kNumber=8; break;
211 case KeyEvent.VK_0: kNumber=9; break;
212
213 case KeyEvent.VK_MINUS: kNumber=10; break;
214 case KeyEvent.VK_EQUALS: kNumber=11; break;
215 case KeyEvent.VK_BACK_SPACE: kNumber=12; break;
216 default:
217 } // switch
218 return kNumber;
219 } // getkNumber(
220
221 public void keyReleased(KeyEvent e) {
222 //Invoked when a key has been released.
223 System.out.println(" !!! KeyReseased: " + e);
224 int nKeyCode=e.getKeyCode();
225 boolean bControlDown=e.isControlDown( );
226
227 int kNumber = getkNumber(nKeyCode);
228 if(kNumber < 0) return;
229 if(bControlDown) kNumber += 7;
230
231 m_nState[kNumber] = STATE_UP;
232 Graphics g=getGraphics( );
233 if(kNumber >= 7 && kNumber <= 13)
234 g.drawImage(m_ImgUp2,kNumber*IMG_WIDTH,0,this);
235 else g.drawImage(m_ImgUp,kNumber*IMG_WIDTH,0,this);
236 //repaint( );
237 } // keyReleased(
238
239 public void keyTyped(KeyEvent e) { // invoked when a key typed
240 int key = e.getKeyChar( );
241 System.out.println(" ***keyTyped=== the Key is "+ key);
242 if(key == 's' || key == 'S') stopSong( );
243
244 if(key == KeyEvent.VK_P) playSong( );
245 if(key == Character.toLowerCase(KeyEvent.VK_P) ) playSong( );
246 if(key == 'y' || key == 'Y') changeMidi( 1 ); // next
247 if(key == 'n' || key == 'N') changeMidi( 1 ); // next
248 if(key == 'j' || key == 'J') changeMidi( 5 ); // jump
249 if(key == 'f' || key == 'F') changeMidi( 66 ); // Fate5
250 if(key == 'l' || key == 'L') changeMidi( 77 ); //LiangJu
251 if(key == 'z' || key == 'Z') changeMidi( 99 ); // Last MIDI
252 if(key == 't' || key == 'T') changeMidi( 0 ); // First MIDI
253 if(key == 'b' || key == 'B') changeMidi( -1 ); // back one
254
255 return;
256 } //
257
258 private void setPianoKeyDown(int kNumber) {
259 for(int i=0; i < NUM_KEYS; i++) m_nState[i]=STATE_UP;
260 m_nState[kNumber] = STATE_DOWN; // ONLY this key Down
261 } // setPianoKeyDown(
262
263 private void setAllPianoKeyUp( ) {
264 for(int i=0; i < NUM_KEYS; i++) m_nState[i]=STATE_UP;
265 } // setAllPianoKeyUp(
266
267 ///////////////////////////////////////////////////////////////
268 //////// MouseMotionListener functions
269
270 public void mouseDragged(MouseEvent e) {
271 //Invoked when a mouse button is pressed on a component and then dragged.
272 int nX = e.getX( );
273 int nY = e.getY( );
274 System.out.println(" Mouse Dragged at x="+ nX +", y="+ nY);
275 int m_nTempCount = nX/IMG_WIDTH;
276 if(m_nTempCount == m_nOldDowkNumber)return;
277 m_nState[m_nTempCount] = STATE_DOWN;
278 m_nState[m_nOldDowkNumber] = STATE_UP;
279 playSound(m_nTempCount);
280 Graphics g = getGraphics( );
281
282 int tk = m_nTempCount;
283 if(tk >= 7 && tk <= 13)
284 g.drawImage(m_ImgDown2,m_nTempCount*IMG_WIDTH,0,this);
285 else g.drawImage(m_ImgDown,m_nTempCount*IMG_WIDTH,0,this);
286
287 //try{ Thread.sleep(68); }catch(Exception e3) {;} // 0.068 second
288
289 if(tk >= 7 && tk <= 13)
290 g.drawImage(m_ImgUp2,m_nOldDowkNumber*IMG_WIDTH,0,this);
291 else g.drawImage(m_ImgUp,m_nOldDowkNumber*IMG_WIDTH,0,this);
292
293 m_nOldDowkNumber = m_nTempCount;
294 } // mouseDragged(
295
296 public void mouseMoved(MouseEvent e) {
297 //Invoked when the mouse button has been
298 // .. moved on a component (with no buttons no down)
299 int nX=e.getX();
300 int nY=e.getY();
301 System.out.println(" Mouse cursor On x="+nX+", y="+nY);
302 } // mouseMoved(
303
304 ///////////////////////////////////////////////////
305 void playSong( ) {
306 javax.swing.SwingUtilities.invokeLater(new Runnable( ) {
307 public void run() {
308 midi = new MidiPlayer( );
309 midi.play( "mid/" + midiFile);
310 } // run(
311 }); // javax...
312 } // playSong(
313 void stopSong( ) {
314 if(midi != null) midi.stop( );
315 } //
316 /****
317 URL getMyURL(String filename) {
318 URL url = null;
319 try {
320 Toolkit tkt = Toolkit.getDefaultToolkit( );
321 Class me = getClass( ); // get The class is running
322 url = me.getResource(filename); // for Applet
323 } catch ( Exception e) {;}
324 if(url != null) return url;
325 try { // try as Application
326 URL codeBase = getCodeBase( );
327 url = new URL( codeBase + "/" + filename );
328 //url = new URL("file:" + System.getProperty("user.dir") + "/");
329 } catch ( Exception e ) {; }
330
331 return url;
332 } // getMyURL(
333 *******************************/
334
335 ///////////////////////////////////////////////////////////
336 //////// for application
337 void welcome( ) {
338 AudioClip ac = newAudioBoth( WELCOME );
339 ac.play( );
340 } // welcome(
341 public static void main(String[ ] args) {
342 isApplication = true;
343 Frame frame=new Frame( );
344 Piano piano=new Piano( );
345 piano.welcome( ); // say "大家好"
346 piano.init( ); // simulate Applet behavior..
347 piano.start( );
348 frame.add(piano);
349 frame.addWindowListener( new WindowAdapter( ) {
350 public void windowClosing(WindowEvent e) {System.exit(0);}
351 } ); // anonymous object
352 frame.setSize( PIANO_WIDTH, 238);
353 frame.setVisible(true);
354 for(int i=0; i < NUM_KEYS-3; ++i) { // :-) :-) :-)
355 piano.playSound(i);
356 try {Thread.sleep(158);}catch(Exception e) {;}
357 } // for
358 //try { piano.playSong( ); } catch(Exception e) {;}
359 //piano.repaint( );
360 System.out.println(" *** KeyEvent .VK_P = "+ KeyEvent.VK_P);
361 System.out.println(" S to stop midi. P to play midi.");
362 } // main(
363
364 String midis[ ] = {"together.mid", "yangming.mid", "fate5.mid"
365 ,"pocahont.mid" , "fairlady.mid", "busyhorse.mid"
366 , "tomarket.mid", "hillsong.mid", "liangju.mid"
367 ,"spring.mid","dreamring.mid","alice.mid", "love.mid","wind.mid"
368 }; // do NOT forget the ";"
369 String midiFile = midis[0];
370 int midiN = 0;
371 private void changeMidi( int nn ) {
372 midiN += nn;
373 if(nn < 0) midiN += midis.length;
374 if(nn == 0) midiN = 0;
375 if(nn == 66 ) midiN = 2; // the Fate #5
376 if(nn == 77 ) midiN = 8;
377 if(nn >= 99 ) midiN = midis.length -1; // last song
378 midiN = (midiN % midis.length ); // ensure correct
379 midiFile = midis[ midiN ]; // change the filename
380 System.out.println(" Now playing " + midiFile);
381 if(midi != null) {
382 midi.stop( ); // change it immediately
383 playSong( );
384 } // if
385 } // changeMidi(
386 MidiPlayer midi = null; // the midi Object which is playing
387 }// class Piano
D:\jtest>
D:\jtest> linenum < MidiPlayer.java
01 //MidiPlayer.java -- @CopyLeft by tsaiwn@cs.nctu.edu.tw
02 import java.io.*;
03 import javax.sound.midi.*;
04 import java.net.*;
05 import java.awt.*;
06 import java.applet.*;
07 ///////
08 class MidiPlayer extends Applet {
09 private Sequencer sequencer = null;
10 public Sequencer getSequencer( ) { return sequencer; }
11
12 public void play(String filename) { play(filename, false); }
13 public void play(String filename, boolean loop) {
14 try {
15 stop( );
16 sequencer = MidiSystem.getSequencer();
17
18 URL url = null;
19
20 try {
21 Toolkit tkt = Toolkit.getDefaultToolkit( );
22 Class me = getClass( ); // get The class is running
23 url = me.getResource(filename); // for Application ?
24 } catch ( Exception e) {;}
25 if(url == null) {
26 System.out.println(" Try getCodeBase( ) way ...");
27 try { // try again
28 URL codeBase = getCodeBase( );
29 url = new URL( codeBase + filename );
30 //url = new URL("file:" + System.getProperty("user.dir") + "/");
31 } catch ( Exception e ) {; }
32 } // if(url
33
34 sequencer.setSequence(MidiSystem.getSequence( url ));
35
36 if (loop)
37 sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
38 sequencer.open( );
39 sequencer.start( );
40 } catch (Exception e) {
41 System.err.println("MidiPlayer: " + e);
42 sequencer = null;
43 }
44 } //play(
45
46 public void stop( ) {
47 try {
48 if ((sequencer == null) || (!sequencer.isRunning())) return;
49 sequencer.stop( );
50 sequencer.close( );
51 }
52 catch (Exception e) {
53 System.err.println("MidiPlayer: " + e);
54 }
55 sequencer = null;
56 } //stop(
57
58 } // class MidiPlayer
D:\jtest>
|
|