📄 pianao.java
字号:
g2.setColor(Color.black);
g2.draw(key);
} else {
g2.setColor(Color.black);
g2.fill(key);
}
}
}
}
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);
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();
}
}
}
class InstrumentsTable extends JPanel {
private String names[] = {
"钢琴类", "钟琴类", "管风琴", "吉他类",
"低音乐器", "弦乐器", "合奏", "军乐",
"簧乐器", "管乐器", "合成线", "合成板",
"合成效果", "民族乐", "打击乐器","声音效果" };
private int nRows =8;//同一种乐器下音乐种类
private int nCols = names.length;
PIANAO env;
public InstrumentsTable(PIANAO env) {
this.env=env;
setLayout(new BorderLayout());
setBackground(new Color(60,230,167));
setForeground(new Color(29,56,167));
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);
addKeyListener(env);
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 );
}
});
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);
sp.getHorizontalScrollBar().setBackground(new Color(90,220,90));
add(sp);
}
public boolean isFocusTraversable (){
return true;
}
public Dimension getPreferredSize() {
return new Dimension(800,170);
}
public Dimension getMaximumSize() {
return new Dimension(800,170);
}
}
class Controls extends JPanel implements ActionListener, ChangeListener, ItemListener {
public JButton recordB;
JMenu menu;
int fileNum = 0;
PIANAO evn;
JButton copyrightB;
JLabel l;
Mywondow copyrightW;
public Controls(PIANAO evn) {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBorder(new BevelBorder(BevelBorder.RAISED,new Color(0,210,217),new Color(0,210,217)));
this.evn=evn;
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
veloS = createSlider("速率", p);
presS = createSlider("压力", p);
revbS = createSlider("回音", p);
bendS = create14BitSlider("混音", p);
p.add(Box.createHorizontalStrut(10));
add(p);
p = new JPanel();
p.setBorder(new EmptyBorder(30,0,90,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));
combo.setBorder(new BevelBorder(BevelBorder.RAISED,new Color(0,0,222),new Color(0,0,255)));
combo.setBackground(new Color(120,35,40));
for (int i = 1; i <= 16; i++) {
combo.addItem("声道 " + String.valueOf(i));
}
combo.addKeyListener(evn);
combo.addItemListener(this);
p.add(combo);
p.add(Box.createHorizontalStrut(20));
muteCB = createCheckBox("静音", p);
soloCB = createCheckBox("独奏", p);
monoCB = createCheckBox("合奏", p);
p.add(Box.createHorizontalStrut(10));
ButtonGroup gg=new ButtonGroup();
gg.add(multiCBmouse);
gg.add(multiCBkey);
p.add(multiCBmouse);
p.add(multiCBkey);
p.add(mouseOverCB);
ButtonGroup g=new ButtonGroup();
g.add(multiCBn);
g.add(multiCB);
g.add(multiCB1);
p.add(multiCBn);
p.add(multiCB);
p.add(multiCB1);
multiCBmouse.setFont(new Font("宋体", Font.PLAIN, 14));
multiCBkey.setFont(new Font("宋体", Font.PLAIN, 14));
multiCBn.setFont(new Font("宋体", Font.PLAIN, 14));
mouseOverCB.setFont(new Font("宋体", Font.PLAIN, 14));
multiCB.setFont(new Font("宋体", Font.PLAIN, 14));
multiCB1.setFont(new Font("宋体", Font.PLAIN, 14));
p.add(Box.createHorizontalStrut(10));
p.add( new JLabel(" "));
p.add( l=new JLabel("版权"));
l.setForeground(new Color(0,0,255));
l.setCursor(new Cursor(Cursor.HAND_CURSOR));
l.setFont(new Font("宋体", Font.PLAIN, 14));
l.addMouseListener(new Mouselistened() );
copyrightW=new Mywondow(l);
copyrightW.setVisible(false);
add(p);
}
public JButton createButton(String name, JPanel p) {
JButton b = new JButton(name);
b.setFont(new Font("宋体", Font.PLAIN, 14));
b.addActionListener(this);
b.addKeyListener(evn);
b.setBorder(new BevelBorder(BevelBorder.RAISED));
p.add(b);
return b;
}
private JCheckBox createCheckBox(String name, JPanel p) {
JCheckBox cb = new JCheckBox(name);
cb.setBorder(new BevelBorder(BevelBorder.RAISED,new Color(0,0,222),new Color(0,0,255)));
cb.setFont(new Font("宋体", Font.PLAIN, 14));
cb.addItemListener(this);
cb.addKeyListener(evn);
p.add(cb);
return cb;
}
private JSlider createSlider(String name, JPanel p) {
JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 127, 64);
slider.addChangeListener(this);
slider.addKeyListener(evn);
slider.setFont(new Font("宋体", Font.PLAIN, 16));
TitledBorder tb = new TitledBorder(new BevelBorder(BevelBorder.RAISED));
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);
slider.addKeyListener(evn);
slider.setFont(new Font("宋体", Font.PLAIN, 16));
TitledBorder tb = new TitledBorder(new BevelBorder(BevelBorder.RAISED));
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("速率")) {
cc.velocity = value;
} else if (s.startsWith("压力")) {
cc.channel.setChannelPressure(cc.pressure = value);
} else if (s.startsWith("混音")) {
cc.channel.setPitchBend(cc.bend = value);
} else if (s.startsWith("回音")) {
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("静音")) {
cc.channel.setMute(cc.mute = cb.isSelected());
} else if (name.startsWith("独奏")) {
cc.channel.setSolo(cc.solo = cb.isSelected());
} else if (name.startsWith("合奏")) {
cc.channel.setMono(cc.mono = cb.isSelected());
} else if (name.startsWith("持续")) {
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("关闭")) {
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("版权 ")) {
}
}
class Mouselistened implements MouseListener{
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseExited(MouseEvent e) { copyrightW.setVisible(false);}
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) {
copyrightW.setVisible(true);
}
}
class Mywondow extends JWindow{
private String information;
private JComponent component;
Mywondow(){
information=new String("模拟钢琴:完成时间(2003年6月16日),作者(王振刚), 未经许可, 不得随意拷贝");
init();
}
Mywondow(JComponent component){
this.component=component;
init();
}
private void init(){
JLabel l;
JPanel ppp=new JPanel();
ppp.setLayout(new BoxLayout(ppp,BoxLayout.Y_AXIS ) );
ppp.add(l=new JLabel("模拟钢琴: 1.0版本" ));
l.setFont(new Font("宋体", Font.PLAIN, 14));
ppp.add(l=new JLabel("完成时间: 2003年6月16日" ));
l.setFont(new Font("宋体", Font.PLAIN, 14));
ppp.add(l=new JLabel("作者: 王振刚" ));
l.setFont(new Font("宋体", Font.PLAIN, 14));
ppp.add(l=new JLabel("未经许可, 不得随意拷贝" ));
l.setFont(new Font("宋体", Font.PLAIN, 14));
ppp.setBackground(new Color(160,25,255));
getContentPane().add(ppp);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(screenSize.width/2 - 180/2, screenSize.height/2 - 100/2,185,72);
setBackground(new Color(160,25,255));
}
}
}
public static void main(String args[]) {
final PIANAO PIANAO = new PIANAO();
PIANAO.open();
JFrame f = new JFrame("王振刚的钢琴");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
f.getContentPane().add("Center", PIANAO);
f.pack();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
f.setSize(screenSize);
f.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -