Frage

Ich möchte JFugue verwenden, um einige MIDI-Musik in einem Applet zu spielen. Es gibt eine Klasse für die MIDI-Muster - Pattern - und die einzige Methode, um das Muster zu laden, ist aus einer Datei. Nun, ich weiß nicht, wie Applets Dateien zu laden und was nicht, aber ich bin mit einem Rahmen (PulpCore), die Ladevermögen eine einfache Aufgabe macht. Wenn ich brauche, um einen Vermögenswert aus einem ZIP-Katalog zu greifen, kann ich die Assets Klasse verwenden, die Methoden get() und getAsStream() bietet. get() gibt den gegebenen Vermögenswert als ByteArray, die andere als InputStream.

Ich brauche JFugue das Muster von beiden ByteArray oder InputStream zu laden. In Pseudo-Code, würde Ich mag, dies zu tun:

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

Allerdings gibt es keine Datei-Konstruktor, der einen ByteArray nehmen würde. Vorschläge, bitte?

War es hilfreich?

Lösung

Es ist wahr, dass JFugue nicht zu Last alles erlaubt, aber eine Datei, was eine Schande ist, weil nichts daran hindert, jede andere Art von Strom mit:

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 (für 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;
}

Andere Tipps

Wenn ich nicht falsch bin, enthalten die Pattern-Dateien Klartext. Laden Sie die Datei mit getAsStream (), dann wandeln sie in einen String mit

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

Wo yourStream ist die Input von getAsStream () zurückgegeben wird. Verwenden Sie dann das Add (String ... Muster) Methode, um die Muster zu laden:

add(pattern);

Sie können diesen Code verwenden (von der Umsetzung der Pattern.loadPattern() Methode genommen):

    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

Sie können das Byte-Array gelesen und in einen String verwandeln.

Das Problem wird die Input sein. Es gibt eine StringBufferInputStream, aber es ist für String veraltet.

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

Sie haben nicht File verwenden wollen, möchten Sie java.io.ByteArrayInputStream

verwenden,
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top