2013-09-04 10 views
5

Voglio prendere un file MIDI, leggerlo e quindi archiviare i dati in una sorta di struttura dati. L'utilizzo di questo sito che ho trovato un modo semplice per leggere il file, che funziona come un fascino:Converti struttura dati MIDI in Java (Elenco, Hash Map, ???)

Reading MIDI Files

Ora ho bisogno di trovare un modo per afferrare che la produzione e memorizzarlo. Una mappa hash non sembra ideale dato che le chiavi devono essere uniche e una lista di tipo Object non sembra grandiosa. Qualche idea su quale potrebbe essere la mia migliore opzione. Suppongo che potrei produrlo in un testo o in un csv ... Pensieri?

AGGIORNAMENTO: un po 'più in dettaglio su quello che ho già.

Ecco l'output sto ottenendo (attraverso 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 

Ora ho solo bisogno di trovare il miglior metodo di memorizzazione di queste informazioni. Probabilmente dovrei essere a conoscenza del "perché" sto cercando di fare anche questo. Sto lavorando con un altro sviluppatore che prenderà questi dati e userà Batik (di cui non so nulla) per visualizzarlo sullo schermo.

Grazie per tutte le risposte ... Guarderò attentamente ognuno di loro stasera ...

+1

Prima di tutto bisogna pensare agli oggetti e metodi necessari, penso, prima di pensare a struttura di dati. Quali sono i nomi e i verbi del tuo problema? –

+0

Se si desidera solo trasmettere csv, quindi output csv. Perché hai bisogno di metterlo in una struttura dati e quindi di produrre CSV? – Bill

+0

Hovercraft, ho modificato la mia domanda per mostrare un po 'più di dettaglio. Immagino che nomi e verbi del mio problema siano eventi MIDI (Note On, Note Off, Velocity, Track, ecc.) E "store" o "write". Sto già generando l'output di cui ho bisogno riguardo ai nomi ... Non sono sicuro di quale sia l'opzione migliore in termini di realizzazione dei verbi ... – user2745258

risposta

4

Leggendo le specifiche dei file MIDI, penso che si può iniziare a creare qualcosa di simile

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

Se si desidera solo per memorizzare i messaggi MIDI (file in modo non MIDI), si potrebbe fare una classe per i messaggi

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

Il tipo di raccolta che si utilizza per negozio sarà un'applicazione specifica, come vuoi accedere agli elementi della lista e molto altro ancora.

Se si desidera semplicemente inserire i MIDIMessages nella raccolta e quindi leggere dal primo all'ultimo, è possibile utilizzare una LinkedList (che è un'implementazione di List). Ma se vuoi modificare i messaggi e accedere agli elementi con un indice, vorresti usare un ArrayList (anche questa è una implementazione di List).

Informazione della struttura dei file MIDI da http://faydoc.tripod.com/formats/mid.htm

+0

Diego, a meno che non vedo qualcos'altro in fondo alla strada, penso Vado con l'opzione ArrayList. Pubblicherò il mio codice quando avrò questo e lavorando. Grazie per gli sforzi extra sulla risposta ... molto completa e utile. – user2745258