我如何使用javascript播放任意MIDI音符
How do I play arbitrary MIDI notes with javascript?
澄清一下:我不想生成MIDI文件,也不想播放MIDI文件,我希望在飞行中播放MIDI音符。
我试着使用https://github.com/mudcube/MIDI.js作为MIDI库,它有点工作。
我可以通过调用MIDI.noteOn(0,midiNumber,100);
来演奏音符。然而,这播放一个音符几秒钟,然后逐渐减少,即使我从来没有调用MIDI.noteOff
。
我不相信这是MIDI的工作方式。我希望能够调用noteOn,并有一个音符播放和维持,直到noteOff被调用。
适用浏览器:现代firefox/chrome。
这是你的MIDI.js版本的bug:
var playChannel = function (id) {
var note = notes[id];
if (!note) return;
var nid = (channel_nid + 1) % channels.length;
var time = (new Date()).getTime();
var audio = channels[nid];
channel_map[note.id] = audio;
audio.src = MIDI.Soundfont[note.id];
audio.volume = volume;
audio.play();
channel_nid = nid;
};
你可以看到playChannel
将加载一个给定的音符并播放它。因为没有自动循环属性,所以它不会重复,所以没有必要调用noteOff
。如果您将audio
元素设置为auto-loop,则可以自己解决此问题。
或者,http://mohayonao.github.io/timbre.js/提供了各种声音生成器,可以调用noteOn和noteOff。
不同的工具表现不同。钢琴有一个"内在"音,但管风琴没有。
同样,noteOn
和noteOff
取决于实现。HTML5实现中的modcu.be
为每个音符播放一个OGG文件,它根本不关心noteOff
。当OGG结束时,声音停止。在这种情况下,autoloop
对钢琴没有帮助。
这是正确的行为。你需要一个更好的样本库来播放长声音。
参见教堂风琴的无尽的声音的例子。
这个例子使用WebAudioFont播放超过1500种乐器和鼓。这个库支持ADSR,混响和循环点。
Google for Web MIDI API。它还没有在所有浏览器中实现,但是Chris Wilson在GitHub上有一个polyfill。
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 我们可以使用任意的编程语言来动态化HTML页面吗
- RegExp匹配任意字符串+8位数字
- 检查是否存在任意控制器/操作
- IE10+11:XSLT转换将任意CR/LF添加到XML中
- java安全doPrivileged方法如何阻止任意脚本
- 具有任意绑定的角度多选菜单
- 财产'catch'在类型'可观察<任意>'
- 一个html/javascript'小工具'知道用户何时单击了小部件外的任意位置
- 用任意html替换ExtJS组件的内容
- 为任意html文档创建不引人注目的覆盖
- 在任意字符串中创建所有URL的链接
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 使用javascript更改任意文本的背景颜色
- 匹配三个正则表达式中的任意一个,以先到的为准(在javascript中)
- 将任意对象传递给Coffeescription'的匿名函数
- 使用jquery队列按顺序淡入任意数量的文本行
- 单击任意位置如何关闭框
- 具有任意多条线的D3折线图(以及特定的数据格式)
- 我如何使用javascript播放任意MIDI音符