我正试图编写一个java程序,从图像中读取数据并将其转换为midi数据。我已经创建了多首带有适当midi音符开和音符关消息的曲目。然而,我也想将连续的控制器数据写入每个轨道(一个未使用的滑块或旋钮,而不是一个预定的通道,如modwheel或pitchbend)。我假设我需要使用CONTROL_CHANGE短消息,但我可能错了。(http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/ShortMessage.html#CONTROL_CHANGE)。我真的没有java编程知识来解决这个问题。以下是我迄今为止创建note开/关midi数据的内容。我认为连续控制器数据将具有类似的设计。如有任何帮助,我们将不胜感激。
private static MidiEvent createNoteOnEvent(int nKey, long lTick)
{
return createNoteEvent(ShortMessage.NOTE_ON,
nKey,
VELOCITY,
lTick);
}
private static MidiEvent createNoteOffEvent(int nKey, long lTick)
{
return createNoteEvent(ShortMessage.NOTE_OFF,
nKey,
0,
lTick);
}
private static MidiEvent createNoteEvent(int nCommand,
int nKey,
int nVelocity,
long lTick)
{
ShortMessage message = new ShortMessage();
try {
message.setMessage(nCommand,
0,
nKey,
nVelocity);
}
catch (InvalidMidiDataException e)
{
e.printStackTrace();
System.exit(1);
}
MidiEvent event = new MidiEvent(message,
lTick);
return event;
}
private static void out(String strMessage)
{
System.out.println(strMessage);
}
想好了,以防其他人遇到同样的问题。十六进制0xB0只是标准的连续控制器数据通道。17可以直接键入,不需要十六进制。其他频道可以通过谷歌搜索midi格式或类似的东西找到:
private static MidiEvent createCCData(int cc, int val, long lTick) {
ShortMessage mm = new ShortMessage();
mm = new ShortMessage();
try {
mm.setMessage(0xB0,cc,val);
}
catch (InvalidMidiDataException e) {
e.printStackTrace();
System.exit(1);
}
MidiEvent me = new MidiEvent(mm,lTick);
return me;
}
预定义的MIDI CC,如音量、音高弯曲等,只是推荐的分配,但从技术上讲,您可以使用任何CC作为备用旋钮或滑块。