Robot (AWT, Java)
Aby pokazać użycie klasy java.awt.Robot użyjemy klasy Piano
i PianoMain
z przykładu Fortepian – pianino -keyboard – Java.
Klasa PianoMain
nie uległa zmianie.
Klasa Piano2.java
package robot; import javax.sound.midi.MidiChannel; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Synthesizer; import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; public class Piano2 { public Piano2() throws MidiUnavailableException { final int[] white = {21, 23, 24, 26, 28, 29, 31, 33, 35, 36, 38, 40, 41, 43, 45, 47, 48, 50, 52, 53, 55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72, 74, 76, 77, 79, 81, 83, 84, 86, 88, 89, 91, 93, 95, 96, 98, 100, 101, 103, 105, 107, 108 }; int[] x = {530, 490, 490, 510, 470,470, 450, 490, 530, 530,490, 490, 510, 470,470, 450, 490, 450}; final int velocity = 64; final int keys = 52; final int white_button_width = 20; final int white_button_height = 120; final int frame_height = white_button_height + 30; final int black_button_width = 16; final int black_button_height = 80; Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); MidiChannel channel = synthesizer.getChannels()[0]; JFrame frame = new JFrame("Fortepian"); JLayeredPane pane = new JLayeredPane(); frame.add(pane); for (int i = 0; i < keys; i++) { JButton w = new JButton(); w.setBackground(Color.WHITE); w.setLocation(i * white_button_width, 0); w.setSize(white_button_width, white_button_height); final int note = white[i]; w.addActionListener(e -> { channel.noteOn(note, velocity); System.out.println(note); }); pane.add(w, 0, -1); } for (int i = 0; i < keys - 1; i++) { int j = i % 7; if (j == 1 || j == 4) { continue; } JButton b = new JButton(); b.setBackground(Color.BLACK); b.setLocation(i * white_button_width + black_button_width * 3 / 4, 0); b.setSize(black_button_width, black_button_height); final int note = white[i] + 1; b.addActionListener(e -> channel.noteOn(note, velocity)); pane.add(b, 1, -1); } frame.setSize(keys * white_button_width + 20, frame_height); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Robot muzyk = null; try { muzyk = new Robot(); } catch (AWTException e) { e.printStackTrace(); } muzyk.delay(2000); for(int i=0;i < 18; i++){ muzyk.mouseMove(x[i]+20, 110); muzyk.mousePress(InputEvent.BUTTON1_DOWN_MASK); muzyk.delay(500); muzyk.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); muzyk.delay(500); } } }
Klasa PianoMain.java
package robot; import javax.sound.midi.MidiUnavailableException; public class Piano2Main { public static void main(String[] args) { try { new Piano2(); } catch (MidiUnavailableException e) { e.printStackTrace(); } } }
Po uruchomieniu klasy Piano2Main
widzimy klawiaturę pianina, która po 2 sekundach opóźnienia sama
odgrywa melodię:
Dźwięki są rozłożone co 1000 ms. Na konsoli pokazują się wysokości nut (C=60).