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.
Non conosco Haskell, ma la roba nelle directory di prova e di esempio sembra interessante. –
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))? –
@ 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