import java.lang.reflect.*;
import javax.sound.midi.*;
import javax.swing.*;
/**
* Questa classe rappresenta una tastiera che permette di suonare la periferica midi<br>
* @author netarrow
* @version 1.2.04
* @since 1.0.00
*/
public class Tastiera {
Noteable n;
/**
* Inizializza lo strumento, in questo caso viene scelto di default il pianoforte
*/
private void initStrument() {
try {
chan[0].programChange(strumenti[0].getPatch().getProgram());
JOptionPane.
showMessageDialog(null,
"Errore nel inizializzare lo strumento del canale" + e.
toString(),
"Errore",
JOptionPane.
ERROR_MESSAGE);
}
}
/**
* Costruttore<br>
* Inizializza il sintetizzatore<br>
* @param n accetta una classe che implementa Noteable
*/
public Tastiera(Noteable n) {
this.n = n;
try
{
syn.open();
sb = syn.getDefaultSoundbank();
if (sb != null)
strumenti = syn.getDefaultSoundbank().getInstruments();
else
strumenti = syn.getAvailableInstruments();
chan=syn.getChannels();
}
syn=null;
seqer=null;
seq=null;
sb=null;
strumenti=null;
JOptionPane.
showMessageDialog(null,
"Errore nell'inizializzare il MidiSystem: " + ecc.
toString(),
"Errore",
JOptionPane.
ERROR_MESSAGE);
}
initStrument();
}
/**
* Versione di suonaNota per ricevere in input<br>
* il testo in formato accetato dalle variabili veriabile (es. DO, MI2, LA2d) e tramite la riflessione chiamare<br>
* la variabile di Noteable corrispondente a quella stringa<br>
* Dopo aver ottenuto il valore intero della variabile chiama la versione che accetta un intero<br>
* @param command nome della nota nella versione variabile
* @param isSeq controlla se è una sequenza o no
*/
public void suonaNota
(String command,
boolean isSeq
) {
try {
/*
* Usa la riflessione, carica la variabile presente in Noteable col nome passato
* a command
*/
Class c = n.getClass();
Field nota
= c.
getField(command
);
int channel = isSeq? 1:0;
suonaNota(value.intValue(), channel);
JOptionPane.
showMessageDialog(null,
"Errore nel cercare la nota: " + e.
toString(),
"Errore",
JOptionPane.
ERROR_MESSAGE);
}
}
/**
* Suona la nota passata a parametro
* @param nota Questo intero rappresenta una nota, intero ricavato
* tramite la riflessione in suonaNota(String)
*
*/
public void suonaNota(int nota, int channel) {
chan[channel].allNotesOff();
chan[channel].noteOn(nota, 50);
}
}