- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望使用 Javasound 编写一个简单的 MIDI 驱动的音频音序器。
我有多个样本(每个 MIDI 音高一个),它们作为(全局可访问)Map<MidiPitch,AudioInputStream>
加载到内存中。 。
javax.sound.midi.Receiver
的自定义子类响应传入的 MIDI 事件如下:
如果事件是音符打开,则获取并播放剪辑,如下所示:
Clip clip = AudioSystem.getClip();
clip.open(lookupAIS(pitch));
clip.start();
然后将该剪辑添加到全局可访问的 Map<MidiPitch,List<Clip>>
,代表开始的剪辑,即 start()
的剪辑已按上述方式调用,但尚未收到注释事件。
如果事件是音符结束,则从上面的 map 中获取相应的开始剪辑列表。列表头部的剪辑被删除,并且 stop()
和close()
被召唤。
以上Receiver
连接到MidiSystem.getSequencer()
按照通常的方式,然后调用以下内容:
sequencer.setSequence(MidiSystem.getSequence(new File(myMidFile)))
sequencer.open()
sequencer.start()
Thread.sleep(aLongTime())
sequencer.stop()
sequencer.close()
当驱动 MIDI 序列速度较慢时,上述方法有效,但在较高速度下,音符会简单地挂起(即使对于包含很少数量音符的序列)。
我的理解是clip.start()
由 Javasound API 在后台的单独线程中运行。
任何人都可以解释为什么会发生这种情况吗?可能是同步问题吗?
编辑:通过“挂起”,我的意思是一些注释被卡住,尽管日志输出报告相应的“停止”方法已被调用。
EDIT2:看起来好像当第二次播放给定音符时第一次发生挂起。即使 MIDI 序列是单音的(即前一个音符已停止),也会发生这种情况。
最佳答案
每次播放加载剪辑的方法将成为可变延迟的重要来源。每次调用此方法时,都会重新读取该文件,并且在整个文件加载完毕之前不会开始播放。
我建议预加载所有剪辑并将它们保存在内存中。当音符打开时,将剪辑光标设置为零,然后播放:
clip[mapIndex].setFramePosition(0);
clip[mapIndex].start();
这些剪辑应该已经打开。我将它们放入一个数组中,并使用“mapIndex”作为选择可能与您已经设置的映射配合使用的正确剪辑的合理方式。
在整个序列完成之前,您可能不需要“停止”或“关闭”剪辑,除非剪辑相当长并且设计为在进行时停止,或者它们作为循环播放.
这应该会大大改善事情。我不能说它是否能解决一切问题。 cpu 可能正在执行一些线程多路复用,并且有时在当前代码中,在剪辑完成在另一个线程上的加载之前在一个线程上调用 Clip.close 是合理的。
关于java - 在 Javasound 中播放多个样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343297/
我正在尝试使用 JavaSound API 创建音频过滤器来读取和写入音频文件。目前我的代码结构如下: ByteArrayOutputStream b_out = new ByteAr
我想知道是否有任何java api可以识别音频文件的格式类型。 我知道一种方法是通过扩展名,但即使扩展名错误,我也应该能够找到音频文件的类型 最佳答案 您可以尝试看看Java Sound API ,其
运行此代码时,我得到4个对象的输出,所有这些对象都是输入。我想要获得的只是计算机的默认输出(2014年底的Macbook,带有OSX 10.9.5)。 public static void aPlay
JavaSound API 程序员指南中的图表似乎暗示(第 19-20 页)混合器原则上可以同时拥有数据线和端口。不过,我想知道是否有人真正见过这个配置?我看到的是,在相关的情况下,混合器成对出现,一
我有一个立体声波形文件,我需要仅读取和播放选定的 channel 。实现这一目标的最佳方法是什么? 最佳答案 当您通过 AudioInputStream 引入 wav 文件时,请使用 AudioFil
由于某些原因,我需要使用 SourceDataLine 而不是 Clip 在程序中播放音频。将framePosition(我想跳过)分配给Clip很容易,但是SourceDataLine没有这个方便的
我希望使用 Javasound 编写一个简单的 MIDI 驱动的音频音序器。 我有多个样本(每个 MIDI 音高一个),它们作为(全局可访问)Map 加载到内存中。 。 javax.sound.mid
我可以使用我的 M-AUDIO Fast Track Ultra 作为我正在编写的 Java MIDI 插件中的音频接口(interface)吗?那个虚拟驱动程序 ASIO4ALL 也可能是一个不错的
我有两个 wav 文件,我想模拟在 3D 空间中的不同点生成的声音,就像从矩形 4 channel 麦克风阵列中听到的那样。也就是说,理想的输出是单个 4 channel wav 文件或已知同步的 4
JavaSound API中的getSequencer方法如何返回接口Sequencer的实例? Sequencer sequencer=MidiSystem.getSequencer(); 我读过我
我的应用程序涉及通过 Web UI 上传波形文件,将格式转换为 8k、8 位 mulaw 并将其存储在服务器上。我的代码在尝试执行以下操作时在服务器上失败: final AudioInputStrea
我正在尝试编写一个 Java EE 应用程序来记录来自服务器输入的声音。我的代码在调试时工作正常,并且在服务器上作为我自己(都是 ubuntu)运行但是当它从网络服务器运行时我得到一个异常: java
这是我第一次尝试编写除了书中练习之外的程序。当我完成后,它将成为一个钢琴卷帘编辑器 MIDI 音序器。用户输入一组歌词。该程序将单词转换为钢琴卷帘编辑器上的音符,然后用户可以四处移动并构建旋律。我有用
阅读 javasound今天早些时候标记,我尝试实现我们可以在那里看到的简单代码(有一些小的修改,例如使用 File 而不是 URL): File file = new File(System.get
我在互联网上搜索了一下,但一无所获。有谁知道是否存在? 最佳答案 显然答案是否定的。无法在那里找到任何东西。 关于java - javasound 有 WMA spi 吗?,我们在Stack Over
我正在尝试播放一些 .m4a 文件,我知道 JAAD仅支持解码 AAC,但有些歌曲我可以从中获取 sourceDataLine,然后当我尝试播放它们时,我得到如下行为: 我们读取:1024 字节。 我
您好,我需要从 .wave 文件中读取 SampleRate、SignalFrequency 和 Amplitude。我如何使用 JavaSound 做到这一点? 最佳答案 您可以通过获取 Audio
我是一名优秀的程序员,十分优秀!