Java swing实现支持录音等功能的钢琴程序

作者:明礼馨德 时间:2022-08-21 12:30:16 

今天给大家介绍一下Java实现钢琴的小程序,程序虽小,功能挺多,支持循环播放,录音等功能,首先简单介绍下源码结构:

先看看钢琴界面实现,添加相应滴监听事件:


/*
* @(#)MidiSynth.java 1.15 99/12/03
*
* Copyright (c) 1999 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.sound.midi.*;
import java.util.Vector;

import java.io.File;
import java.io.IOException;

/**
* Illustrates general MIDI melody instruments and MIDI controllers.
*
* @version @(#)MidiSynth.java 1.15 99/12/03
* @author Brian Lichtenwalter
*/
public class MidiSynth extends JPanel implements ControlContext {

final int PROGRAM = 192;
 final int NOTEON = 144;
 final int NOTEOFF = 128;
 final int SUSTAIN = 64;
 final int REVERB = 91;
 final int ON = 0, OFF = 1;
 final Color jfcBlue = new Color(204, 204, 255);
 final Color pink = new Color(255, 175, 175);
 Sequencer sequencer;
 Sequence sequence;
 Synthesizer synthesizer;
 Instrument instruments[];
 ChannelData channels[];
 ChannelData cc;  // current channel
 JCheckBox mouseOverCB = new JCheckBox("mouseOver", true);
 JSlider veloS, presS, bendS, revbS;
 JCheckBox soloCB, monoCB, muteCB, sustCB;
 Vector keys = new Vector();
 Vector whiteKeys = new Vector();
 JTable table;
 Piano piano;
 boolean record;
 Track track;
 long startTime;
 RecordFrame recordFrame;
 Controls controls;

public MidiSynth() {
   setLayout(new BorderLayout());

JPanel p = new JPanel();
   p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
   EmptyBorder eb = new EmptyBorder(5,5,5,5);
   BevelBorder bb = new BevelBorder(BevelBorder.LOWERED);
   CompoundBorder cb = new CompoundBorder(eb,bb);
   p.setBorder(new CompoundBorder(cb,eb));
   JPanel pp = new JPanel(new BorderLayout());
   pp.setBorder(new EmptyBorder(10,20,10,5));
   pp.add(piano = new Piano());
   p.add(pp);
   p.add(controls = new Controls());
   p.add(new InstrumentsTable());

add(p);
 }

public void open() {
   try {
     if (synthesizer == null) {
       if ((synthesizer = MidiSystem.getSynthesizer()) == null) {
         System.out.println("getSynthesizer() failed!");
         return;
       }
     }
     synthesizer.open();
     sequencer = MidiSystem.getSequencer();
     sequence = new Sequence(Sequence.PPQ, 10);
   } catch (Exception ex) { ex.printStackTrace(); return; }

Soundbank sb = synthesizer.getDefaultSoundbank();
if (sb != null) {
     instruments = synthesizer.getDefaultSoundbank().getInstruments();
     synthesizer.loadInstrument(instruments[0]);
   }
   MidiChannel midiChannels[] = synthesizer.getChannels();
   channels = new ChannelData[midiChannels.length];
   for (int i = 0; i < channels.length; i++) {
     channels[i] = new ChannelData(midiChannels[i], i);
   }
   cc = channels[0];

ListSelectionModel lsm = table.getSelectionModel();
   lsm.setSelectionInterval(0,0);
   lsm = table.getColumnModel().getSelectionModel();
   lsm.setSelectionInterval(0,0);
 }

public void close() {
   if (synthesizer != null) {
     synthesizer.close();
   }
   if (sequencer != null) {
     sequencer.close();
   }
   sequencer = null;
   synthesizer = null;
   instruments = null;
   channels = null;
   if (recordFrame != null) {
     recordFrame.dispose();
     recordFrame = null;
   }
 }

/**
  * given 120 bpm:
  *  (120 bpm) / (60 seconds per minute) = 2 beats per second
  *  2 / 1000 beats per millisecond
  *  (2 * resolution) ticks per second
  *  (2 * resolution)/1000 ticks per millisecond, or
  *   (resolution / 500) ticks per millisecond
  *  ticks = milliseconds * resolution / 500
  */
 public void createShortEvent(int type, int num) {
   ShortMessage message = new ShortMessage();
   try {
     long millis = System.currentTimeMillis() - startTime;
     long tick = millis * sequence.getResolution() / 500;
     message.setMessage(type+cc.num, num, cc.velocity);
     MidiEvent event = new MidiEvent(message, tick);
     track.add(event);
   } catch (Exception ex) { ex.printStackTrace(); }
 }

/**
  * Black and white keys or notes on the piano.
  */
 class Key extends Rectangle {
   int noteState = OFF;
   int kNum;
   public Key(int x, int y, int width, int height, int num) {
     super(x, y, width, height);
     kNum = num;
   }
   public boolean isNoteOn() {
     return noteState == ON;
   }
   public void on() {
     setNoteState(ON);
     cc.channel.noteOn(kNum, cc.velocity);
     if (record) {
       createShortEvent(NOTEON, kNum);
     }
   }
   public void off() {
     setNoteState(OFF);
     cc.channel.noteOff(kNum, cc.velocity);
     if (record) {
       createShortEvent(NOTEOFF, kNum);
     }
   }
   public void setNoteState(int state) {
     noteState = state;
   }
 } // End class Key

/**
  * Piano renders black & white keys and plays the notes for a MIDI
  * channel.
  */
 class Piano extends JPanel implements MouseListener {

Vector blackKeys = new Vector();
   Key prevKey;
   final int kw = 16, kh = 80;

public Piano() {
     setLayout(new BorderLayout());
     setPreferredSize(new Dimension(42*kw, kh+1));
     int transpose = 24;
     int whiteIDs[] = { 0, 2, 4, 5, 7, 9, 11 };

for (int i = 0, x = 0; i < 6; i++) {
       for (int j = 0; j < 7; j++, x += kw) {
         int keyNum = i * 12 + whiteIDs[j] + transpose;
         whiteKeys.add(new Key(x, 0, kw, kh, keyNum));
       }
     }
     for (int i = 0, x = 0; i < 6; i++, x += kw) {
       int keyNum = i * 12 + transpose;
       blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+1));
       blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+3));
       x += kw;
       blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+6));
       blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+8));
       blackKeys.add(new Key((x += kw)-4, 0, kw/2, kh/2, keyNum+10));
     }
     keys.addAll(blackKeys);
     keys.addAll(whiteKeys);

