我想用jFugue在applet中播放一些MIDI音乐。 MIDI模式有一个类 - Pattern
- 加载模式的唯一方法是从文件中获取。现在,我不知道applet如何加载文件和什么不是,但我使用的框架(PulpCore)使加载资产成为一项简单的任务。如果我需要从ZIP目录中获取资产,我可以使用提供Assets
和get()
方法的getAsStream()
类。 get()
将给定资源作为ByteArray
返回,另一个作为InputStream
返回。
我需要jFugue从ByteArray
或InputStream
加载模式。
在伪代码中,我想这样做:
Pattern.load(new File(Assets.get("mymidifile.midi")));
但是没有File构造函数可以使用ByteArray。建议,拜托?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
如果我没错,Pattern文件包含纯文本。使用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);
答案 2 :(得分: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
答案 3 :(得分:-1)
您可以读取字节数组并将其转换为字符串。
问题将是InputStream。有一个StringBufferInputStream,但它不赞成使用StringReader。
byte [] b = Assets.get();
InputStream is = new StringBufferInputStream(new String(b));
Pattern.load(is);
答案 4 :(得分:-2)
您不想使用File
,而是想使用java.io.ByteArrayInputStream