Tag: midi

用Java读取MIDI文件

我正在尝试将.MID文件读入Java程序,并希望将每个音符/和弦分开,以便在某种UI上显示它们。 我在Java中使用Sequencer API并没有太多运气,并且尝试直接使用MidiFileReader也不适用于我。 我会附上我在这里使用的代码,如果有人想看到的话: package miditest; import java.io.File; import java.io.IOException; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Sequence; import javax.sound.midi.Sequencer; public class Main { public static void main(String[] args) throws InvalidMidiDataException, IOException, MidiUnavailableException{ Sequence sequence = MidiSystem.getSequence(new File(“test.mid”)); // Create a sequencer for the sequence Sequencer sequencer = MidiSystem.getSequencer(); sequencer.open(); sequencer.setSequence(sequence); // Start playing sequencer.start(); […]

如何控制MIDI通道的音量

我有这个代码: Synthesizer synthesizer = MidiSystem.getSynthesizer(); synthesizer.open(); Instrument[] instrument = synthesizer.getDefaultSoundbank().getInstruments(); synthesizer.loadInstrument(instrument[29]); MidiChannel[] channels = synthesizer.getChannels(); MidiChannel channel = channels[1]; channel.programChange(29); channel.noteOn(noteNumber, 127); Teszthang.sleep(2000); channel.noteOff(noteNumber); 所以这是一个例子,以最大音量(127)播放声音2秒。 但是我想控制通道的音量,比如在2秒后,音量会在另外2秒内淡出。 我怎么能这样做? 我知道这些方法: channel.controlChange(controller, value); channel.setPolyPressure(noteNumber, pressure); 但这些不会改变任何音量! 我不知道如何使用这些方法。 如何在noteOn()播放后更改频道的音量?

为什么java midi synth在mac上停止播放笔记

我正在尝试制作一个简单的应用程序,从midi端口(硬件)读取并将事件转发到软件合成器。 它主要起作用,只是软合成器不时停止播放。 我可以在日志中看到midi消息被转发,我可以在调试中跟踪并看到事件到达合成器接收器中的本机代码但由于某种原因,合成器不播放音符。 如果你等待然后声音再次播放,然后停止,然后再次播放… 这是一个演示应用程序,显示问题。 如果您在控制台中按住回车按钮,您将反复听到一个音符。 一段时间后(可能不到一分钟),声音将停止(如果您按住按钮则发生事件),然后它将返回。 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.sound.midi.MidiSystem; import javax.sound.midi.Synthesizer; public class TestMidi2 { public static void main( String[] args ) throws Exception { Synthesizer synth = MidiSystem.getSynthesizer(); synth.open(); BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) ); boolean on = true; while ( in.readLine() != null ) { […]

Java MIDI – 从钢琴获取数据?

我inheritance了一个Java项目, 该项目使用旧的C ++ dll从连接到计算机的钢琴接收MIDI数据 。 现在Java已经内置了对MIDI设备的支持,我想摆脱传统的C ++ DLL并且只使用纯Java。 Java是否支持从连接到计算机的钢琴接收数据? 我搜索谷歌的例子无济于事。

Java从MIDI键盘获取输入

我在java中设计了自己的合成器,现在我想用midi键盘连接它。 我的下面的课程搜索所有具有发射器的midi设备。 它成功找到了我的midi键盘。 我为每个设备添加了自己的接收器到每个发射器,以便它可以拾取所有可能的东西。 通过阅读所有帮助文档和java文档,我知道发送器将MidiEvents发送到接收器,接收器然后使用send方法处理它们。 所以我编写了自己的实现Receiver的内部类,并且只使用了println语句来检查send方法中是否有任何检测到的内容。 但是根本没有任何东西被拿走。 做这么简单的事似乎没什么帮助,我看了每个帮助文件,javadoc和论坛。 我敢肯定它一定是非常明显我不知何故错过的东西。 我的合成器不应该与接口合成器混淆,它不是midi乐器。 它使用合成算法并具有回放方法。 基本上我只需要让midi键盘发送一个关于事件的注释,它将调用回放方法。 import javax.sound.midi.*; import java.util.ArrayList; import java.util.List; import java.io.*; public class MidiHandler { //ArrayList of MidiDevices private ArrayList devices = new ArrayList(); public MidiHandler() { MidiDevice device; MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); for (int i = 0; i 0) { //if it does, add it […]

如何在Java中的新线程中播放.MIDI文件?

我正在用Java改造游戏的一部分,我需要知道如何播放MIDI声音文件。 优选地,它不涉及导入任何外部库。 它也必须可以在新线程中运行,这样我就可以将各个声音叠加在背景歌曲上。 谢谢你的想法和时间。