addMouseMotionListener(new MouseMotionAdapter() {
       public void mouseMoved(MouseEvent e) {
         if (mouseOverCB.isSelected()) {
           Key key = getKey(e.getPoint());
           if (prevKey != null && prevKey != key) {
             prevKey.off();
           }
           if (key != null && prevKey != key) {
             key.on();
           }
           prevKey = key;
           repaint();
         }
       }
     });
     addMouseListener(this);
   }

public void mousePressed(MouseEvent e) {
     prevKey = getKey(e.getPoint());
     if (prevKey != null) {
       prevKey.on();
       repaint();
     }
   }
   public void mouseReleased(MouseEvent e) {
     if (prevKey != null) {
       prevKey.off();
       repaint();
     }
   }
   public void mouseExited(MouseEvent e) {
     if (prevKey != null) {
       prevKey.off();
       repaint();
       prevKey = null;
     }
   }
   public void mouseClicked(MouseEvent e) { }
   public void mouseEntered(MouseEvent e) { }

public Key getKey(Point point) {
     for (int i = 0; i < keys.size(); i++) {
       if (((Key) keys.get(i)).contains(point)) {
         return (Key) keys.get(i);
       }
     }
     return null;
   }

public void paint(Graphics g) {
     Graphics2D g2 = (Graphics2D) g;
     Dimension d = getSize();

g2.setBackground(getBackground());
     g2.clearRect(0, 0, d.width, d.height);

g2.setColor(Color.white);
     g2.fillRect(0, 0, 42*kw, kh);

for (int i = 0; i < whiteKeys.size(); i++) {
       Key key = (Key) whiteKeys.get(i);
       if (key.isNoteOn()) {
         g2.setColor(record ? pink : jfcBlue);
         g2.fill(key);
       }
       g2.setColor(Color.black);
       g2.draw(key);
     }
     for (int i = 0; i < blackKeys.size(); i++) {
       Key key = (Key) blackKeys.get(i);
       if (key.isNoteOn()) {
         g2.setColor(record ? pink : jfcBlue);
         g2.fill(key);
         g2.setColor(Color.black);
         g2.draw(key);
       } else {
         g2.setColor(Color.black);
         g2.fill(key);
       }
     }
   }
 } // End class Piano

