這 ppp.jar 含有一個簡單的 Small Piano Emulatorр


③You can use the mouse
or press Key 1 to 7 on the Keyboard
or Ctrl+1 to Ctrl+7 for higher tone

可把 au 子目錄內的 0.au, 1.au, ..14.au 都換成你要的聲音

按 s 停止 MIDI, 按 p 開始 play MIDI
點這裡抓 ppp.jar
 
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>