import javax.sound.midi.*;
import java.awt.*;
import java.awt.color.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;

public class suonaMessaggi extends JPanel
{
	int canale;
	int ottava=0;
	int	nNoteNumber = 6;	// numero nota MIDI
	int	nVelocity = 100;		// volume
	int	nDuration = 50;		// Durata della nota
	Synthesizer	synth = null;
	MidiChannel[] channels;
	ArrayList tasti;
	JSlider ottavaSlider;
	
	public suonaMessaggi()
	{		
		ottavaSlider = new JSlider(0,4, 0);
		ottavaSlider.setMinorTickSpacing(1);
		ottavaSlider.setPaintTicks(true);
		
		tasti = new ArrayList();
		tasti.add(new Tasto(0,0,false, 32, this));
		tasti.add(new Tasto(30,0,false, 34, this));
		tasti.add(new Tasto(60,0,false, 36, this));
		tasti.add(new Tasto(90,0,false, 37, this));
		tasti.add(new Tasto(120,0,false, 39, this));
		tasti.add(new Tasto(150,0,false, 41, this));
		tasti.add(new Tasto(180,0,false, 43, this));
		tasti.add(new Tasto(15,0,true, 33, this));
		tasti.add(new Tasto(45,0,true, 35, this));
		tasti.add(new Tasto(105,0,true, 38, this));
		tasti.add(new Tasto(135,0,true, 40, this));
		tasti.add(new Tasto(165,0,true, 42, this));
		
		addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e){
			for (int h =tasti.size() - 1; h >= 0; h--)
				((Tasto)tasti.get(h)).cliccato = false;
			for (int h =tasti.size() - 1; h >= 0; h--)
			{
				((Tasto)tasti.get(h)).cliccato(e.getX(), e.getY());
				if (((Tasto)tasti.get(h)).cliccato) break;
			}
			repaint();
			}});
		
		// Ricerca del sintetizzatore midi di default
		try { synth = MidiSystem.getSynthesizer(); } catch (MidiUnavailableException e){}
		// apertura del sintetizzatore selezionato
		try{ synth.open();} catch (MidiUnavailableException e) {e.printStackTrace();System.exit(1);}
		channels = synth.getChannels();

		JFrame f = new JFrame();
		f.setSize(220,140);
		f.setLayout(new BorderLayout());
		f.add(this, BorderLayout.CENTER);
		f.add(ottavaSlider, BorderLayout.NORTH);
		f.setVisible(true);

	}
	public void paint(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.gray);
		g.fillRect(0,0,getWidth(), getHeight());
		for (int h = 0; h < tasti.size(); h++)
			((Tasto)tasti.get(h)).mostra(g);
	}
	public static void main(String[] a)
	{
		suonaMessaggi s = new suonaMessaggi();
	}
	public void suonaNota(int nota, int canale)
	{
		nNoteNumber = Math.min(127, Math.max(0, nota));
		nVelocity = Math.min(127, Math.max(0, 100));
		channels[canale].noteOn(nNoteNumber + ottavaSlider.getValue()*12, nVelocity);
	}
}

class Tasto
{
	int nota;
	int width = 30;
	int height = 100;
	boolean cliccato = false;
	int x,y;
	boolean nero = false;
	Color bg;
	suonaMessaggi padre;
	public Tasto(int x, int y, boolean nero, int nota, suonaMessaggi padre)
	{
		this.padre = padre;
		this.x = x;
		this.y = y;
		this.nero = nero;
		bg = Color.white;
		if (nero)
		{
			this.x = this.x + 5;
			this.width = this.width - 10;
			this.height = this.height - 50;
			bg = Color.black;
		}
		this.nota = nota;
	}
	public void mostra(Graphics g)
	{
		if (cliccato)
		{
			g.setColor(Color.red);
			padre.suonaNota(nota, 1);
		}
		else
			g.setColor(bg);
		g.fillRect(x, y, width-1, height);
	}
	public void cliccato(int mx, int my)
	{
		if (mx > x && mx < x+width && my > y && my < y+height)
			cliccato = true;
		else
			cliccato = false;
	}
}


