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

时间:2012-02-23 23:33:35

标签: java file-io midi

我正在尝试编写一个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);
    }

2 个答案:

答案 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作为你想要的备用旋钮或滑块。