/**
  * Stores MidiChannel information.
  */
 class ChannelData {

MidiChannel channel;
   boolean solo, mono, mute, sustain;
   int velocity, pressure, bend, reverb;
   int row, col, num;

public ChannelData(MidiChannel channel, int num) {
     this.channel = channel;
     this.num = num;
     velocity = pressure = bend = reverb = 64;
   }

public void setComponentStates() {
     table.setRowSelectionInterval(row, row);
     table.setColumnSelectionInterval(col, col);

soloCB.setSelected(solo);
     monoCB.setSelected(mono);
     muteCB.setSelected(mute);
     //sustCB.setSelected(sustain);

JSlider slider[] = { veloS, presS, bendS, revbS };
     int v[] = { velocity, pressure, bend, reverb };
     for (int i = 0; i < slider.length; i++) {
       TitledBorder tb = (TitledBorder) slider[i].getBorder();
       String s = tb.getTitle();
       tb.setTitle(s.substring(0, s.indexOf('=')+1)+s.valueOf(v[i]));
       slider[i].repaint();
     }
   }
 } // End class ChannelData

/**
  * Table for 128 general MIDI melody instuments.
  */
 class InstrumentsTable extends JPanel {

private String names[] = {
     "Piano", "Chromatic Perc.", "Organ", "Guitar",
     "Bass", "Strings", "Ensemble", "Brass",
     "Reed", "Pipe", "Synth Lead", "Synth Pad",
     "Synth Effects", "Ethnic", "Percussive", "Sound Effects" };
   private int nRows = 8;
   private int nCols = names.length; // just show 128 instruments

public InstrumentsTable() {
     setLayout(new BorderLayout());

TableModel dataModel = new AbstractTableModel() {
       public int getColumnCount() { return nCols; }
       public int getRowCount() { return nRows;}
       public Object getValueAt(int r, int c) {
         if (instruments != null) {
           return instruments[c*nRows+r].getName();
         } else {
           return Integer.toString(c*nRows+r);
         }
       }
       public String getColumnName(int c) {
         return names[c];
       }
       public Class getColumnClass(int c) {
         return getValueAt(0, c).getClass();
       }
       public boolean isCellEditable(int r, int c) {return false;}
       public void setValueAt(Object obj, int r, int c) {}
     };

table = new JTable(dataModel);
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

// Listener for row changes
     ListSelectionModel lsm = table.getSelectionModel();
     lsm.addListSelectionListener(new ListSelectionListener() {
       public void valueChanged(ListSelectionEvent e) {
         ListSelectionModel sm = (ListSelectionModel) e.getSource();
         if (!sm.isSelectionEmpty()) {
           cc.row = sm.getMinSelectionIndex();
         }
         programChange(cc.col*nRows+cc.row);
       }
     });

// Listener for column changes
     lsm = table.getColumnModel().getSelectionModel();
     lsm.addListSelectionListener(new ListSelectionListener() {
       public void valueChanged(ListSelectionEvent e) {
         ListSelectionModel sm = (ListSelectionModel) e.getSource();
         if (!sm.isSelectionEmpty()) {
           cc.col = sm.getMinSelectionIndex();
         }
         programChange(cc.col*nRows+cc.row);
       }
     });

table.setPreferredScrollableViewportSize(new Dimension(nCols*110, 200));
     table.setCellSelectionEnabled(true);
     table.setColumnSelectionAllowed(true);
     for (int i = 0; i < names.length; i++) {
       TableColumn column = table.getColumn(names[i]);
       column.setPreferredWidth(110);
     }
     table.setAutoResizeMode(table.AUTO_RESIZE_OFF);

JScrollPane sp = new JScrollPane(table);
     sp.setVerticalScrollBarPolicy(sp.VERTICAL_SCROLLBAR_NEVER);
     sp.setHorizontalScrollBarPolicy(sp.HORIZONTAL_SCROLLBAR_ALWAYS);
     add(sp);
   }

public Dimension getPreferredSize() {
     return new Dimension(800,170);
   }
   public Dimension getMaximumSize() {
     return new Dimension(800,170);
   }

private void programChange(int program) {
     if (instruments != null) {
       synthesizer.loadInstrument(instruments[program]);
     }
     cc.channel.programChange(program);
     if (record) {
       createShortEvent(PROGRAM, program);
     }
   }
 }

