问题标签 [web-midi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
207 浏览

angular - 为什么我的 Tone.js Transport 没有连续运行多次?

我用来播放一些配乐,并且在组件加载时Tone.js对 Transport 进行分层:Angular

我观察到构造函数被调用了两次。所以我想确保在启动之前停止传输。我是否应该了解 Transport 仅在应用程序生命周期中启动一次?无论如何,在开始前停下来对我的问题没有帮助。

问题是,有时,当我尝试一个接一个地播放多个音轨时,记录器不会出现。

0 投票
1 回答
539 浏览

javascript - 如何为tone.js中正在播放的音符添加事件监听器

我正在构建一个由 Tone.js 提供支持的小型 Web 应用程序来训练自己弹奏钢琴键(可能还有其他一些练习)。到目前为止,您可以选择根音和音阶类型,然后单击播放,它将循环播放该音阶。还有一个键盘/合成器是我从其中一个tone.js 示例中提取的,您可以单击钢琴键,使用您的 querty 键盘上的键,或者选择一个连接到您的计算机的 midi 键盘来使用和播放声音。

我要做的下一步是创建一个条,当播放音阶中的音符时点亮绿色,当播放音阶外的音符时点亮红色,并且可能记录连续正确播放了多少个音符或类似的东西。我遇到的问题是,似乎没有办法直接从tone.js 获取用户正在播放的音符。我可以将键盘上的按键转换为音符,仅此而已。我无法捕捉到有人点击键盘的任何事件。我也无法从tone.js 获取选定的midi 输入设备,以便能够解释与tone.js 合成器一起演奏的钢琴键。

我尝试使用 jquery 附加事件侦听器,因为虚拟钢琴键只是按钮,但它们在影子 DOM 中是不可访问的。

有没有人使用过tone.js 和tonejs/ui 并且知道这是否可能,或者我是否必须以某种方式在code.js 之外编写代码?任何解决方法的想法?

编辑:我已经完成了我的 v1.0.0。我能够在 Tone.js 旁边收听 midi 设备,并将它们转换为正在播放的音符。这是一个不错的解决方案,但正如我所提到的,最好直接从 Tone.js 合成器中播放音符以简化代码,允许训练栏处理用鼠标单击的音符,等等正在播放的音符可以在教练栏上显示其八度音阶数。

git 回购:https ://github.com/erikstagg/music-theory

0 投票
1 回答
1766 浏览

python - 烧瓶html按钮调用python函数

我正在使用 Flask 制作网络服务。我想在前端的烧瓶的静态文件夹中播放midi文件。以下是 app.py 代码的一部分。我要运行的函数是python pygame库的一个函数,这个函数播放midi文件。我在background_process_test()中实现了这个函数。我参考这篇文章编写了这段代码。 Flask - 在按钮 OnClick 事件上调用 python 函数

下面是 json.html 代码。

综上所述,我希望在前端点击按钮时运行background_process_test()函数,从而播放midi文件。当我在本地服务器上运行此代码时,midi 文件没有播放 127.0.0.1--[13 / Nov / 2019 21:50:56] "GET / bacground_process_test HTTP / 1.1" 404-。

事实上,我的目的是播放一个midi文件,我正在尝试这样做,因为在Python中很难将midi文件转换为wav文件。或者让我知道是否有任何其他方式可以在 Flask 的静态文件夹中播放 html 中的 midi 文件。

0 投票
1 回答
880 浏览

javascript - 如何让 web MIDI 输出控制器工作?

所以我有一个连接到我的机器的 midi 控制器,我让它在 Mac 上与 Logic Pro X 一起成功播放。

我正在尝试使用 Web Midi API 向这个 midi 控制器发送一个音符,作为一个输出设备,希望它会触发 midi 控制器,然后通过 Logic 触发声音。

我为此使用webmidi.js并尝试过:

但我没有听到音符在播放。我确实确保我的 midi 控制器被列为输出设备。

奇怪的是,当我玩Note时,它实际上点亮了控制器上的LED键。但我还是听不到声音。我还尝试了一个不同的控制器,它的按键上没有 LED,但我也听不到声音。

我还尝试访问这个网站http://webmidi-examples.glitch.me/,在最后一个示例中也尝试发送 midi 输出,但也不起作用。有什么建议么?

0 投票
1 回答
35 浏览

javascript - 为什么变量在 Javascript 中保持不变?

我有一个对象 ,toKeep其中每个对象的标签属性中都包含一个 MIDI 音符。

我希望它在一定延迟后播放,具体取决于收到的音符数量。

现在的问题是变量pinned_neighbor保持不变,即使它应该改变。

setTimeout函数没有接收到数据的问题吗?

0 投票
1 回答
717 浏览

javascript - 如何在 Electron 上请求 MIDI 设备权限?

我有一个想与 Electron 应用程序一起使用的 MIDI 设备(启动板)。我能够使用 Web MIDI API ( https://github.com/djipco/webmidi ) 使用 Microsoft Edge Chromium 读取 MIDI 设备上的事件。但是,为了开始读取 MIDI 设备,需要设置权限,并显示如下:

允许

当我运行npm start启动电子项目时,我找不到启用 MIDI 设备权限的方法。我看不到我的任何 MIDI 设备,我假设这是因为我缺少权限。

我研究了电子文档,但找不到任何东西。systemPreferences提供了一种请求权限的方法,但适用于相机和麦克风,而不是 MIDI 设备(https://electronjs.org/docs/api/system-preferences)。

非常感谢,任何帮助表示赞赏:)

0 投票
2 回答
1256 浏览

macos - 您的浏览器不支持 Web MIDI API - Mac 上的 Google Chrome - 当代码在本地运行时

伙计们,

我正在尝试开发一个简单的 Web MIDI 应用程序。

我已经查找并发现谷歌浏览器是唯一支持此功能的浏览器。所以,我安装了这个,但我仍然得到这个。

无法启用 WebMidi 错误:您的浏览器不支持 Web MIDI API。在 WebMidi.enable (webmidi.min.js:30) 在 script.js:430 (匿名) @ script.js:432 WebMidi.enable @ webmidi.min.js:30 (匿名) @ script.js:430 承诺。然后(异步)(匿名)@ script.js:154

Mac - 10.15.2 铬 - 79.0.3945.117

根据这个链接 - https://www.midi.org/17-the-mma/99-web-midi,Chrome肯定有支持。

重要提示 - 如果我直接在 codepen 上运行代码,它工作得很好。所以浏览器正在工作。但是当我尝试在本地运行时,我得到了错误。

https://codepen.io/teropa/pen/JLjXGK

我在这里想念什么?这是 chrome 问题还是 Mac 问题或某些权限问题。或者,我需要什么特定的东西才能让 MIDI 代码在本地运行吗?

我正在使用此服务器https://www.npmjs.com/package/http-server在本地运行代码。

(我查看了其他问题,但没有找到与 Mac 上的 Chrome 相关的任何内容)

0 投票
1 回答
311 浏览

javascript - 清除 MIDI 输出缓冲区

使用 Web MIDI API,我可以发送一些消息:

我还可以安排一些消息在未来适时发送:

现在,假设我已经安排了许多消息在未来几秒钟内发送,现在我想取消这些消息的发送。 根据规范,我应该能够调用clear输出:

但是,这在 Chrome 上是未定义的(至少从 v79 开始)。

未捕获的 TypeError:output.clear 不是函数

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

0 投票
1 回答
293 浏览

javascript - 未捕获的 ReferenceError:未定义 WebMidi

我正在尝试按照此处的指南在我的应用程序中实现 WebMIDI.js 库。

我已将 webmidi.min.js 文件添加到我的 index.html 页面,如下所示:

我的 script.js 文件如下所示:

但是,控制台会抛出有关未引用 WebMidi 的错误。

'script.js:47 Uncaught ReferenceError: WebMidi is not defined'

据我所知,我已经在我的 html 页面中包含了正确的 .js 文件,并且在那里引用了 WebMidi。我已经尝试将脚本标签添加到 webmidi.min.js 的在线版本,即 <script src="https://cdn.jsdelivr.net/npm/webmidi@2.0.0"></script>,但无济于事。我确定这是一个足够简单的问题,但我似乎无法弄清楚。任何帮助表示赞赏。

0 投票
2 回答
614 浏览

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

我阅读了很多关于 MIDI 解析的内容,并研究了一些代码,例如 Tone.js 和 heartbeat。但我不明白为什么每四分音符的脉冲数(PPQN)值不同,以及它对演奏音符有什么影响。当我有 960 个 PPQN 时,这意味着 1 个四分音符有 960 个刻度,1 个八分音符有 480 个刻度,等等。如果我理解正确,增量时间只是一个相对值。

我不明白的是,当我在 JavScript 中演奏音符时,PPQN 应该是什么,当我设置 PPQN 时为什么它应该有这个值?例如,我使用 WebAudio API 播放音符:

这样我可以演奏不同的音符时长。现在当我读取 MIDI 文件时,我应该只比较增量时间并将其转换为我的音序器当前播放吗?例如,当我读取具有以下值的 MIDI 文件时:

我读取了 MIDI 文件,将音符保存在一个数组中(假设增量时间是每个音符的 1/4)

并弹奏音符:

我应该只在导出 MIDI 文件时使用 PPQN 吗?如果是这样,我应该设置什么 PPQN?我希望有人可以更详细地向我解释这一点。