Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
MidiSounder - Tastiera.java

Tastiera.java

Caricato da: Netarrow
Scarica il programma completo

  1. import java.lang.reflect.*;
  2.  
  3. import javax.sound.midi.*;
  4.  
  5. import javax.swing.*;
  6.  
  7. /**
  8.  * Questa classe rappresenta una tastiera che permette di suonare la periferica midi<br>
  9.  * @author netarrow
  10.  * @version 1.2.04
  11.  * @since 1.0.00
  12.  */
  13. public class Tastiera {
  14.         Noteable n;
  15.  
  16.         private Synthesizer syn;
  17.         private Sequencer seqer;
  18.         private Sequence seq;
  19.         private Soundbank sb;
  20.         public Instrument[] strumenti;
  21.         public MidiChannel[] chan;
  22.        
  23. /**
  24.  * Inizializza lo strumento, in questo caso viene scelto di default il pianoforte
  25. */
  26. private void initStrument() {
  27. try {
  28. chan[0].programChange(strumenti[0].getPatch().getProgram());
  29. } catch(Throwable e) {
  30.         JOptionPane.showMessageDialog(null, "Errore nel inizializzare lo strumento del canale" + e.toString(), "Errore", JOptionPane.ERROR_MESSAGE);
  31. }
  32.  
  33. }
  34.  
  35.         /**
  36.          * Costruttore<br>
  37.        * Inizializza il sintetizzatore<br>
  38.        * @param n accetta una classe che implementa Noteable  
  39.          */
  40.         public Tastiera(Noteable n) {
  41.                 this.n = n;
  42.    try
  43.       {
  44.                 syn=MidiSystem.getSynthesizer();
  45.                 seqer=MidiSystem.getSequencer();
  46.                 seq= new Sequence(Sequence.PPQ, 10);
  47.                 syn.open();
  48.                 sb = syn.getDefaultSoundbank();
  49.                 if (sb != null)
  50.                 strumenti = syn.getDefaultSoundbank().getInstruments();
  51.                 else
  52.                 strumenti = syn.getAvailableInstruments();
  53.                 chan=syn.getChannels();
  54.                 }
  55.         catch(Throwable ecc) {
  56.                 syn=null;
  57.                 seqer=null;
  58.                 seq=null;
  59.                 sb=null;
  60.                 strumenti=null;
  61. JOptionPane.showMessageDialog(null, "Errore nell'inizializzare il MidiSystem: " + ecc.toString(), "Errore", JOptionPane.ERROR_MESSAGE);
  62.         }
  63.         initStrument();
  64.         }
  65.        
  66.         /**
  67.          * Versione di suonaNota per ricevere in input<br>
  68.          * il testo in formato accetato dalle variabili veriabile (es. DO, MI2, LA2d) e tramite la riflessione chiamare<br>
  69.          * la variabile di Noteable corrispondente a quella stringa<br>
  70.        * Dopo aver ottenuto il valore intero della variabile chiama la versione che accetta un intero<br>
  71.          * @param command nome della nota nella versione variabile
  72.        * @param isSeq controlla se è una sequenza o no
  73.          */
  74.         public void suonaNota(String command, boolean isSeq) {
  75.                 try {
  76. /*
  77.  * Usa la riflessione, carica la variabile presente in Noteable col nome passato
  78.  * a command
  79.  */
  80.                         Class c = n.getClass();
  81.                         Field nota = c.getField(command);
  82.                         Integer value = (Integer)nota.get(n);
  83.                   int channel = isSeq? 1:0;
  84.                   suonaNota(value.intValue(), channel);
  85.                 } catch (Throwable e) {
  86. JOptionPane.showMessageDialog(null, "Errore nel cercare la nota: " + e.toString(), "Errore", JOptionPane.ERROR_MESSAGE);
  87.                 }
  88.         }
  89.        
  90.         /**
  91.          * Suona la nota passata a parametro
  92.          * @param nota Questo intero rappresenta una nota, intero ricavato
  93.          *                         tramite la riflessione in suonaNota(String)
  94.          *                        
  95.          */
  96.         public void suonaNota(int nota, int channel) {
  97.                            chan[channel].allNotesOff();
  98.                            chan[channel].noteOn(nota, 50);
  99.         }
  100. }