import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiUnavailableException;
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 java.applet.Applet
{
	int canale;
	int ottava=1;
	int	nNoteNumber = 6;	// numero nota MIDI
	int	nVelocity = 100;		// volume
	int	nDuration = 50;		// Durata della nota
	Synthesizer	synth = null;
	MidiChannel[] channels;

	public void init()
	{
		String testodasuonare = getParameter("testo");
		int tempo2 = Integer.parseInt(getParameter("velocita"));
		int canale2 = Integer.parseInt(getParameter("canale"));
		int tipokeyb = Integer.parseInt(getParameter("tastiera"));
		// 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();

		canale = canale2;

		/*for (int i=0;i<100;i++) 
		{
			System.out.println(i);
			channels[canale].noteOn(i, 100);
			try{Thread.sleep(150);}catch(Exception ee){}
		}*/
		
		for (int i=0;i<testodasuonare.length();i++)
		{
			switch(tipokeyb)
			{
				case 1: suonaMIDIKEYBOARD(testodasuonare.charAt(i)); break;
				case 2: suonaALLKEYBOARD(testodasuonare.charAt(i)); break;
				case 3: suonaASCIIKEYBOARD(testodasuonare.charAt(i)); break;
				default: suonaALLKEYBOARD(testodasuonare.charAt(i)); break;
			}
			try{Thread.sleep(tempo2);}catch(Exception ee){}
		}
	}
	
	public void suonaNota(int nota)
	{
		nNoteNumber = Math.min(127, Math.max(0, nota));
		nVelocity = Math.min(127, Math.max(0, 100));
		channels[canale].noteOn(nNoteNumber, nVelocity);
	}
	
	public void suonaMIDIKEYBOARD(char c)
	{
		switch(c)
		{
			case 'q': suonaNota(30+ottava*12);break;
			case '2': suonaNota(31+ottava*12);break;
			case 'w': suonaNota(32+ottava*12);break;
			case '3': suonaNota(33+ottava*12);break;
			case 'e': suonaNota(34+ottava*12);break;
			case 'r': suonaNota(35+ottava*12);break;
			case '5': suonaNota(36+ottava*12);break;
			case 't': suonaNota(37+ottava*12);break;
			case '6': suonaNota(38+ottava*12);break;
			case 'y': suonaNota(39+ottava*12);break;
			case '7': suonaNota(40+ottava*12);break;
			case 'u': suonaNota(41+ottava*12);break;
			case 'i': suonaNota(42+ottava*12);break;
			case '9': suonaNota(43+ottava*12);break;
			case 'o': suonaNota(44+ottava*12);break;
			case '0': suonaNota(45+ottava*12);break;
			case 'p': suonaNota(46+ottava*12);break;
			case 'z': suonaNota(42+ottava*12);break;
			case 's': suonaNota(43+ottava*12);break;
			case 'x': suonaNota(44+ottava*12);break;
			case 'd': suonaNota(45+ottava*12);break;
			case 'c': suonaNota(46+ottava*12);break;
			case 'v': suonaNota(47+ottava*12);break;
			case 'g': suonaNota(48+ottava*12);break;
			case 'b': suonaNota(49+ottava*12);break;
			case 'h': suonaNota(50+ottava*12);break;
			case 'n': suonaNota(51+ottava*12);break;
			case 'j': suonaNota(52+ottava*12);break;
			case 'm': suonaNota(53+ottava*12);break;
			case ',': suonaNota(54+ottava*12);break;
			case 'l': suonaNota(55+ottava*12);break;
			case '.': suonaNota(56+ottava*12);break;
			case 'ò': suonaNota(57+ottava*12);break;
			case '-': suonaNota(58+ottava*12);break;
			default: nNoteNumber = 0;break;
		}
	}

	public void suonaALLKEYBOARD(char c)
	{
		switch(c)
		{
			case '1': suonaNota(30+ottava*12);break;
			case 'q': suonaNota(31+ottava*12);break;
			case '2': suonaNota(32+ottava*12);break;
			case 'w': suonaNota(33+ottava*12);break;
			case '3': suonaNota(34+ottava*12);break;
			case 'e': suonaNota(35+ottava*12);break;
			case '4': suonaNota(36+ottava*12);break;
			case 'r': suonaNota(37+ottava*12);break;
			case '5': suonaNota(38+ottava*12);break;
			case 't': suonaNota(39+ottava*12);break;
			case '6': suonaNota(40+ottava*12);break;
			case 'y': suonaNota(41+ottava*12);break;
			case '7': suonaNota(42+ottava*12);break;
			case 'u': suonaNota(43+ottava*12);break;
			case '8': suonaNota(44+ottava*12);break;
			case 'i': suonaNota(45+ottava*12);break;
			case '9': suonaNota(46+ottava*12);break;
			case 'o': suonaNota(47+ottava*12);break;
			case '0': suonaNota(48+ottava*12);break;
			case 'p': suonaNota(49+ottava*12);break;
			case '\'': suonaNota(50+ottava*12);break;
			case 'è': suonaNota(51+ottava*12);break;
			case 'ì': suonaNota(52+ottava*12);break;
			case '+': suonaNota(53+ottava*12);break;
			case '<': suonaNota(54+ottava*12);break;
			case 'a': suonaNota(55+ottava*12);break;
			case 'z': suonaNota(56+ottava*12);break;
			case 's': suonaNota(57+ottava*12);break;
			case 'x': suonaNota(58+ottava*12);break;
			case 'd': suonaNota(59+ottava*12);break;
			case 'c': suonaNota(60+ottava*12);break;
			case 'f': suonaNota(61+ottava*12);break;
			case 'v': suonaNota(62+ottava*12);break;
			case 'g': suonaNota(63+ottava*12);break;
			case 'b': suonaNota(64+ottava*12);break;
			case 'h': suonaNota(65+ottava*12);break;
			case 'n': suonaNota(66+ottava*12);break;
			case 'j': suonaNota(67+ottava*12);break;
			case 'm': suonaNota(68+ottava*12);break;
			case 'k': suonaNota(69+ottava*12);break;
			case ',': suonaNota(70+ottava*12);break;
			case 'l': suonaNota(71+ottava*12);break;
			case '.': suonaNota(72+ottava*12);break;
			case 'ò': suonaNota(73+ottava*12);break;
			case '-': suonaNota(74+ottava*12);break;
			case 'à': suonaNota(75+ottava*12);break;
			case 'ù': suonaNota(76+ottava*12);break;
			default: nNoteNumber = 0;break;
		}
	}
	public void suonaASCIIKEYBOARD(char c)
	{
		int r = (int)c - 30;
		suonaNota(r+ottava*12);

	}
}
