gpt4 book ai didi

java - 在 Java 中同时播放 .mp3 和一系列音符 (MIDI)

转载 作者:行者123 更新时间:2023-12-02 01:32:58 24 4
gpt4 key购买 nike

我目前正在开发一个应用程序,用户可以在其中加载 .mp3 文件并输入一系列注释。用户的目标是将这个音符序列与 .mp3 文件中的歌曲相匹配。

这需要能够同时播放 .mp3 文件和音符序列。经过一番研究,我发现 Java Sound APIJFuge可以完成生成音符序列(MIDI)的工作。 (用户给出的输入)。如前所述here ,JLayer可以用来在Java中播放mp3文件。 (我还可以将 .mp3 转换为 .wav 并使用另一种方式播放转换后的 .wav)。

但是,是否可以毫无问题地一起播放此 .mp3 和音符序列,或者我应该先将它们转换为一个文件?

用户应该能够在任何随机时间戳处同时播放 .mp3 和他/她的音符序列。最好没有任何延迟,这样用户可以轻松地调整音符以匹配文件的音高。当用户几乎不断地更改音符并重播以检查其是否与音调匹配时,在播放它们之前将它们合并到一个文件似乎会带来太大的开销。

提前致谢!

最佳答案

Java 支持多线程播放。您所需要做的就是从一个线程运行 .mp3,并在另一个并发运行的线程上运行 MIDI 生成的音符。

曾经有一些 Linux 系统一次只能处理一个音频源的输出。我不知道这是否仍然是一个问题。

另一种更复杂的可能性是,可以让您进行现场混音并输出到单行,即使用 AudioInputStream 读取歌曲文件,将字节动态转换为 PCM(例如,转换为从 -1 到1)(或预加载音频并将其存储为 PCM),然后将其添加到来自 DIY 合成器的 PCM 数据,然后将其转换回字节并通过 SourceDataLine 输出。

这很麻烦,您可能不想走这条路,但如果您这样做,以下是一些信息,可帮助分解一种可能实现的各个步骤。

加载.wav数据并将其转换为内部PCM形式可以在开源AudioCue中看到(第 359 行 loadURL 方法)。和here是我制作的通过击键运行的实时 Java 合成器的示例(免费下载)。其中一种声音是一个简单的风琴,只需添加四个谐波频率的正弦波即可输出 PCM 音频数据。如果您想进入其他形式的合成但更多地参与,则可以发出其他声音。

(不知道如何转换来自 MIDI 控制合成器的数据,除非可以识别 TargetDataLine,并将其数据转换为 PCM,类似于从 AudioCue 源示例中读取 AudioInputStream 时使用的转换。)

给定两个 PCM 源,可以使用加法将两者实时混合,转换为字节并通过单个 SourceDataLine 输出(请参见第 1387 行 convertBufferToAudioBytes 方法)。如果您在贡献者不玩时输入零,则 SourceDataLine 可以无限期地保持运行。 SDL 的绝大多数时间都处于阻塞状态,因为音频数据处理的速度比系统消耗的速度快得多,因此占用的 CPU 很少。

关于java - 在 Java 中同时播放 .mp3 和一系列音符 (MIDI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57544875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com