2010-04-24 4 views
1

Je souhaite utiliser jFugue pour lire de la musique MIDI dans une applet. Il y a une classe pour le pattern MIDI - Pattern - et la seule méthode pour charger le pattern provient d'un fichier. Maintenant, je ne sais pas comment les applets chargent les fichiers et ce qui ne l'est pas, mais j'utilise un framework (PulpCore) qui rend le chargement des assets une tâche simple. Si j'ai besoin de récupérer un actif à partir d'un catalogue ZIP, je peux utiliser la classe Assets qui fournit les méthodes get() et getAsStream(). get() renvoie l'actif donné en tant que ByteArray, l'autre en tant que InputStream. J'ai besoin de jFugue pour charger le motif à partir de ByteArray ou InputStream. En pseudo-code, je voudrais faire:Java File et ByteArray ou InputStream

Pattern.load(new File(Assets.get("mymidifile.midi"))); 

Cependant, il n'y a pas de constructeur de fichiers qui prendrait ByteArray. Suggestions, s'il vous plaît?

Répondre

2

Il est vrai que jFugue ne permet pas de charger quoi que ce soit, mais un fichier, ce qui est dommage parce que rien ne l'empêche d'utiliser tout autre type de flux:

public static final String TITLE = "Title"; 

public static Pattern loadPattern(File file) throws IOException { 
    InputStream in = new FileInputStream(file); 
    try { 
     return loadPattern(in); 
    } finally { 
     in.close(); 
    } 
} 

public static Pattern loadPattern(URL url) throws IOException { 
    InputStream in = url.openStream(); 
    try { 
     return loadPattern(in); 
    } finally { 
     in.close(); 
    } 
} 

public static Pattern loadPattern(InputStream in) throws IOException { 
    return loadPattern(new InputStreamReader(in, "UTF-8")); // or ISO-8859-1 ? 
} 

public static Pattern loadPattern(Reader reader) throws IOException { 
    if (reader instanceof BufferedReader) { 
     return loadPattern(reader); 
    } else { 
     return loadPattern(new BufferedReader(reader)); 
    } 
} 

public static Pattern loadPattern(BufferedReader bread) throws IOException { 
    StringBuffer buffy = new StringBuffer(); 

    Pattern pattern = new Pattern(); 
    while (bread.ready()) { 
     String s = bread.readLine(); 
     if ((s != null) && (s.length() > 1)) { 
      if (s.charAt(0) != '#') { 
       buffy.append(" "); 
       buffy.append(s); 
      } else { 
       String key = s.substring(1, s.indexOf(':')).trim(); 
       String value = s.substring(s.indexOf(':')+1, s.length()).trim(); 
       if (key.equalsIgnoreCase(TITLE)) { 
        pattern.setTitle(value); 
       } else { 
        pattern.setProperty(key, value); 
       } 
      } 
     } 
    } 
    return pattern; 
} 

UPDATE (pour loadMidi)

public static Pattern loadMidi(InputStream in) throws IOException, InvalidMidiDataException 
{ 
    MidiParser parser = new MidiParser(); 
    MusicStringRenderer renderer = new MusicStringRenderer(); 
    parser.addParserListener(renderer); 
    parser.parse(MidiSystem.getSequence(in)); 
    Pattern pattern = new Pattern(renderer.getPattern().getMusicString()); 
    return pattern; 
} 

public static Pattern loadMidi(URL url) throws IOException, InvalidMidiDataException 
{ 
    MidiParser parser = new MidiParser(); 
    MusicStringRenderer renderer = new MusicStringRenderer(); 
    parser.addParserListener(renderer); 
    parser.parse(MidiSystem.getSequence(url)); 
    Pattern pattern = new Pattern(renderer.getPattern().getMusicString()); 
    return pattern; 
} 
+0

en utilisant ce code le fichier est chargé sans erreurs, mais ne sera pas lu. Je perds complètement la tête maintenant. Tout ce que je voulais, c'était charger un midi et le jouer. –

+0

Je suppose que vous devriez utiliser loadMidi pour charger un fichier midi –

-1

Vous pouvez lire le tableau d'octets et le transformer en chaîne.

Le problème sera le InputStream. Il y a un StringBufferInputStream, mais il est déprécié en faveur de StringReader.

byte [] b = Assets.get(); 
InputStream is = new StringBufferInputStream(new String(b)); 
Pattern.load(is); 
+0

Qu'est-ce que cela pourrait faire d'autre que de corrompre les données? –

+0

Wow - pourquoi le vote à la baisse? – duffymo

+0

Maintenant, je sais ...... – duffymo

-2

Vous ne voulez pas utiliser File, vous souhaitez utiliser java.io.ByteArrayInputStream

+0

Ce n'est pas utile, on nous a dit que le Pattern.load prend seulement un fichier comme argument. – Geoff

1

Si je ne me trompe pas, les fichiers de motifs contiennent le texte brut. Chargez le fichier en utilisant getAsStream(), puis le convertir en une chaîne en utilisant

BufferedReader br = new BufferedReader(new InputStreamReader(yourStream)); 
//... 
String pattern = convertToString(br); // you should implement convertToString yourself. It's easy. Read the java.io APIs. 

Où yourStream est le InputStream retourné par getAsStream(). Ensuite, utilisez le module complémentaire (String ... motifs) méthode pour charger le motif:

add(pattern); 
+0

Cela semble être le meilleur choix pour moi. Vous pouvez voir sur la page des exemples (http://www.jfugue.org/examples.html) que ce modèle peut être construit avec un Stirng si vous préférez. Motif de motif = nouveau Motif (convertToString (getInputStream())); – Geoff

+0

semble bon, j'ai essayé, mais j'ai eu des messages d'erreur. le fichier contient des données non musicales, un titre, un auteur, etc. J'ai choisi l'un des exemples les plus complets ci-dessous. –

1

Vous pouvez utiliser ce code (tiré de la mise en œuvre de la méthode Pattern.loadPattern()):

InputStream is = ...; // Get a stream from the Asset object 

    // Prepare a pattern object 
    Pattern pattern = new Pattern(); 

    // Now start reaing from the stream 
    StringBuffer buffy = new StringBuffer(); 
    BufferedReader bread = new BufferedReader(new InputStreamReader(is)); 
    while (bread.ready()) { 
     String s = bread.readLine(); 
     if ((s != null) && (s.length() > 1)) { 
      if (s.charAt(0) != '#') { 
       buffy.append(" "); 
       buffy.append(s); 
      } else { 
       String key = s.substring(1, s.indexOf(':')).trim(); 
       String value = s.substring(s.indexOf(':')+1, s.length()).trim(); 
       if (key.equalsIgnoreCase(TITLE)) { 
        pattern.setTitle(value); 
       } else { 
        pattern.setProperty(key, value); 
       } 
      } 
     } 
    } 
    bread.close(); 
    pattern.setMusicString(buffy.toString()); 

    // Your pattern is now ready