Ciao a tutti,
ho fatto in Java 5 un programma che, utilizzando il package javax.sound.midi, permette di suonare le 12 note più un do di 8va
(in pratica Do Do# Re Re# Mi Fa Fa# Sol Sol# La La# Si Do2).
Sul mio pc(con il jsdk 5.0 appunto) funziona correttamente, sul pc di un mio amico(con una jsdk 1.4) vede tutto il programma, ma al momento della pressione su una nota lui non sente niente.
Quello che è ancora più strano è che inserendo un metodo che ad ogni catch che prende un errore o un eccezione non rileva niente, quindi lui non sente ma non vengono lanciati errori.
Lasciando perdere la classe che implementa la grafica, vi faccio vedere l'interfaccia Noteable e la classe Tastiera:
Noteable:
codice:package midisounder; /** * @author netarrow * @version 1.0.3 beta * Questa interfaccia serve ad astrarre le note * 60 vuol dire do, ma è molto più intuibile scrivere DO che 60 */ public interface Noteable { public final int DO = 60; public final int DOd = 61; public final int RE = 62; public final int REd = 63; public final int MI = 64; public final int FA = 65; public final int FAd = 66; public final int SOL = 67; public final int SOLd = 68; public final int LA = 69; public final int LAd = 70; public final int SI = 71; public final int DO2 = 72; }
Tastiera:
Praticamente, MidiSounderGUI implementa l'interfaccia Noteable, e nel actionPerformed manda a suonaNota di Tastiera il testo dei bottoni con su scritto il nome della nota che tramite la riflessione chiameranno la variabile di quel nome.codice:package midisounder; import java.lang.reflect.*; import java.io.*; import javax.sound.midi.*; import javax.swing.*; /** * @author netarrow * @version 1.0.3 beta * Questa classe rappresenta una tastiera */ public class Tastiera { Noteable n; private Synthesizer syn; private Sequencer seqer; private Sequence seq; private Soundbank sb; public Instrument[] strumenti; public MidiChannel[] chan; /** * Scrive in un log gli errori */ private void logError(Throwable e) { try { FileWriter fw = new FileWriter("error.log", true); fw.write(e.toString() + "\r\n"); fw.write("\r\n----------------------------\r\n"); fw.close(); } catch(Throwable ex) { JOptionPane.showMessageDialog(null, "Errore nel loggare le eccezioni " + ex.toString(), "Errore", JOptionPane.ERROR_MESSAGE); } } /** * Inizializza lo strumento */ private void initStrument() { chan[0].programChange(strumenti[0].getPatch().getProgram()); } /** * Costruttore */ public Tastiera(Noteable n) { this.n = n; try { syn=MidiSystem.getSynthesizer(); seqer=MidiSystem.getSequencer(); seq= new Sequence(Sequence.PPQ, 10); syn.open(); sb = syn.getDefaultSoundbank(); if (sb != null) strumenti = syn.getDefaultSoundbank().getInstruments(); else strumenti = syn.getAvailableInstruments(); chan=syn.getChannels(); } catch(Throwable ecc) { syn=null; seqer=null; seq=null; sb=null; strumenti=null; logError(ecc); } initStrument(); } /** * Sovraccaricamento di suonaNota per ricevere in input * il testo del bottone e tramite la riflessione chiamare * la variabile di Noteable corrispondente a quella stringa * @param command acctionCommand del bottone */ public void suonaNota(String command) { 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 value = nota.getInt(n); suonaNota(value); } catch (Throwable e) { logError(e); } } /** * 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) { chan[0].allNotesOff(); chan[0].noteOn(nota, 50); } }
Io non capisco dov'è il pezzo di codice che corrompe la portabilità fra JVM![]()
P.S può essere che sia un problema hardware ovvero con la scheda audio o chissà cosa?
![]()

Rispondi quotando
)