2014-10-02 30 views
7

我想创建一个简单的程序来生成MIDI文件。不,我不想使用Haskore,因为这个项目对于这个项目来说有点矫枉过正。我认为像this library就足够了。在Haskell中创建MIDI文件

我希望能够做的:

  • 创建新的MIDI文件;写一些事件(我想控制速度,音高和位置);
  • 保存MIDI文件。

这很简单,我敢打赌这并不难,但我找不到任何好的例子如何做到这一点。

请提供一个基本示例或指出我可以在哪里找到有关在Haskell中创建MIDI文件的信息。

注意:我并没有要求你提供一个好的库来做这件事,我问你如何在Haskell中做到这一点(在任何你认为适合使用的库中)。

+3

我不知道Haskell,但测试和示例目录中的东西看起来很有趣。 – 2014-10-02 08:08:09

+0

您是否已经尝试过更简单的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

+0

@Aurélien,当我试图Google讨论这个话题时,我看到了这个程序。不幸的是,我不知道这是如何在一个体面的程序中完成的(它使用'Codec.Midi',这真的很好吗?)。如果该代码有详细的评论,则会更有用。 – Mark 2014-10-04 07:56:26

回答

6

前言

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),我们在这里使用的事件NoteOnNoteOff(它是一样的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 

完成。