/**
  * A collection of MIDI controllers.
  */
 class Controls extends JPanel implements ActionListener, ChangeListener, ItemListener {

public JButton recordB;
   JMenu menu;
   int fileNum = 0;

public Controls() {
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
     setBorder(new EmptyBorder(5,10,5,10));

JPanel p = new JPanel();
     p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));

veloS = createSlider("Velocity", p);
     presS = createSlider("Pressure", p);
     revbS = createSlider("Reverb", p);

// create a slider with a 14-bit range of values for pitch-bend
     bendS = create14BitSlider("Bend", p);

p.add(Box.createHorizontalStrut(10));
     add(p);

p = new JPanel();
     p.setBorder(new EmptyBorder(10,0,10,0));
     p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));

JComboBox combo = new JComboBox();
     combo.setPreferredSize(new Dimension(120,25));
     combo.setMaximumSize(new Dimension(120,25));
     for (int i = 1; i <= 16; i++) {
       combo.addItem("Channel " + String.valueOf(i));
     }
     combo.addItemListener(this);
     p.add(combo);
     p.add(Box.createHorizontalStrut(20));

muteCB = createCheckBox("Mute", p);
     soloCB = createCheckBox("Solo", p);
     monoCB = createCheckBox("Mono", p);
     //sustCB = createCheckBox("Sustain", p);

createButton("All Notes Off", p);
     p.add(Box.createHorizontalStrut(10));
     p.add(mouseOverCB);
     p.add(Box.createHorizontalStrut(10));
     recordB = createButton("Record...", p);
     add(p);
   }

public JButton createButton(String name, JPanel p) {
     JButton b = new JButton(name);
     b.addActionListener(this);
     p.add(b);
     return b;
   }

private JCheckBox createCheckBox(String name, JPanel p) {
     JCheckBox cb = new JCheckBox(name);
     cb.addItemListener(this);
     p.add(cb);
     return cb;
   }

private JSlider createSlider(String name, JPanel p) {
     JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 127, 64);
     slider.addChangeListener(this);
     TitledBorder tb = new TitledBorder(new EtchedBorder());
     tb.setTitle(name + " = 64");
     slider.setBorder(tb);
     p.add(slider);
     p.add(Box.createHorizontalStrut(5));
     return slider;
   }

private JSlider create14BitSlider(String name, JPanel p) {
     JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 16383, 8192);
     slider.addChangeListener(this);
     TitledBorder tb = new TitledBorder(new EtchedBorder());
     tb.setTitle(name + " = 8192");
     slider.setBorder(tb);
     p.add(slider);
     p.add(Box.createHorizontalStrut(5));
     return slider;
   }

public void stateChanged(ChangeEvent e) {
     JSlider slider = (JSlider) e.getSource();
     int value = slider.getValue();
     TitledBorder tb = (TitledBorder) slider.getBorder();
     String s = tb.getTitle();
     tb.setTitle(s.substring(0, s.indexOf('=')+1) + s.valueOf(value));
     if (s.startsWith("Velocity")) {
       cc.velocity = value;
     } else if (s.startsWith("Pressure")) {
       cc.channel.setChannelPressure(cc.pressure = value);
     } else if (s.startsWith("Bend")) {
       cc.channel.setPitchBend(cc.bend = value);
     } else if (s.startsWith("Reverb")) {
       cc.channel.controlChange(REVERB, cc.reverb = value);
     }
     slider.repaint();
   }

public void itemStateChanged(ItemEvent e) {
     if (e.getSource() instanceof JComboBox) {
       JComboBox combo = (JComboBox) e.getSource();
       cc = channels[combo.getSelectedIndex()];
       cc.setComponentStates();
     } else {
       JCheckBox cb = (JCheckBox) e.getSource();
       String name = cb.getText();
       if (name.startsWith("Mute")) {
         cc.channel.setMute(cc.mute = cb.isSelected());
       } else if (name.startsWith("Solo")) {
         cc.channel.setSolo(cc.solo = cb.isSelected());
       } else if (name.startsWith("Mono")) {
         cc.channel.setMono(cc.mono = cb.isSelected());
       } else if (name.startsWith("Sustain")) {
         cc.sustain = cb.isSelected();
         cc.channel.controlChange(SUSTAIN, cc.sustain ? 127 : 0);
       }
     }
   }

