2014-10-02 16 views
7

Mi piacerebbe creare un semplice programma che genererà file MIDI. No, non voglio usare Haskore, perché è un po 'eccessivo per questo progetto. Penso che qualcosa come this library sarà sufficiente.Creazione di file MIDI in Haskell

Quello che voglio essere in grado di fare:

  • creare un nuovo file MIDI;
  • scrivere alcuni eventi in esso (Voglio controllare velocità, intonazione e posizione nel tempo);
  • salva il file MIDI.

È così semplice, scommetto che non è difficile, ma non riesco a trovare alcun buon esempio come farlo.

Fornire un esempio di base o indicare dove posso trovare informazioni sulla creazione di file MIDI in Haskell.

Nota: non ti sto chiedendo una buona libreria per farlo, ti sto chiedendo come farlo in Haskell (con qualsiasi libreria che ritieni utile per l'utilizzo nell'esempio).

+3

Non conosco Haskell, ma la roba nelle directory di prova e di esempio sembra interessante. –

+0

Hai già provato programmi più semplici disponibili sul Web (come [questo] (http://www.increpare.com/2008/10/basic-haskell-midi-file-output/) o [altri dal stesso autore] (http://www.increpare.com/?s=midi))? –

+0

@ Aurélien, ho visto questo programma quando ho provato a Google l'argomento. Sfortunatamente non so se è così che dovrebbe essere fatto in un programma decente (usa 'Codec.Midi', è davvero buono?). Se quel codice avesse commenti dettagliati, sarebbe molto più utile. – Mark

risposta

6

Premessa

OK, non sono sicuro che fosse una buona domanda, ma non posso più aspettare, ecco come scrivere alcuni MIDI utilizzando Haskell. Devo notare che l'argomento è a malapena documentato, tranne per alcune descrizioni di pacchetti che sembrano piuttosto criptici.

Il pacchetto più minimalista che si adatta alle nostre esigenze è HCodecs e sembra essere aggiornato regolarmente. Siamo interessati al modulo Codec.Midi.

MIDI Eventi

di questa libreria eventi dovrebbero essere rappresentate come tuple:

(time-offset, message) 

Dove time-offset è il tempo trascorso in tick (vedi sotto come impostare il numero di tick per battuta) tra il ultimo evento e nuovo. message deve essere di tipo Message, l'elenco completo dei costruttori può essere trovato here. Questi costruttori corrispondono a tutti gli eventi MIDI di base.

Creazione di una traccia

Traccia è un elenco di eventi. Così possiamo scrivere qualcosa di molto semplicistico ora:

track0 = [(0, NoteOn 0 60 80), 
      (24, NoteOff 0 60 0), 
      (0, TrackEnd)] 

Si tratta di una nota (60 = Do centrale), abbiamo usato qui eventi NoteOn e NoteOff (è la stessa di NoteOn di 0 velocità, in modo nelle persone di pratica tendono a utilizzare solo NoteOn). Per ulteriori informazioni su cosa si può fare qui su Google in formato MIDI!

Creiamo una traccia più contenente E:

track1 = [(0, NoteOn 0 64 80), 
      (24, NoteOn 0 64 0), 
      (0, TrackEnd)] 

Grande! È ora di mettere i dati nel contenitore MIDI.

Vieni insieme!

Creiamo oggetto che rappresenta l'intero file MIDI. Useremo il costruttore di Midi datatype.

myMidi = Midi { fileType = MultiTrack, 
       timeDiv = TicksPerBeat 24, 
       tracks = [track0, track1] } 

Questo è tutto! timeDiv definisce la quantizzazione della traccia, se abbiamo i battiti per battito 24, le nostre note suoneranno esattamente per un battito (certo, è possibile aggiungere alcuni eventi per impostare il tempo e le cose, provalo!).

Salvare la roba

Per salvare un Midi dovremmo usare exportFile (clicca sul link per maggiori informazioni ... OK, sto scherzando non c'è anche una descrizione di una riga):

exportFile "my-midi.mid" myMidi 

Fatto.