将连续控制器数据写入midi文件



我正试图编写一个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作为备用旋钮或滑块。

最新更新