[如果有更好的地方问这个问题,请告诉我!]
注意:我使用的是Mac。
我已使用Web MIDI API成功将MIDI键盘与浏览器(Chrome)连接。
我想知道是否还可以连接应用程序(如Ableton Live),以便当Ableton输出MIDI消息时,浏览器可以接收这些消息吗?
我看到的选项:
我更喜欢选项2,这样在没有物理MIDI设备的情况下也可以使用,但是我也很高兴知道选项1是否可以使用!
感谢您对此的任何投入!
我阅读了很多关于 MIDI 分辨率的内容,并研究了一些代码,如 Tone.js 和 heartbeat。但我不明白为什么会有不同的每季度音符 (PPQN)值以及它对演奏音符的影响。当我有 960 PPQN 时,这意味着 1 个四分音符有 960 个刻度,1 个八分音符 480 个刻度,等等。如果我理解正确,增量时间只是一个相对值。
我不明白的是,当我在 JavScript 中演奏音符时,PPQN 应该是什么,以及当我设置 PPQN 时为什么它应该具有这个值?例如,我使用 WebAudio API 来播放音符:
function nextNote() {
var quarterBeat = 60.0/tempo;
nextNoteDuration = nextNoteDuration + (quarterBeat/32);
currentNote++;
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以演奏不同的音符时长。现在,当我读取 MIDI 文件时,是否应该只比较增量时间并将其转换为我的音序器当前播放?例如,当我读取具有以下值的 MIDI 文件时:
Tempo = 120
PQN = 960
4 Quarter Notes
Run Code Online (Sandbox Code Playgroud)
我读取了 MIDI 文件,将音符保存在一个数组中(假设每个音符的增量时间为 1/4)
duration = [quarterNote, quarterNote, quarterNote, quarterNote]
Run Code Online (Sandbox Code Playgroud)
并演奏音符:
while (nextNoteDuration < audioContext.currentTime) {
if (duration[i] %32 == 0) playNote(currentNote, nextNoteDuration);
nextNote(); …Run Code Online (Sandbox Code Playgroud) 我正在使用这个 MIDI.js 库:https : //github.com/mudcube/MIDI.js
要加载插件并播放 MIDI 文件,我这样做:
window.onload = function () {
MIDI.loadPlugin({
soundfontUrl: "./soundfont/",
instruments: [ "acoustic_grand_piano" ],
callback: function() {
MIDI.programChange(0, 0);
_player = MIDI.Player;
}
});
Run Code Online (Sandbox Code Playgroud)
};
function playSong(){
_player.timeWarp = 1; // speed the song is played back
_player.loadFile(song[songid], _player.start);
_player.addListener(function(data) {
var now = data.now; // where we are now
var end = data.end; // time when song ends
var channel = data.channel; // channel note is playing on
var message = data.message; …Run Code Online (Sandbox Code Playgroud) 我正在开发一个可以将 sysex(系统专用)MIDI 消息发送到 MIDI 设备的 Electron 应用程序,每次我尝试发送 sysex 消息时,渲染器都会崩溃。我可以毫无问题地向设备发送非 sysex 消息(noteOn、noteOff 等)。
这是我正在做的一些事情:
message = [240, 126, 127, 6, 1, 247]; // device ID request
outputPort = midi.outputs.get(portID);
outputPort.send(message);
Run Code Online (Sandbox Code Playgroud)
在 Web 浏览器中,仅 Chrome,您需要具有安全连接并请求用户许可才能发送 sysex 消息。我想知道这两个 Web MIDI sysex 要求是否会导致此崩溃,因为我不清楚如何在 Electron 应用程序的上下文中满足这些条件。
使用 Web MIDI API,我可以发送一些消息:
// Note on
output.send([0x90, 0x20, 0x50]);
Run Code Online (Sandbox Code Playgroud)
我还可以安排一些消息在未来适时发送:
// Note off, 1 second later
output.send([0x80, 0x20, 0x40], performance.now() + 1000);
Run Code Online (Sandbox Code Playgroud)
现在,假设我已经安排了许多消息在未来几秒钟内发送,现在我想取消这些消息的发送。 根据规范,我应该能够调用clear输出:
output.clear();
Run Code Online (Sandbox Code Playgroud)
但是,这在 Chrome 上是未定义的(至少从 v79 开始)。
未捕获的类型错误:output.clear 不是函数
我认为这部分还没有实现。是这样吗?如果是这样,我今天可以使用其他替代方法吗?
我正在使用Chrome/OS X中的Web Midi API进行试验.到目前为止,我得到了很好的结果,但我想知道:
有没有办法在应用程序运行时检测MIDI接口是否已连接/断开?
它现在的工作方式是重新启动浏览器,让应用程序知道接口是否存在......
似乎有一个MIDIAccess onconnect/ondisconnect事件,但我不知道如何让它们触发.这是在Chrome(Canary)中实现的吗?
自2013年初以来,Chrome Canary已添加对Web MIDI API的支持.
那么,为什么当我输入requestMIDIAccessJavaScript控制台并点击回车时,我是否会收到"ReferenceError:requestMIDIAccess未定义"?
根据官方文档,它应该是一个定义的功能.
是什么赋予了?
Web MIDI API 目前允许开发人员访问 MIDI 设备并向其发送事件。这意味着我们可以创建一个网页,向我们选择的 MIDI 设备发送 MIDI 消息或从我们选择的 MIDI 设备发送 MIDI 消息。
我希望创建三种类型的页面:
我希望这样做,以便用户可以通过标准的通信形式(MIDI 和网络 MIDI API)打开并使用不同的合成器演奏不同的键盘。他们甚至可以更改他们想要使用的连接管理。如果 Web MIDI API 支持,他们可以混合使用虚拟 Web MIDI 设备、虚拟桌面 MIDI 设备和真实 MIDI 设备。
但是,我找不到创建自己的虚拟设备的方法。有没有办法创建这样的设备?
如何使用 MIDI Web API指定在哪个通道上发送 MIDI 消息?
官方文档中的这个示例展示了如何在通道 1 上发送消息。但在代码片段中,我没有找到任何对此的引用。
// This example sends a middle C note on message immediately on MIDI channel 1
function sendMiddleC( midiAccess, portID ) {
var noteOnMessage = [0x90, 60, 0x7f]; // note on, middle C, full velocity
var output = midiAccess.outputs.get(portID);
output.send( noteOnMessage ); //omitting the timestamp means send immediately.
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在频道 2 上发送同样的消息?
假设我已经在使用Web MIDI API在MIDI输入上侦听消息,现在我正在尝试理解和利用我接收的数据。
如何从中解析一些基本信息MIDIMessageEvent?
我如何解释一些基本的MIDI事件的解析信息?
我想将 midi 钢琴键盘插入计算机的 USB 端口,并通过在浏览器中显示某些内容来响应按键事件。
有谁知道有一个库可以允许 JavaScript 与前端/浏览器中的 USB midi 键盘事件交互?
类似于:
链接到index.html的script.js文件:
$(document).on('midi-key-press', function(event) {
alert('the key that you pressed was ' + event.whichKey);
});
Run Code Online (Sandbox Code Playgroud)
谢谢!