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の値のノート間の時間は私にとっては問題ないようですが、それらの前に遅延は必要ありません。
お願い助けて!