前言
OK,我不知道,这是一个很好的问题,但我已经等不及了,所以这里是如何使用的Haskell写一些MIDI。我应该注意到,除了一些看起来相当神秘的软件包描述之外,这个主题几乎没有文档记录。
最适合我们需求的简约包装是HCodecs,它似乎会定期更新。我们对模块Codec.Midi感兴趣。
MIDI活动
在这个库事件预计将表示为元组:
(time-offset, message)
凡time-offset
被蜱经过时间(见下文如何设置每拍的节拍数数)之间最后的事件和新的事件。 message
必须是Message
类型,可以找到完整的构造函数列表here。这些构造函数对应于所有基本的MIDI事件。
创建曲目
曲目是事件列表。因此,我们现在可以写的东西很简单:
track0 = [(0, NoteOn 0 60 80),
(24, NoteOff 0 60 0),
(0, TrackEnd)]
这是一个音符(60 =中央C),我们在这里使用的事件NoteOn
和NoteOff
(它是一样的0
速度NoteOn
,所以在实践中的人倾向于仅使用NoteOn
)。有关在Google上可以做些什么的更多信息关于MIDI格式!
让我们创建一个包含E多一个轨迹:
track1 = [(0, NoteOn 0 64 80),
(24, NoteOn 0 64 0),
(0, TrackEnd)]
太好了!是时候将数据放入MIDI容器中了。
走到一起!
让我们创建代表整个MIDI文件的对象。我们将使用Midi
datatype的构造函数。
myMidi = Midi { fileType = MultiTrack,
timeDiv = TicksPerBeat 24,
tracks = [track0, track1] }
就是这样! timeDiv
定义了音轨的量化,如果我们每个节拍有24
刻度,我们的音符会准确地发出一个节拍(当然,您可以添加一些事件来设置节奏和东西,试试吧!)。
保存的东西
要保存Midi
我们应该使用exportFile
(点击链接以获取更多信息...... OK,只是在开玩笑,没有连一行说明):
exportFile "my-midi.mid" myMidi
完成。
我不知道Haskell,但测试和示例目录中的东西看起来很有趣。 – 2014-10-02 08:08:09
您是否已经尝试过更简单的Web上可用的程序(如[this one](http://www.increpare.com/2008/10/basic-haskell-midi-file-output/)或[其他同一作者](http://www.increpare.com/?s=midi))? – 2014-10-04 07:49:49
@Aurélien,当我试图Google讨论这个话题时,我看到了这个程序。不幸的是,我不知道这是如何在一个体面的程序中完成的(它使用'Codec.Midi',这真的很好吗?)。如果该代码有详细的评论,则会更有用。 – Mark 2014-10-04 07:56:26