Poniższe klasy napisałam na bazie klasy znalezionej dawno temu w Internecie. Klasa wymagała znacznych przeróbek. Było tylko 7 oktaw. Zostały dodane 4 brakujące klawisze z dwóch oktaw. Całkowicie błędne było przypisanie dźwięków MIDI do klawiszy – napisałam to od nowa. Właściwie jest to całkiem nowa klasa, ale na wszelki wypadek podaję, że korzystałam z cudzego kodu.

Klasy

Piano
package piano;

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.*;

public class Piano {


    public Piano() 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
        };
        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));
            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);
    }
}
PianoMain
package piano;

import javax.sound.midi.MidiUnavailableException;
import java.util.logging.Logger;

import static java.util.logging.Level.*;

public class PianoMain {
    public static void main(String[] args) {
        try {
            new Piano();
        } catch (MidiUnavailableException ex) {
            Logger.getLogger(PianoMain.class.getName()).log(SEVERE, null, ex);
        }
    }
}
Wynik

Po uruchomieniu otrzymujemy klawiaturę (Rys. 236), na której mozna grać klikając przyciski myszą albo palcami na ekranie dotykowym.

Pianino - fortepian - Java
Rys. 236. Klawiatura pianina – fortepianu (zmniejszona)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *