我正在尝试编写一个java程序,它从图像中读取数据并将其转换为midi数据。我已经得到了创建多个音轨的正确midi音符和注意消息。但是,我还想将连续控制器数据写入每个轨道(未使用的滑块或旋钮,而不是预定通道之一,如modwheel或pitchbend)。我假设我需要使用CONTROL_CHANGE ShortMessage做一些,但我可能是错的。 (http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/ShortMessage.html#CONTROL_CHANGE)。我真的没有java编程知识来解决这个问题。这是我到目前为止创建音符开/关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);
}
答案 0 :(得分:1)
想出来,以防其他人遇到同样的问题。十六进制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;
}
答案 1 :(得分:0)
音量,音高等pre-defined MIDI CC's只是推荐的作业,但你可以在技术上使用任何CC作为你想要的备用旋钮或滑块。