1

jFugueを使用してアプレットでMIDI音楽を再生したいと思います。MIDIパターン用のクラスがあります---Patternそしてパターンをロードする唯一のメソッドはファイルからです。現在、アプレットがファイルをロードする方法とそうでない方法はわかりませんが、アセットのロードを簡単なタスクにするフレームワーク(PulpCore)を使用しています。ZIPカタログからアセットを取得する必要がある場合は、メソッドAssetsを提供するクラスを使用できます。指定されたアセットを、として返し、もう一方を。として返します。get()getAsStream()get()ByteArrayInputStream

ByteArrayまたはのいずれかからパターンをロードするには、jFugueが必要ですInputStream。擬似コードでは、これを実行したいと思います。

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

ただし、ByteArrayを使用するFileコンストラクターはありません。提案をお願いします?

4

5 に答える 5

2

jFugueがファイル以外のものをロードすることを許可しないのは事実です。これは、他の種類のストリームの使用を妨げるものがないため、残念です。

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(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;
}
于 2010-04-24T11:21:23.943 に答える
1

私が間違っていなければ、パターンファイルにはプレーンテキストが含まれています。getAsStream()を使用してファイルをロードし、を使用して文字列に変換します

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

yourStreamは、getAsStream()によって返されるInputStreamです。次に、add(String ... Patterns)メソッドを使用してパターンをロードします。

add(pattern);
于 2010-04-24T11:07:09.603 に答える
1

このコードを使用できます(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
于 2010-04-24T11:12:42.297 に答える
-1

バイト配列を読み取り、それを文字列に変換することができます。

問題はInputStreamになります。StringBufferInputStreamがありますが、StringReaderを優先して非推奨になりました。

byte [] b = Assets.get();
InputStream is = new StringBufferInputStream(new String(b));
Pattern.load(is);
于 2010-04-24T10:54:37.113 に答える
-2

使いたくない、使いFileたいjava.io.ByteArrayInputStream

于 2010-04-24T11:06:13.997 に答える