Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425

    [Java] programma con la 5.0 non va sulla 1.4, dove "violo" lo standard?

    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:
    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);
    	}
    
    }
    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.

    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?

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    semmai vi serve provarlo lo potete scaricare QUI

    Mi sareste di grande aiuto se, dopo averlo provato, nel caso non funzionasse mi postiate la versione della JVM ed il contenuto di un eventuale error.log.

    (avere un programma che fa errori e non va è fastidioso, ma uno che non va e non da errori ancora peggio non sai che pesci pigliare)

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it L'avatar di Shea
    Registrato dal
    Jul 2000
    Messaggi
    157
    A me non funzionano le classi
    Domanda stupida, hai provato a vedere se sulle impostazioni della scheda audio è impostata l'uscita midi?

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da Shea
    A me non funzionano le classi
    Domanda stupida, hai provato a vedere se sulle impostazioni della scheda audio è impostata l'uscita midi?
    grazie 1000 per la risposta

    Sul mio computer funziona tutto perfettamente, quindi l'uscita midi è anche configurata correttamente. Il problema è sul pc di ques'altra persona, preme il bottone e non suona, senza lanciare errori.
    Però lui i midi normali li sente.

    Non capisco cosa non ti funziona, hai scaricato il zip o hai compilato i sorgenti postati? Nel secondo caso ho messo solo l'essenziale, manca TUTTA la classe per la GUI.

    Bisogna tenere conto che non ho creato un binario per facilitarne la diffusione in quando è una beta(la seconda beta dopo 3 alpha) quindi giusto una prova, per fare partire il bat il comando java deve essere inserito nella variabile d'ambiente path.

    Grazie per l'attenzione e grazie ancora di più se qualcuno mi aiuterà nel capire cos'è che non va(io non ho una 1.4 quindi non posso farlo )

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    faccio un uppino per evitare il declassaggio
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.