用JS生成MIDI文件(附代码)

用JS生成MIDI文件

大家好,近期我们的课程需要我们做一个应用,我的的小组打算做一个在线的伴奏制作平台,这意味着我们需要知道如何在线制作音乐以及如何用浏览器播放。
小编我这一节就跟大家讲解下如何用Javascript从无到有编写一个属于自己的MIDI制作程序吧。

首先,先给大家一篇讲解MIDI格式讲解的链接,中文!小编这里就不多赘述啦。
http://blog.sina.com.cn/s/blog_6f72ff900101f95b.html

首先,我们的一个理解就是MIDI就是由大量的音轨串联而成,然后每个音轨由一个头以及一堆事件构成(作为一个快速上手的例子,小编这里不介绍更多复杂的比如说控制器等东西,只讲音符,感兴趣的读者可以阅读上面的那个链接,都是一样做的~)。就是酱紫!

文件头

我们知道MIDI的文件头就是“MThd”+一串设置(比如说你有多少个音轨啊,播放速度怎么样啊等等)。所以呢,我们就可以写出下面的代码


function init_header(Config) {
   
    var rt = "MThd";
    rt += insertInt(Config.road_length, 4);
    rt += insertInt(1, 2);
    rt += insertInt(Config.road_num, 2);
    rt += insertInt(Config.ticknum, 2);
    return rt;
}

观察这段代码,你会发现我用了string来存储这些信息,之所以用string呢是因为string足够我们使用了,读者如果觉得还是用字节存储比较好的话推荐学习js的Buffer或Uint8Arrary。
insertInt是一个插入数据的辅助函数,比如说road_length等于20,但是我希望他占据4个字节,那我调用insertInt(road_length, 4)就可以了。可以看到,这个头部是非常的简单的,其实头部还有很多其他的信息可以加,感兴趣的读者可以自行添加,反正就是rt+=的事。至于内容要怎么设定嘛,读者看下那篇博客吧~

音轨

正如一开始介绍的,文件头之后,跟着的是多个串联的音轨。既然是串联,那就只写一个音轨的创建就好啦,其他的一样调用。

音轨头

音轨首先会有音轨头,之后还有事件等等。这里先说音轨头…还是不说了,文件头也是头,音轨头也是头,两个东西的实现几乎没什么两样。下面放代码

function init_road(Config) {
   
    var rt = "";
    rt += "MTrk";
    rt += insertInt(Config.road_length+15, 4);
    rt += create_event(0, set_beat(0x4, 0x4));
    rt += create_event(0, set_speed(0x07A120));
    return rt;
}

当然,小编说的没什么两样,并不是说内容也是一样,音轨毕竟音轨,跟文件肯定是有本质的区别,这个本质的区别就在上面rt要拼的内容不一样而已…

事件

接下来是事件,事件大体上可以分为音符、控制器和系统信息这几个种类。那么比如一个音符,就会有按下和松开两种情况,当然每个事件都有事件的发生事件间隔(注意是间隔),因此,为了谱一段音乐,我们可以有如下代码。


                
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值