Piano mit Java programmieren
Code by D. Selzer-McKenzie
YoutubeVideo: https://youtu.be/lO803vJbnpw
Hier zeige ich Ihnen, wie Sie ganz einfach ein komplettes
musikalisches Klavier mit Java programmieren können. Den Code finden Sie
nachstehend, aber es ist möglkich, dass er unter die Videobeschreibung hier
nicht reingeht, deshalb können Sie den Code im Forum
http://Outbackbrumby.Blogspot.com nachlesen.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
/**
*
* @author Peter
Müller, carpelibrum
*/
public class KlavierDemo extends JFrame {
public
KlavierDemo() {
super("KlavierDemo");
setLayout(new
BorderLayout());
JPanel panel =
new JPanel();
panel.add(new
Tastatur());
add(panel);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void
main(String[] args) {
KlavierDemo kd
= new KlavierDemo();
kd.pack();
kd.setVisible(true);
}
}
class Tastatur extends JPanel {
private static int
m_breiteWeiss = 16;
private static int
m_tastenLaenge = 80;
private
MidiChannel m_midiKanal;
private
List m_weisseTasten;
private List
m_schwarzeTasten;
private
List m_alleTasten;
public static int
GESCHWINDIGKEIT = 64;
public static int
ANZAHL_OKTAVEN = 6;
public static int
STARTNUM = 24;
private
Instrument[] instruments;
private Color
m_pink = new Color(244,173,255);
public Tastatur()
{
initMIDI();
setPreferredSize(new Dimension(ANZAHL_OKTAVEN * 7 * m_breiteWeiss + 1,
m_tastenLaenge + 1));
m_weisseTasten =
erzeugeWeisseTasten();
m_schwarzeTasten = erzeugeSchwarzeTasten();
m_alleTasten =
new ArrayList();
m_alleTasten.addAll(m_schwarzeTasten); // zuerst schwarz, da sie über
den weißen liegen
m_alleTasten.addAll(m_weisseTasten);
addMouseListener(new MausAdapter());
}
@Override
protected void
paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d
= (Graphics2D) g;
g2d.setBackground(getBackground());
Dimension groesse
= getSize();
Taste aktiv =
null;
g2d.setColor(Color.WHITE);
g2d.fillRect(0,0, groesse.width, groesse.height);
for(Taste t :
m_weisseTasten) {
Rectangle
r = t.leseForm();
if(t.istAktiv()) {
g2d.setColor(m_pink);
g2d.fill(r);
}
g2d.setColor(Color.BLACK);
g2d.draw(r);
}
zeichneAlsAktiv(aktiv, g2d);
for(Taste t : m_schwarzeTasten) {
Rectangle
r = t.leseForm();
if(t.istAktiv()) {
aktiv =
t; // wird am Schluss gezeichnet
}
else {
g2d.setColor(Color.BLACK);
g2d.fill(r);
}
}
zeichneAlsAktiv(aktiv, g2d);
}
private void
zeichneAlsAktiv(Taste aktiv, Graphics2D g2d) {
if(aktiv !=
null) {
Rectangle
r = aktiv.leseForm();
g2d.setColor(m_pink);
g2d.fill(r);
g2d.setColor(Color.BLACK);
g2d.draw(r);
}
}
private
List erzeugeWeisseTasten() {
List ergebnis = new ArrayList();
int offsets[] = { 0, 2, 4, 5, 7, 9, 11
};
int anzahlTotal
= ANZAHL_OKTAVEN * 7;
int xPos = 0;
// pixelposition
for(int i = 0;
i < ANZAHL_OKTAVEN; i++) {
for(int
offset : offsets) {
int nummer
= 12 * i + offset + STARTNUM;
ergebnis.add(new Taste(xPos, 0, m_breiteWeiss, m_tastenLaenge, nummer,
m_midiKanal));
xPos =
xPos + m_breiteWeiss;
}
}
return
ergebnis;
}
private
List erzeugeSchwarzeTasten() {
List ergebnis = new ArrayList();
int offsets[]
= { 1, 3, 6, 8, 10 };
int
breiteSchwarz = m_breiteWeiss / 2;
int
breiteSchwarz_2 = breiteSchwarz / 2;
int
laengeWeiss = m_tastenLaenge / 2;
int xPos = m_breiteWeiss;
for(int i = 0;
i < ANZAHL_OKTAVEN; i++) {
for(int
offset : offsets) {
int
nummer = 12 * i + offset + STARTNUM;
Taste
taste = new Taste(xPos - breiteSchwarz_2, 0, breiteSchwarz, laengeWeiss,
nummer, m_midiKanal);
ergebnis.add(taste);
xPos +=
m_breiteWeiss;
if(offset == 3 || offset == 10) {
xPos += m_breiteWeiss; // danach gibt's keine schwarze Taste
}
}
}
return
ergebnis;
}
private void
initMIDI() {
try {
Synthesizer
synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Instrument[] instruments =
synthesizer.getDefaultSoundbank().getInstruments();
Instrument
piano = null;
// lade das
erste Piano-Instrument
for(Instrument instrument : instruments) {
if(instrument.getName().startsWith("Piano")) {
piano = instrument;
break;
}
}
synthesizer.loadInstrument(piano);
m_midiKanal
= synthesizer.getChannels()[0];
m_midiKanal.programChange(piano.getPatch().getProgram());
}
catch(Exception ex) {
ex.printStackTrace();
}
}
class MausAdapter
extends MouseAdapter {
private Taste
m_vorigeTaste = null;
@Override
public void
mouseExited(MouseEvent e) {
m_vorigeTaste = null;
for(Taste
t : m_alleTasten) {
t.deaktivieren();
}
repaint();
}
@Override
public void
mousePressed(MouseEvent e) {
Point p =
new Point(e.getX(), e.getY());
for(Taste t : m_alleTasten) {
if(t.wirdGedrueckt(p)) {
if(m_vorigeTaste != null) {
m_vorigeTaste.deaktivieren();
}
t.aktivieren();
m_vorigeTaste = t; // merken
repaint();
return;
}
}
}
}
class Taste {
private
Rectangle m_form;
private boolean
m_aktiv;
private int
m_nummer;
private
MidiChannel m_kanal;
public
Taste(int xPos, int yPos, int breite, int hoehe, int nummer, MidiChannel kanal)
{
m_form =
new Rectangle(xPos, yPos, breite, hoehe);
m_aktiv
= false;
m_nummer = nummer;
m_kanal = kanal;
}
public boolean
wirdGedrueckt(Point p) {
return
m_form.contains(p);
}
public boolean
istAktiv() {
return
m_aktiv;
}
public void
aktivieren() {
m_aktiv =
true;
m_kanal.noteOn(m_nummer, GESCHWINDIGKEIT);
}
public void
deaktivieren() {
m_aktiv =
false;
m_kanal.noteOff(m_nummer,
GESCHWINDIGKEIT);
}
private
Rectangle leseForm() {
return
m_form;
}
}
}
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.