public void actionPerformed(ActionEvent e) {
     JButton button = (JButton) e.getSource();
     if (button.getText().startsWith("All")) {
       for (int i = 0; i < channels.length; i++) {
         channels[i].channel.allNotesOff();
       }
       for (int i = 0; i < keys.size(); i++) {
         ((Key) keys.get(i)).setNoteState(OFF);
       }
     } else if (button.getText().startsWith("Record")) {
       if (recordFrame != null) {
         recordFrame.toFront();
       } else {
         recordFrame = new RecordFrame();
       }
     }
   }
 } // End class Controls

/**
  * A frame that allows for midi capture & saving the captured data.
  */
 class RecordFrame extends JFrame implements ActionListener, MetaEventListener {

public JButton recordB, playB, saveB;
   Vector tracks = new Vector();
   DefaultListModel listModel = new DefaultListModel();
   TableModel dataModel;
   JTable table;

public RecordFrame() {
     super("Midi Capture");
     addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {recordFrame = null;}
     });

sequencer.addMetaEventListener(this);
     try {
       sequence = new Sequence(Sequence.PPQ, 10);
     } catch (Exception ex) { ex.printStackTrace(); }

JPanel p1 = new JPanel(new BorderLayout());

JPanel p2 = new JPanel();
     p2.setBorder(new EmptyBorder(5,5,5,5));
     p2.setLayout(new BoxLayout(p2, BoxLayout.X_AXIS));

recordB = createButton("Record", p2, true);
     playB = createButton("Play", p2, false);
     saveB = createButton("Save...", p2, false);

getContentPane().add("North", p2);

final String[] names = { "Channel #", "Instrument" };

dataModel = new AbstractTableModel() {
       public int getColumnCount() { return names.length; }
       public int getRowCount() { return tracks.size();}
       public Object getValueAt(int row, int col) {
         if (col == 0) {
           return ((TrackData) tracks.get(row)).chanNum;
         } else if (col == 1) {
           return ((TrackData) tracks.get(row)).name;
         }
         return null;
       }
       public String getColumnName(int col) {return names[col]; }
       public Class getColumnClass(int c) {
         return getValueAt(0, c).getClass();
       }
       public boolean isCellEditable(int row, int col) {
         return false;
       }
       public void setValueAt(Object val, int row, int col) {
         if (col == 0) {
           ((TrackData) tracks.get(row)).chanNum = (Integer) val;
         } else if (col == 1) {
           ((TrackData) tracks.get(row)).name = (String) val;
         }
       }
     };

table = new JTable(dataModel);
     TableColumn col = table.getColumn("Channel #");
     col.setMaxWidth(65);
     table.sizeColumnsToFit(0);

JScrollPane scrollPane = new JScrollPane(table);
     EmptyBorder eb = new EmptyBorder(0,5,5,5);
     scrollPane.setBorder(new CompoundBorder(eb,new EtchedBorder()));

getContentPane().add("Center", scrollPane);
  pack();
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
     int w = 210;
     int h = 160;
     setLocation(d.width/2 - w/2, d.height/2 - h/2);
     setSize(w, h);
  setVisible(true);
   }

public JButton createButton(String name, JPanel p, boolean state) {
     JButton b = new JButton(name);
     b.setFont(new Font("serif", Font.PLAIN, 10));
     b.setEnabled(state);
     b.addActionListener(this);
     p.add(b);
     return b;
   }

public void actionPerformed(ActionEvent e) {
     JButton button = (JButton) e.getSource();
     if (button.equals(recordB)) {
       record = recordB.getText().startsWith("Record");
       if (record) {
         track = sequence.createTrack();
         startTime = System.currentTimeMillis();

// add a program change right at the beginning of
         // the track for the current instrument
         createShortEvent(PROGRAM,cc.col*8+cc.row);

recordB.setText("Stop");
         playB.setEnabled(false);
         saveB.setEnabled(false);
       } else {
         String name = null;
         if (instruments != null) {
           name = instruments[cc.col*8+cc.row].getName();
         } else {
           name = Integer.toString(cc.col*8+cc.row);
         }
         tracks.add(new TrackData(cc.num+1, name, track));
         table.tableChanged(new TableModelEvent(dataModel));
         recordB.setText("Record");
         playB.setEnabled(true);
         saveB.setEnabled(true);
       }
     } else if (button.equals(playB)) {
       if (playB.getText().startsWith("Play")) {
         try {
           sequencer.open();
           sequencer.setSequence(sequence);
         } catch (Exception ex) { ex.printStackTrace(); }
         sequencer.start();
         playB.setText("Stop");
         recordB.setEnabled(false);
       } else {
         sequencer.stop();
         playB.setText("Play");
         recordB.setEnabled(true);
       }
     } else if (button.equals(saveB)) {
       try {
         File file = new File(System.getProperty("user.dir"));
         JFileChooser fc = new JFileChooser(file);
         fc.setFileFilter(new javax.swing.filechooser.FileFilter() {
           public boolean accept(File f) {
             if (f.isDirectory()) {
               return true;
             }
             return false;
           }
           public String getDescription() {
             return "Save as .mid file.";
           }
         });
         if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
           saveMidiFile(fc.getSelectedFile());
         }
       } catch (SecurityException ex) {
         JavaSound.showInfoDialog();
         ex.printStackTrace();
       } catch (Exception ex) {
         ex.printStackTrace();
       }
     }
   }

public void meta(MetaMessage message) {
     if (message.getType() == 47) { // 47 is end of track
       playB.setText("Play");
       recordB.setEnabled(true);
     }
   }

public void saveMidiFile(File file) {
     try {
       int[] fileTypes = MidiSystem.getMidiFileTypes(sequence);
       if (fileTypes.length == 0) {
         System.out.println("Can't save sequence");
       } else {
         if (MidiSystem.write(sequence, fileTypes[0], file) == -1) {
           throw new IOException("Problems writing to file");
         }
       }
     } catch (SecurityException ex) {
       JavaSound.showInfoDialog();
     } catch (Exception ex) {
       ex.printStackTrace();
     }
   }

class TrackData extends Object {
     Integer chanNum; String name; Track track;
     public TrackData(int chanNum, String name, Track track) {
       this.chanNum = new Integer(chanNum);
       this.name = name;
       this.track = track;
     }
   } // End class TrackData
 } // End class RecordFrame

public static void main(String args[]) {
   final MidiSynth midiSynth = new MidiSynth();
   midiSynth.open();
   JFrame f = new JFrame("Midi Synthesizer");
   f.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {System.exit(0);}
   });
   f.getContentPane().add("Center", midiSynth);
   f.pack();
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   int w = 760;
   int h = 470;
   f.setLocation(screenSize.width/2 - w/2, screenSize.height/2 - h/2);
   f.setSize(w, h);
   f.setVisible(true);
 }
}

程序有点长,不全部贴出来了,最下面附上下载地址,可以打包下载,下面来看看运行结果:

Java swing实现支持录音等功能的钢琴程序

Java swing实现支持录音等功能的钢琴程序

Java swing实现支持录音等功能的钢琴程序

Java swing实现支持录音等功能的钢琴程序

标签:Java,swing,钢琴程序
0
投稿

猜你喜欢

  • Springboot 扫描mapper接口的2种操作

    2022-08-04 03:28:54
  • Netty启动流程注册多路复用源码解析

    2021-12-02 16:51:35
  • SSM框架中测试单元的使用 spring整合Junit过程详解

    2022-07-01 14:46:48
  • java实现的日期时间转换工具类完整示例

    2022-10-08 19:05:28
  • 再谈java回调函数

    2023-09-27 19:20:10
  • 一起来了解Java的File类和IO流

    2022-04-12 09:23:15
  • struts2自定义拦截器的示例代码

    2021-12-01 16:24:52
  • IDEA远程连接HBase及其Java API实战详解

    2023-11-27 21:54:46
  • JAVA遍历map的几种实现方法代码

    2023-08-27 22:06:04
  • spring中的注解事务演示和添加步骤详情

    2023-03-03 08:32:48
  • Java 设计模式中的命令模式详情

    2023-11-15 23:25:33
  • Java编程实现生成给定范围内不重复随机数的方法小结

    2022-03-21 22:45:13
  • Spring Data环境搭建实现过程解析

    2022-02-26 20:13:38
  • Java JDK 动态 代理的使用方法示例

    2023-08-23 08:12:52
  • C#实现简单的JSON序列化功能代码实例

    2023-06-21 09:03:52
  • 一次由Lombok的@AllArgsConstructor注解引发的错误及解决

    2023-10-07 05:23:42
  • MybatisPlus如何自定义TypeHandler映射JSON类型为List

    2023-08-08 14:05:38
  • 解决Spring Cloud Feign 请求时附带请求头的问题

    2022-12-11 04:29:46
  • Java反射机制在Spring IOC中的应用详解

    2023-11-10 14:09:32
  • 使用Java实现qq邮箱发送邮件

    2023-10-14 18:24:36
  • asp之家 软件编程 m.aspxhome.com