0.1.1 • Published 3 years ago

@midilab/core v0.1.1

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

midilab-core:轻量级Web数字音乐引擎

npm NPM GitHub Repo stars

快速入门

安装

npm:

npm i @midilab/core -S
// ES Module
import * as MidiLabCore from '@midilab/core'
// CommonJS
const MidiLabCore = require('@midilab/core');

浏览器:

<script src="https://cdn.jsdelivr.net/npm/@midilab/core@0.1.1/dist/midilab-core.min.js"></script>

初始化

await MidiLabCore.init();

后续操作都要在初始化后进行

创建输出

创建新的输出通道:

new MidiLabCore.Output();

输出通道通过 MidiLabCore.res.output[i] 访问,初始化时会创建默认输出 MidiLabCore.res.output[0]

控制输出音量:

output[0].gain = 0.5;

加载音频资源

// MidiLabCore.res.loadBuffer(id, url)
MidiLabCore.res.loadBuffer('Piano-f', 'sample/Piano-f.ogg');

该函数返回一个 Promise,加载音频资源需要指定唯一id,作为后续对资源的索引

使用 onBufferLoad 添加音频加载后执行的回调函数(注意添加的函数在每次资源更新后都会执行):

MidiLabCore.res.onBufferLoad('Piano-f', buffer => { ... });

创建乐器

// new MidiLabCore.Instrument(outputId = 0);
const Piano = new MidiLabCore.Instrument();

创建乐器时可以指定输出通道,默认为0号输出

添加组

一个乐器可以有多种演奏技巧、不同演奏力度的采样,因此需要分组

使用 createGroup 给乐器添加组:

const group = Piano.createGroup();
group.gain = 0.7; // 设置组音量

设置组里音符的包络曲线:

group.envelope.push(
  {type: 0, value: 1, time: 0.02},  // 经过0.02秒,音量线性增加到1
  {type: 1, value: 0.5, time: 0.5}, // 经过0.5秒,音量指数衰减到0.5
);
group.release = 0.5; // 设置音符释放后衰减时间为0.5秒

设置组的力度映射:

// group.setDyn(start, mid, end);
group.setDyn(0, 63, 127);

这里设置响应的力度范围为0-127,63时为最大,也就是说从0-63,这个组的音量逐渐增加,63-127音量逐渐下降到0

例如,对于一个4层力度 (pp, p, f, ff) 的乐器,可以分别设置四个组的力度映射为 (0, 31, 63), (31, 63, 95), (63, 95, 127), (95, 127, 128)

MIDI制作中有两种常用的力度处理方案:对于单次演奏的音,在音符播放一开始就决定了力度,之后不再更改;对于连续长音,可以开启动态过渡,音符播放途中也可以调整力度,这样就能实现渐强音等效果。

group.enableXFade();  // 开启动态过渡
group.disableXFade(); // 关闭动态过渡
添加音符
// new MidiLabCore.Instrument.Zone(src, root, tune, start, duration);
const zone = new MidiLabCore.Instrument.Zone('Piano-f', 60, 0, 4, 4);

src 设置音频源,对应前面 loadBuffer 加载资源的id

root 指定这个音符是哪个音,音符代码可以使用工具函数获得:

MidiLabCore.utils.note('C4')  // 60
MidiLabCore.utils.note('#F5') // 78
MidiLabCore.utils.note('bB2') // 34

tune 微调音符的音高

startduration 指定音符在音频中的位置(单位为秒)

使用 addZone 将音符添加到组里,fromto 设置音符覆盖的范围

// group.addZone(zone, from, to)
group.addZone(zone, 59, 61); // 音符覆盖B4到#C4

演奏

立即播放音符C4,长度0.5秒:

// playNote(note, time = 0, duration = 0, velocity = this.dyn)
Piano.playNote(MidiLabCore.utils.note('C4'), 0, 0.5);
// 或者写成 Piano.playNote(60, 0, 0.5);

5秒后播放,力度为64

Piano.playNote(60, 5, 0.5, 64);

不指定播放长度,需要手动释放:

Piano.playNote(60);
...
Piano.releaseNote(60); // 之后需要释放音符

添加效果

组、乐器、输出都可以添加效果器

例如在0号输出上添加混响效果:

// 加载混响采样
MidiLabCore.res.loadBuffer('conv/hall', 'sample/conv/hall.wav');
// 创建混响器 Convolver(src, dry = 1, wet = 1)
const conv = new MidiLabCore.effects.Convolver('conv/hall', 1, 1);
// 添加到0号输出
MidiLabCore.res.output[0].addEffect(conv);