Question

Je veux utiliser jFugue pour jouer de la musique MIDI dans une applet. Il y a une classe pour le modèle MIDI - Pattern - et la seule méthode pour charger le modèle est à partir d'un fichier. Maintenant, je ne sais pas comment applets charger des fichiers et ce pas, mais je me sers d'un cadre (PulpCore) qui fait des actifs de chargement d'une tâche simple. Si je dois récupérer un actif d'un catalogue ZIP, je peux utiliser la classe Assets qui fournit des méthodes de get() et getAsStream(). get() renvoie l'actif donné à titre d'ByteArray, l'autre comme un InputStream.

Je dois jFugue pour charger le motif à partir soit ByteArray ou InputStream. Je voudrais faire en pseudo-code, ceci:

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?

Était-ce utile?

La solution

Il est vrai que jFugue ne permet pas de quoi que ce soit de la charge, 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;
}

Autres conseils

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 la méthode add (String ... Patterns) pour charger le motif:

add(pattern);

Vous pouvez utiliser ce code (extrait 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

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

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top