- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 Java 项目中使用 JFugue 5.0.9 来创建 *.midi 文件。在我的项目中实现 JFugue 的 midi 功能时,该项目使用 24 tune makam piano 的频率。 ,我意识到它有一些曲调问题。
例如这段代码:
ChordProgression cp = new ChordProgression("I-III-IV-iv").setKey("E");
System.out.println(cp);
Player player = new Player();
player.play(cp);
应该打印
E4MAJ G#4MAJ A4MAJ A4MIN
在控制台上,正如所说的那样 here .
但是打印
E4MAJ E4MAJ E4MAJ A4MIN
在我的项目中。是的,由于某种原因,前三个和弦是相同的。当然,它们听起来也一样。
此外,当使用“m390”等微音时,它听起来并不完全在该频率。
在另一个文件的 main 方法中我写了这个:
Player player = new Player();
player.play("A4 m440 m400 m390 m380 m370 m360");
我知道 A4 和 m440 是相同的,但正如所说的 here ,A5和m440听起来应该是一样的。但在我的项目中,A4 和 m440 听起来相同,但不完全是 440Hz。当我意识到出了问题时,我决定使用调音应用程序,以下是它分别计算的频率:
221.5 221.5 197.5 186.6 186.6 186.6 176.2
如您所见,它播放的内容非常接近 A3,而不是清晰的 A4。但这并不是全部。 m390、m380 和 m370 听起来也完全一样。
这里到底出了什么问题?任何帮助将不胜感激。
一点说明:我很确定它与我的项目无关。我尝试在一个全新的项目中运行上面的代码,出现了同样的问题。而且我的系统没有问题,因为我的主要项目和任何其他软件(例如 SunVox)实际上听起来都非常好。
最佳答案
好的,我查看了 JFugue 5.0.9 的源代码,这是我在 ChordProgression.java 中得到的内容:
/**
* Only converts Roman numerals I through VII, because that's all we need in music theory...
* VIII would be the octave and equal I!
*/
private int romanNumeralToIndex(String romanNumeral) {
String s = romanNumeral.toLowerCase();
if (s.startsWith("vii")) { return 6; }
else if (s.startsWith("vi")) { return 5; }
else if (s.startsWith("v")) { return 4; }
else if (s.startsWith("iv")) { return 3; }
else if (s.startsWith("iii")) { return 2; }
else if (s.startsWith("ii")) { return 1; }
else if (s.startsWith("i")) { return 0; }
else { return 0; }
}
有点懒...:D 问题之一就在这里。如果您使用 toLowerCase() 方法而不指定语言环境,则会在运行时导致一些问题。在我现在使用的土耳其语字母表中,小写的 I 是“ı”,而不是“i”。因此,程序将我的和弦从“I-II-III”转换为“i-i-i”,因为如您所见,土耳其字母表 (ı) 的小写 I 没有 if 语句,这导致它返回 0,如本例所示“我”。
要解决此问题,我们必须删除小写转换并为大写 I 编写所有 if 语句,或者将默认区域设置设置为“en”以确保它将(大写)I 转换为(小写)i 。因此,这应该在源代码中使用:
Locale.setDefault(new Locale("en"));
幸运的是,JFugue 是在 Apache 2.0 下发布的开源软件。
这仍然并不能解释为什么曲调听起来不对,但现在至少我们知道这些是完全不同的问题。或者也许看起来是这样……我不知道。如果我找到其余问题的解释或解决方案,我将编辑此答案。
最后我偶然发现了微音的问题。我决定再看一遍源代码中的微音计算函数。
在 MicrotonePreprocessor 类(位于 org.staccato 包中)中有一个名为 convertFrequencyToStaccato() 的函数。该函数的作用是将频率转换为 MIDI 音符编号和弯音值。在第 107 行,如果计算出的音高值非常接近下一个音符,则该代码会对半音、 Octave 和音高值进行舍入:
// If we're close enough to the next note, just use the next note.
if (pitches >= 16380)
{
pitches = 0;
semitone += 1;
if (semitone == 12)
{
octave += 1;
semitone = 0;
}
}
重置音高的行应更改为:
pitches = 8192;
因为,你知道,中性音高值为 8192。0(零)是最小音高值,16384 是最大音高值。起初,我和开发者的想法是一样的:“16384之后,应该是0。没关系。这里没问题。”。然后我说“如果我将音高重置值从 0 更改为 8192 会怎样?”。有效。这是我们俩都犯过的一个美丽的认知错误。 :D 我现在真的笑得很开心。
这解决了微音问题。我现在可以听到完美的音程了!我感到幸福和满足。
我只是想分享我的进一步更改,这些更改会带来更好的微色调调音:
if (pitches >= 12288)
{
int diff = 16384-pitches;
int applieddiff = 8192-diff;
pitches = applieddiff;
semitone += 1;
if (semitone == 12)
{
octave += 1;
semitone = 0;
}
}
这也有助于在 midi 板上使用半音(黑色)键,而不是仅使用具有高音高值的音调(白色)键。因此,如果您将数据发送到另一个软件,它会单独检测所有 key 。比如之前没有G和G#,只有G和G-高音。当同时发送音符消息时,这些会导致按键互相停止。
关于java - JFugue 5 音符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54853476/
基本上,我想在音序器播放时实时获取并显示 MIDI 音符(轨道、音符和 Octave )的数据。 我希望能够将其添加到以下代码中: Sequencer sequencer = MidiSystem.g
播放我使用的是 AVAudioUnitSampler: sampler.stopNote(note, onChannel: channel) 但要停止我不想使用:
一个接一个地弹奏音符的最佳方式是什么?这是我现在拥有的最实用的代码。 let majorScale = [60, 62, 64, 65, 67, 69, 71, 72] for i i
我正在尝试构建一个程序,使用 Java Sound API (javax.sound.midi) 在合成器播放时在屏幕上显示 MIDI 音符。 MIDI 文件需要从磁盘加载,但我在将音序器连接到合成器
我已经搜索过并且已经完成了一个可以播放 MIDI 音符的 OS X 应用程序,但是当我在 iOS 中尝试时,没有任何反应。这是核心代码: AUGraph graph; AudioUnit synthU
我正在开发一个 iOS 音乐应用程序(用 C++ 编写),我的模型看起来或多或少像这样: --Song ----Track ----Track ------Pattern ------Pattern
我正在尝试构建一个系统,该系统将能够处理某人吹口哨的记录并输出注释。 谁能推荐一个开源平台,我可以将其用作音符/音高识别和波形文件分析的基础? 提前致谢 最佳答案 正如其他许多人已经说过的那样,FFT
我正在尝试使用 AUSampler 音频单元 在 sf2 文件的帮助下播放 midi 音符。我能够使用 MusicDeviceMIDIEvent 函数开始和停止音符,如下所示。 noteCommand
我需要在我的应用中同时播放多个轨道。音轨可以是普通音频文件或一组 MIDI 音符。因此,我配置了音频图并将各种音频单元(文件播放器 AU 和采样器 AU)连接到多 channel 混音器,其输出连接到
我正在开发一个适用于 iOS 的琶音器应用程序,它能够将无限的音符序列发送到外部 MIDI 兼容的硬件合成器。我使用 AudioKit 来接收和发送 MIDI 信息。 我的工作室设置包括 E-RM 多
我正在对一种似乎是带有音色库的 MIDI 的音乐格式进行逆向工程。 但是我无法使我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原始 khz 播放它们)。
澄清一下:我不想生成 MIDI 文件,也不想播放 MIDI 文件,我希望即时播放 MIDI 音符。 我尝试使用 https://github.com/mudcube/MIDI.js作为 MIDI 库,
我正在开发一个具有多个“触摸区域”的玩具,这些区域用作我的合成器的输入。 使用 oscillatorBank 我可以轻松地开始和停止音符。 在常规键盘中,每个 Midi 音符只有 1 个键,因此“重新
正在为 android 开发一个简单的键盘。我发现来自 Google 的 android-midi-lib 非常有用和强大,但在我看来它只能播放 midi 文件,但不能在键盘上按下时播放实时 midi
所以我觉得自己像个白痴,因为我必须在这里发帖来解决可能是简单的修复问题。我正在编写一个将 MIDI 发送到另一个应用程序的 iOS 应用程序。对于我的第一个概念证明,我试图在我的 iPhone 上向
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我希望使用 Swift 在 iOS 应用程序上播放单个 midi 音符。 这是我目前所拥有的,但不幸的是,这会因错误而崩溃。 func initAudio(){ let engine = AV
我儿子弹奏的弦乐器听起来非常走调。我更希望他学习一些简单的 Python 编程来演奏真正听起来像 do-re-mi 的 do-re-mi 音符。 首先,我想在 Python 上玩 do-re-mi,每
我正在使用 Arduino Yun 和 MIDI 转 USB 接口(interface),我的目标是在已安装的 Linux 操作系统上读取传入的 MIDI 音符。 目标是让 Yun 上的计算机读取音符
我是一名优秀的程序员,十分优秀!