1

MIDIファイルを生成してAndroidで再生しようとしています。android-midi-libを見つけましたが、このライブラリに関するドキュメントはほとんどありません。このライブラリからexampleを実行しようとしました。できます。しかし、私のノートからのトラックが再生を開始するまでに約6秒の遅延があります。ノートとMIDIフォーマットについては何も知りません。すべてが私にとって新しいものです。

これが私のコードです:

public class MyActivity extends Activity {

private MediaPlayer player = new MediaPlayer();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    MidiTrack tempoTrack = new MidiTrack();
    MidiTrack noteTrack = new MidiTrack();

    // 2. Add events to the tracks
    // 2a. Track 0 is typically the tempo map

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

    tempoTrack.insertEvent(t);

    // 2b. Track 1 will have some notes in it
    for(int i = 0; i < 128; i++) {

        int channel = 0, pitch = i, velocity = 100;
        NoteOn on = new NoteOn(i*480, channel, pitch, velocity);
        NoteOff off = new NoteOff(i*480 + 120, channel, pitch, 0);

        noteTrack.insertEvent(on);
        noteTrack.insertEvent(off);
    }

    // It's best not to manually insert EndOfTrack events; MidiTrack will
    // call closeTrack() on itself before writing itself to a file

    // 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

    File output = new File("/sdcard/example.mid");
    try {
        midi.writeToFile(output);
    } catch(IOException e) {
        Log.e(getClass().toString(), e.getMessage(), e);
    }
    try {
        player.setDataSource(output.getAbsolutePath());
        player.prepare();
    } catch (Exception e) {
        Log.e(getClass().toString(), e.getMessage(), e);
    }
    player.start();
}

@Override
protected void onDestroy() {
    player.stop();
    player.release();
    super.onDestroy();
}

}

この遅延は、NoteOnコンストラクターの最初のパラメーター(おそらくNoteOffも)に依存することがわかりました。480番が何なのかわかりません。私はこの数を変更しようとしました、そしてこの数よりもトラック前のより短い遅延よりも少ないですが、トラック全体はより短くなっています。

480の値のノート間の時間は私にとっては問題ないようですが、それらの前に遅延は必要ありません。

お願い助けて!

4

1 に答える 1

1

わかりました、私は何が問題なのか理解しました。

このURLによるとhttp://www.phys.unsw.edu.au/jw/notes.htmlたとえばピアノのMIDI値は21から始まります。したがって、サイクルを0から始めると、最初の20の値は何も再生されません。 。

さて、遅延について。

サイクルは次のようになります。

delay = 0;
duration = 480; // ms
for (int i = 21; i < 108; ++i) {
       noteTrack.insertNote(chanel, i, velocity, delay, duration);
       delay += duration;
}

ディレイとは、ノートを演奏するタイミングを意味します。したがって、すべてのノートを1つずつ再生する場合は、以前のすべてのノートの長さの合計として遅延を設定する必要があります。

于 2012-10-03T03:16:41.237 に答える