2010-04-24 1 views
1

Я хочу использовать jFugue для воспроизведения MIDI-музыки в апплете. Существует класс для шаблона MIDI - Pattern - и единственный способ загрузить шаблон из файла. Теперь я не знаю, как апплеты загружают файлы, а что нет, но я использую фреймворк (PulpCore), который делает загрузку активов простой задачей. Если мне нужно захватить актив из каталога ZIP, я могу использовать класс Assets, который предоставляет методы get() и getAsStream(). get() возвращает данный актив как ByteArray, а другой - InputStream.Файл Java и ByteArray или InputStream

Мне нужно jFugue для загрузки рисунка из ByteArray или InputStream. В псевдо-коде, я хотел бы сделать это:

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

Однако нет конструктора файла, который будет принимать ByteArray. Предложения, пожалуйста?

ответ

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; 
} 
+0

, используя этот код, файл загружается без ошибок, но не воспроизводится. Теперь я полностью теряю рассудок. все, что я хотел, это загрузить миди и сыграть в него. –

+0

Я думаю, вы должны использовать loadMidi для загрузки midi-файла –

-1

Вы можете прочитать массив байтов и превратить его в строку.

Проблема будет InputStream. Существует StringBufferInputStream, но он устарел в пользу StringReader.

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

Что это может сделать, кроме как развращать данные? –

+0

Вау - почему голос? – duffymo

+0

Теперь я знаю ...... – duffymo

-2

Вы не хотите использовать File, вы хотите использовать java.io.ByteArrayInputStream

+0

Это не полезно, нам сказали, что Pattern.load принимает только файл в качестве аргумента. – Geoff

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 является InputStream, возвращаемый getAsStream(). Затем используйте надстройку (String ... Узоры) метод для загрузки шаблона:

add(pattern); 
+0

Это кажется лучшим выбором для меня. Вы можете увидеть на странице примеров (http://www.jfugue.org/examples.html), что шаблон может быть построен с помощью Stirng, если вы предпочитаете. Pattern pattern = new Pattern (convertToString (getInputStream())); – Geoff

+0

выглядит хорошо, я пытался, но я получил сообщения об ошибках. файл содержит некоторые не-музыкальные данные, название, автор или что-то еще, и он будет анализировать. Я пошел на один из более полных примеров, опубликованных ниже. –

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