Oppure

Loading
30/03/09 21:38
gmxsm
Ciao a tutti,
da un paio di giorni mi sto imbattendo nelle api "javax.sound.midi" perchè creare e manipolare file midi mi interesserebbe davvero molto.
Ho letto molte guide e articoli su questo argomento, ma mi sono imbattutto in questo errore:
"javax.sound.midi.MidiUnavailableException: MIDI OUT transmitter not available"

La cosa che più mi fa impazzire è che il codice che ho usato fa parte di un Tutorial ibm.com/developerworks/library/it/it-0801art38/...
Di seguito il codice:
codice PHP:
package provamidi;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.midi.*;

public class IBM_Esempio1 {
    private Sequencer sequencer;

    public IBM_Esempio1(){
        try {
//definisco l'oggetto sequencer
             sequencer = MidiSystem.getSequencer();
             sequencer.open();
        } catch (MidiUnavailableException ex) {
            Logger.getLogger(IBM_Esempio1.class.getName()).log(Level.SEVERE, null, ex);
        }
//creo un file da un percorso assoluto
        File file= new File ("C:\music1.midi");
        try {
//setto la sequenza per il sequencer
            sequencer.setSequence(MidiSystem.getSequence(file));
        } catch (InvalidMidiDataException ex) {
            Logger.getLogger(IBM_Esempio1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(IBM_Esempio1.class.getName()).log(Level.SEVERE, null, ex);
        }
//faccio partire il sequencer
        sequencer.start();


    }
//questo codice, come dice il tutorial, dovrebbe catturare l'evento legato allo stream..???

    public void meta(MetaMessage event){
        if(event.getType()==47){ // 47 significa che è finito lo stream
            sequencer.stop();
            sequencer.close();
        }
    }

    public static void main(String args[]){
        new IBM_Esempio1();
        
    }
}


Ecco invece cosa mi riporta il Debug:
codice PHP:
29-mar-2009 20.15.14 provamidi.IBM_Esempio1 <init>
GRAVE: null
javax.sound.midi.MidiUnavailableException: MIDI OUT transmitter not available
        at com.sun.media.sound.AbstractMidiDevice.createTransmitter(AbstractMidiDevice.java:444)
        at com.sun.media.sound.AbstractMidiDevice.getTransmitter(AbstractMidiDevice.java:299)
        at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:451)
        at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348)
        at provamidi.IBM_Esempio1.<init>(IBM_Esempio1.java:23)
        at provamidi.IBM_Esempio1.main(IBM_Esempio1.java:50)
Exception in thread "main" java.lang.NullPointerException
        at provamidi.IBM_Esempio1.<init>(IBM_Esempio1.java:30)
        at provamidi.IBM_Esempio1.main(IBM_Esempio1.java:50)
Java Result: 1


Naturalmente prima di postare ho fatto alcune ricerce tramite google ed ho trovato solo articoli che non hanno risolto tutto ciò:
javakb.com/Uwe/Forum.aspx/java-programmer/32698/…
bugs.sun.com/bugdatabase/…
coderanch.com/t/274513/Other-Java-APIs/java/…
In particolare per ciò che viene descritto nell'ultimo link io non mi ritrovo questo file:
C:\Program Files\Java\jre1.6.0_07\lib\ext\sound.jar:-?

Non capisco il problema da cosa scaturisca essendo materia nuova per me, ma sarei grato se qualcuno in questo forum possa aiutarmi perchè è sempre bello imparare, oltre che mi servirebbe tutto ciò per un esame!

Grazie in anticipo a tutti!;)
aaa
03/04/09 1:03
gmxsm
Nessuno mi può aiutare a risolvere l'inghippo?:(
aaa
03/04/09 7:39
netarrow
l'errore parte da qui:

sequencer.setSequence(MidiSystem.getSequence(file));

gli passi file che è inizializzato su

C:\music1.mid

Secondo me l'errore è quello.

Scrivendo "C:\music1.mid" quel \ viene considerato come carattere escape \m.

Prova a inizializzarlo sul file

"/…;

Java accetta come separatore sempre / poi se il sistema invece è windows e usa \ lo converte lui.
O sennò usa C:\music1.mid
aaa
03/04/09 13:05
gmxsm
Purtroppo scrivendo nei tag "code" del forum me l'ha omesso, comunque nel codice avevo messo come percorso "c:\music1.midi"

Ho provato anche "/…; ma nulla, mi da sempre lo stesso errore.:d
aaa
03/04/09 13:13
netarrow
ah peccato.
prova a scaricare da questo sito "MidiSounder".
vedi se ti funziona, in tal caso prova a vedere le differenza che ci sono col codice.
se non funziona neanche quello o ormai è troppo vecchio e non è compatibile con le ultime versioni del JRE o potrebbe esserci qualche problema con il tuo hardware oppure essere un bug importante di java (infatti c'è il post riguardo il bug fra i tuoi link)

negli ultimi due casi non saprei come risolvere il problema, se non ricorrendo a processi esterni, usando qualche software di riproduzione midi e richiamandolo poi da java ma perderesti un pò di flessibilità ma soprattutto portabilità.
aaa
03/04/09 18:59
gmxsm
Ho scaricato il pacchetto, ho avviato "MidiSounder.exe" ma mi riporta questo errore:

"Errore nell'inizializzare il MidiSystem:javax.sound.midi.MidiUnavailableException: MIDI OUT transmitter not available"

"Errore nell'inizializzare lo strumento del canale java.lang.NullPointerException"

Potresti provare ad eseguire il file e vedere se a te funziona?

Spero che sia un bug di java piuttosto che qualche hardware non compatibile..:(
aaa
04/04/09 10:46
netarrow
ti da lo stesso errore, quindi il problema è qualcosa al di fuori del codice perchè quel programma mi è sempre funzionato.
l'ho provato per sicurezza ora e funziona.
Ultima modifica effettuata da netarrow 04/04/09 10:47
aaa
04/04/09 12:56
gmxsm
Speravo non fosse così :(

Allora può essere qualche incompatibilità software o hardware...

Partiamo dal software:

- Windows Vista Business 32 Sp1
Queste le cartelle in Programmia\Java
- jdk1.6.0_13
- jre1.6.0_07
Questa in Programmi
- JMF2.1.1e
IDE
- Netbeans 7.0M1

non so se serve altro..

Hardware:
- Intel Core 2 Quad Q6600
- Scheda madre p5k-e wifi
- 2x Corsair cm2x1024-6400 ddr2

A questo punto spero sia un problema di software perchè riuscire a programmare le api sound di java servirebbe per un esame e vorrei risolvere al più presto
:d

Grazie mille netarrow per il supporto che mi stai dando ;)
aaa