Zielony Smok - logo witryny

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ę:

Grana melodia

Dźwięki są rozłożone co 1000 ms. Na konsoli pokazują się wysokości nut (C=60).