Dienstag, 13. Dezember 2016

Piano mit Java programmieren


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


 

 

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.