启用android-midi-lib频道

时间:2013-10-09 06:11:21

标签: android midi midi-instrument

我已经下载了https://code.google.com/p/android-midi-lib/,试图长时间播放固定的弦乐声音。我想了解如何使用默认三角钢琴以外的MIDI通道。渠道应该是答案。改变它们似乎没有效果。 Android中的所有16个声道听起来像三角钢琴?或者我错过了什么?!?

我已经从引用的项目中调整了示例文件写例程。我试过5个MIDI通道。它们听起来像是通道0.我在Droid 2和S3上都有一致的结果。

    MidiTrack tempoTrack = new MidiTrack();
    MidiTrack noteTrack = new MidiTrack();

    // 2. Add events to the tracks
    // 2a. Track 0 is typically the tempo map
    TimeSignature ts = new TimeSignature();
    ts.setTimeSignature(4, 4, TimeSignature.DEFAULT_METER, TimeSignature.DEFAULT_DIVISION);

    Tempo t = new Tempo();
    t.setBpm(bpm);

    tempoTrack.insertEvent(ts);
    tempoTrack.insertEvent(t);

    for(int i = 21; i < 108; i += 5)
    {
        int channel = 8, pitch = 1 + i, velocity = 100;
        noteTrack.insertNote(channel, pitch + 2, velocity, noteTrack.getLengthInTicks(), 120);
    }

    // 3. Create a MidiFile with the tracks we created
    ArrayList<MidiTrack> tracks = new ArrayList<MidiTrack>();
    tracks.add(tempoTrack);
    tracks.add(noteTrack);

    MidiFile midi = new MidiFile(MidiFile.DEFAULT_RESOLUTION, tracks);
    // 4. Write the MIDI data to a file
    //omitted for clarity

    try {
        FileInputStream is = new FileInputStream(output);
        mediaPlayer.reset();
        mediaPlayer.setDataSource(is.getFD()); //there are issues if you pass in the file name
        mediaPlayer.prepare();
    } catch (Exception e) { 
        System.err.println(e);
    }

我没有发现我的MIDI文件格式。但是,它似乎被认为正在将通道写入稍后由MediaPlayer读取的文件。我已经验证了通道信息在写入文件时是否正确。我看到两个嫌疑人:MediaPlayer和系统MIDI引擎。我不确定在哪里集中......

这是应该将频道信息(ChannelEvent)写入MIDI文件的代码:

@Override
public void writeToFile(OutputStream out, boolean writeType) throws IOException
{
    super.writeToFile(out, writeType);

    if(writeType)
    {
        int typeChannel = (mType << 4) + mChannel;
        out.write(typeChannel);
    }

    out.write(mValue1);
    if(mType != PROGRAM_CHANGE && mType != CHANNEL_AFTERTOUCH)
    {
        out.write(mValue2);
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在MIDI中,频道与乐器不同。

每个通道都可以配置自己的仪器。 为此,请向该频道发送ProgramChange消息。