2013-09-04 9 views
5

Chcę pobrać plik MIDI, odczytać go, a następnie zapisać dane w jakiejś strukturze danych. Korzystanie z tej witryny znalazłem łatwy sposób odczytać plik, który działa jak czar:Konwertuj strukturę danych MIDI na Java (List, Hash Map, ???)

Reading MIDI Files

teraz muszę wymyślić sposób, aby złapać tego wyjścia i przechowywać go. Mapa skrótu nie wydaje się idealna, ponieważ klucze muszą być niepowtarzalne, a lista obiektów typu nie wydaje się wspaniała. Wszelkie pomysły na temat mojej najlepszej opcji. Przypuszczam, że mógłbym wypisać go do tekstu lub csv ... Myśli?

AKTUALIZACJA: Trochę więcej szczegółów na temat tego, co już mam.

Oto wynik Dostaję (poprzez System.out.println):

@0 Channel: 1 Note on, E5 key=76 velocity: 127 
@192 Channel: 1 Note off, E5 key=76 velocity: 64 
@192 Channel: 1 Note on, D#5 key=75 velocity: 127 
@384 Channel: 1 Note off, D#5 key=75 velocity: 64 
@384 Channel: 1 Note on, E5 key=76 velocity: 127 

Teraz po prostu trzeba znaleźć najlepszy sposób przechowywania tych informacji. Prawdopodobnie powinienem być nieświadomy "dlaczego", próbuję to zrobić. Pracuję z innym programistą, który zamierza pobrać te dane i użyć Batika (o czym nic nie wiem), aby wyświetlić go na ekranie.

Dzięki za wszystkie odpowiedzi ... Będę uważnie patrzeć na każdy z nich dzisiaj ...

+1

najpierw trzeba pomyśleć o obiektach i metod potrzebnych, jak sądzę, przed myśleniem o strukturze danych. Jakie są rzeczowniki i czasowniki twojego problemu? –

+0

Jeśli chcesz tylko wyprowadzić csv, wyjdź csv. Dlaczego musisz umieścić go w strukturze danych, a następnie wydrukować plik CSV? – Bill

+0

Hovercraft, zredagowałem moje pytanie, aby pokazać trochę więcej szczegółów. Sądzę, że rzeczowniki i czasowniki mojego problemu będą zdarzeniami MIDI (Note On, Note Off, Velocity, Track, itp.) I "store" lub "write". Już generuję wyjście, którego potrzebuję odnośnie rzeczowników ... Po prostu nie jestem pewien, jaka jest najlepsza opcja pod względem realizacji czasowników ... – user2745258

Odpowiedz

4

Czytając specyfikację plików MIDI, myślę, że można zacząć tworzyć coś podobnego

public class MIDIFile { 
    enum FileFormat { 
     single_track, 
     syncronous_multiple_tracks, 
     assyncronous_multiple_tracks; 
    } 

    FileFormat file_format; 
    short numberOfTracks; 
    short deltaTimeTicks; 

    //Create Class for tracks, events, put some collection for storing the tracks, 
    //some collection for storing the events inside the tracks, etc 

    //Collection<Integer, MIDITrack> the type of Collection depends on application 

} 

public class MIDITrack { 
    int length; 
    //Collection<MIDIEvent> the type of Collection depends on application 
} 

public class MIDIEvent { 
    int delta_time; 
    int event_type; //Use of enum or final variables is interesting 
    int key; 
    int velocity; 
} 

Jeśli chcesz tylko do przechowywania komunikatów MIDI (MIDI plik tak nie), można zrobić klasy dla wiadomości

public class MIDIEvent { 
    int delta_time; 
    int channel; 
    int event_type; //Use of enum or final variables is interesting 

    //two bytes, interpret according the message type 
    byte byte0; 
    byte byte1; 

    //or more memory consuming 
    byte key; 
    byte pressure; 
    byte controller; 
    short bend; 
} 

Rodzaj Collection użyć do sklepu będą specyficzne aplikacje, jak chcesz uzyskać dostęp do elementów listy i wiele więcej.

Jeśli chcesz tylko wstawić MIDIMessages do kolekcji, a następnie odczytać od pierwszego do ostatniego, możesz użyć obiektu LinkedList (jest to implementacja listy). Ale jeśli chcesz zmodyfikować wiadomości i elementy dostępu przez indeks, możesz użyć ArrayList (to również implementacja List).

Informacja o strukturze pliku MIDI z http://faydoc.tripod.com/formats/mid.htm

+0

Diego, Chyba że widzę coś innego w drodze, myślę Mam zamiar wybrać opcję ArrayList. Opublikuję mój kod, gdy go otrzymam i będę pracował. Dzięki za dodatkowe wysiłki na odpowiedź ... bardzo dokładne i pomocne. – user2745258