问题标签 [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.
winapi - midiOutPrepareHeader 是一个快速调用吗?
midiOutPrepareHeader、midiInPrepareHeader 只是设置一些数据字段,还是做一些更耗时的事情?
我正在尝试决定是根据需要构建和销毁 MIDIHDR,还是维护它们的池。
midi - 虚拟 MIDI 和 VST
我想做一个简单的 VST 插件来做到这一点:
- 分析音频流(音量、节拍等...)
- 在分析仪的输出上有触发器(例如,当音量 > 阈值时执行某些操作)
- 根据触发器生成 MIDI 事件
这是为了能够链接插件,即使它们不是为它设计的。例如,我可以使用音频流的包络控制压缩器的增益,只需将插件的 MIDI OUT 连接到压缩器增益按钮的 MIDI IN 即可。
问题是我不知道该怎么做。VST 中是否支持这样的直接 MIDI 连接?或者,也许我需要某种“虚拟 MIDI 设备”来进行互连?
java - 将 Midi 音符编号转换为名称和八度音阶
有谁知道 Java 世界中存在将 midi 音符编号映射到特定音符名称和八度音阶编号的任何东西。例如,参见参考表:
http://www.harmony-central.com/MIDI/Doc/table2.html
我想将 60 号 midi 音符映射到 octave 4 中相应的音符名称 (MiddleC)。我可以为此编写一个实用程序类/枚举,但这会相当乏味。有人知道吗?
我专门用它来用 Java 编写 Tenori-On/Monome 克隆,到目前为止一切都很好......
解决方案
这就是我最终使用的:
java - Java中的MidiUnavailableException?
我在用 Java 播放 MIDI 文件时遇到了一些问题。MidiUnavailableException (MIDI OUT transmitter not available)
当我尝试玩它时,我得到的是一个。我的代码是标准的:
midiseq
是一个Sequencer
;sound1
是一个InputStream
。
此代码适用于其他几台计算机,甚至适用于 Eclipse 以及在 JAR 文件中使用时,只是在我从命令提示符启动它时不起作用。我下载了一个更稳定的 Java midi 应用程序,它抛出了同样的异常。
它不可能是硬件问题,因为 Eclipse 可以毫无问题地运行它,也不可能是编码问题,因为它可以在其他计算机上正常运行。甚至这一行代码也会抛出这个异常:
提前致谢。
编辑:我的操作系统是 Windows Vista。在我问这个问题之前,我已经下载了最新的 JRE 和 JDK(我认为是 1.6.0_13)。
编辑:代码:
打印“Sequencer 类已加载。”
但是这段代码:
抛出MidiUnavailableException.
另外,这段代码:
给了我这个:
midi - XG MIDI 文件格式
我有一把 Yamaha MIDI 吉他,当我播放使用 XG MIDI 标准编码的 MIDI 文件时,它会导致吉他上的某些灯打开和关闭。我正在尝试确定导致此问题的 MIDI 事件,以便我可以在不使用 MIDI 文件的情况下以编程方式发送相同的事件(就像我可以发送 Note On (144) 或 Note Off (128) 命令一样)。
但是,虽然我能够找到 MIDI 协议的副本,但我无法找到 XG MIDI 协议。除了尝试将所有可能的命令发送到设备直到找到适当的命令之外,有没有办法确定导致灯改变状态的 MIDI 事件是什么?或者在某个地方我可以获得 XG MIDI 协议的副本?
c# - .NET 中的精确计时
我刚刚看到这个问题,其中一个答案表明System.Diagnostics.Stopwatch应该只用于诊断性能,而不是用于生产代码。
在这种情况下,在 .NET 中获得精确计时的最佳方法是什么?我目前正处于使用NAudio的 MIDI 输出功能构建一个非常简单的MIDI 音序器的早期阶段。我希望能够以尽可能少的抖动将 MIDI 消息发送到(比如说)1/10 秒。这是可行的,还是像上下文切换这样的事情会毁了我的一天?
我目前在控制台应用程序中有一些代码,它Stopwatch
在以 150bpm 生成 1/16 音符流时不断调用和计算抖动。在这种情况下,抖动非常低。但是,我将把它移到另一个线程,所以我不知道这种情况是否会继续存在。
java - 在网页中发送 MIDI 信息
如何在网页中播放单个 MIDI 音符?
我知道两种方法:
编写一个 ActiveX 控件。然后它只适用于Windows。我很久以前就写过ActiveX控件,但现在没人喜欢安装它们。
编写一个 Java 小程序。如果用户已经安装了 Java,但许多用户禁用了小程序,这没关系。我就是这样做的,您可以在 newfweiler.com 上看到结果——如果它恰好适用于您的特定设置。您至少需要 Java 5,尽管我想如果必须的话,我可以用 Java 1.2 重写它。“实时音序器”和“Java 声音合成器”对我不起作用;我认为您必须安装波表或其他东西才能使它们工作。
大多数用户都安装了 Flash,但我查看了 Flash 和 Flex 文档并没有看到任何与 javax.sound.midi 等效的内容。
有几种方法可以在网页中播放 MIDI 文件,您可以找到“Javascript Pianos”,它可以在您按下一个键时播放一个单音符的 MIDI 文件。您不能同时弹奏多个音符或按住键长音符。
我要做的是等效于 javax.sound.midi.Receiver.send(midiMsg, -1) 只使用大多数人通常在机器上安装的东西。
windows - 使用 MME 和 DirectMusic 时的 ANSI 或 OEM 代码页?
我注意到,当从 MME 读取 MIDI 端口名称时,这些名称是使用 ANSI 代码页编码的多字节字符串,我的应用程序默认使用它。从 DirectMusic 驱动程序接收这些名称时,这些名称是使用 OEM 代码页编码的宽字符串。有关代码页的快速复习,请参阅Raymond Chen 的这篇文章。
在我的德语系统上,这意味着当使用当前代码页(原来是 ANSI 代码页)时,我从 MME 获得“Audiogerät”,从 DirectMusic 获得“Audioger ö t”,后者是错误的。当我将该姓氏视为 OEM 编码时,此问题将得到解决。
那么我怎么知道使用哪个代码页来解码这些名称呢?为什么来自 DirectMusic 的名称编码不同?它来自USB驱动程序吗?COM 框架?直接音乐?在读取我的 MIDI 端口名称时,如何确定使用哪个代码页?
有关信息:
- 我使用
MultiByteToWideChar()
andWideCharToMultiByte()
函数来执行转换,并使用CP_ACP
andCP_OEMCP
作为要使用的代码页的参数。 - 我用来
midiInGetDeviceCaps()
从 MME 子系统获取 MIDI 端口信息... - ...并
MIDIINCAPS.szPname
使用CP_ACP
(ANSI)代码页进行转换。 - 我用来
IID_IDirectMusic8::EnumPort()
从 DirectMusic 获取端口信息... - ...并
DMUS_PORTCAPS.wszDescription
使用CP_OEMCP
代码页进行转换。
midi - Midi TEMPO 信息如何应用于其他曲目?
一个相当简单的问题,我有一个猜测,但我无法在任何地方找到明确的答案。
背景:我有一个多轨 MIDI 文件,第一条轨道中有 TEMPO 控件。我需要将其他轨道中的 ABSOLUTE_TICK 计数转换为“秒”(从 midi 文件开头偏移的小数秒)。
我有公式将 ABSOLUTE_TICK 与基于文件的 PulsePerQuarterNote (PPQN) 的秒数关联到速度(每四分音符的 MS)。
问题是:第一个音轨(音轨 0)中的 TEMPO 变化是否适用于所有其他音轨?
如果是这样,那么当我解析其他轨道时(例如轨道 4,它有我感兴趣的 NOTE_ON 和 NOTE_OFF 消息),我需要保持手指指向轨道 0 中并行的 TEMPO 变化。是对的吗?
谢谢,
标记