标签: web-midi

如何将Web Midi API连接到本机应用程序(如Ableton live)

[如果有更好的地方问这个问题,请告诉我!]

注意:我使用的是Mac。

我已使用Web MIDI API成功将MIDI键盘与浏览器(Chrome)连接。

我想知道是否还可以连接应用程序(如Ableton Live),以便当Ableton输出MIDI消息时,浏览器可以接收这些消息吗?

我看到的选项:

  1. 将Midi从Ableton发送到我的MIDI键盘,MIDI键盘将其转发到Web MIDI API(有人可以阐明如何设置吗?)
  2. 使用Mac OS中的IAC(应用程序间通信)驱动程序,“可以说,允许您在包装盒内的应用程序之间创建虚拟MIDI电缆。” 我不知道如何进行设置,因为“ Web midi api”未显示在Midi Studio中。

我更喜欢选项2,这样在没有物理MIDI设备的情况下也可以使用,但是我也很高兴知道选项1是否可以使用!

感谢您对此的任何投入!

javascript macos midi web-midi

7
推荐指数
2
解决办法
994
查看次数

JavaScript 音序器 MIDI 文件时序分辨率 (PPQN)

我阅读了很多关于 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)

javascript midi web-midi

7
推荐指数
1
解决办法
515
查看次数

你如何转置一个midi文件?

我正在使用这个 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)

html javascript audio midi web-midi

5
推荐指数
1
解决办法
1253
查看次数

Electron - 通过 Web MIDI API 发送 Sysex 消息会导致渲染器崩溃

我正在开发一个可以将 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 应用程序的上下文中满足这些条件。

javascript sysex node.js web-midi electron

5
推荐指数
0
解决办法
1485
查看次数

清除 MIDI 输出缓冲区

使用 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 不是函数

我认为这部分还没有实现。是这样吗?如果是这样,我今天可以使用其他替代方法吗?

javascript midi google-chrome chromium web-midi

5
推荐指数
1
解决办法
257
查看次数

检测是否在Web MIDI API中连接了MIDI接口

我正在使用Chrome/OS X中的Web Midi API进行试验.到目前为止,我得到了很好的结果,但我想知道:

有没有办法在应用程序运行时检测MIDI接口是否已连接/断开?

它现在的工作方式是重新启动浏览器,让应用程序知道接口是否存在......

似乎有一个MIDIAc​​cess onconnect/ondisconnect事件,但我不知道如何让它们触发.这是在Chrome(Canary)中实现的吗?

javascript midi midi-interface web-midi web-audio-api

4
推荐指数
1
解决办法
1515
查看次数

在Chrome Canary中没有实现Web MIDI API?

自2013年初以来,Chrome Canary已添加对Web MIDI API的支持.

那么,为什么当我输入requestMIDIAccessJavaScript控制台并点击回车时,我是否会收到"ReferenceError:requestMIDIAc​​cess未定义"?

根据官方文档,它应该是一个定义的功能.

是什么赋予了?

javascript google-chrome web-midi

4
推荐指数
1
解决办法
2442
查看次数

可以使用 web midi api 制作一个虚拟 midi 设备吗?

Web MIDI API 目前允许开发人员访问 MIDI 设备并向其发送事件。这意味着我们可以创建一个网页,向我们选择的 MIDI 设备发送 MIDI 消息或从我们选择的 MIDI 设备发送 MIDI 消息。

我希望创建三种类型的页面:

  • 虚拟 MIDI 键盘
  • 虚拟 MIDI 合成器
  • 虚拟 MIDI 电缆/插头

我希望这样做,以便用户可以通过标准的通信形式(MIDI 和网络 MIDI API)打开并使用不同的合成器演奏不同的键盘。他们甚至可以更改他们想要使用的连接管理。如果 Web MIDI API 支持,他们可以混合使用虚拟 Web MIDI 设备、虚拟桌面 MIDI 设备和真实 MIDI 设备。

但是,我找不到创建自己的虚拟设备的方法。有没有办法创建这样的设备?

web-midi

3
推荐指数
1
解决办法
1066
查看次数

如何指定Web 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 上发送同样的消息?

javascript google-chrome web-midi

3
推荐指数
1
解决办法
916
查看次数

如何解析Web MIDI API输入消息(onmidimessage)

假设我已经在使用Web MIDI API在MIDI输入上侦听消息,现在我正在尝试理解和利用我接收的数据。

如何从中解析一些基本信息MIDIMessageEvent

  • 命令
  • 渠道
  • 注意
  • 速度

我如何解释一些基本的MIDI事件的解析信息?

  • onNote
  • 平板电脑
  • onPitchBend
  • onModWheel

javascript midi ecmascript-6 web-midi

2
推荐指数
1
解决办法
481
查看次数

使用 JavaScript 检测浏览器中的 Midi-piano 键盘事件的库

我想将 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)

谢谢!

javascript midi midi-instrument web-midi

2
推荐指数
1
解决办法
1967
查看次数