2012-09-26 4 views
1

나는 midi 파일을 생성하고 안드로이드에서 재생하려고합니다. android-midi-lib를 찾았지만이 라이브러리에 대한 문서는 거의 없습니다. 이 lib 예제를 실행하려고했습니다. 그것은 작동합니다. 하지만 내 노트에서 트랙이 재생되기 전에 약 6 초 가량 지연됩니다. 나는 노트와 미디 포맷에 대해 아무것도 모른다. 모든 것이 새로운 것입니다. 이러한 지연은 (어쩌면 너무 NoteOff) NoteOn 생성자에서 처음 PARAM에 따라 달라메모 전에 안드로이드 - 미디 lib 지연

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(); 
} 

}

내가 알아 낸 :

여기 내 코드입니다. 나는 480 숫자가 무엇인지 이해하지 못한다. 나는이 숫자를 바꾸려고 노력했다. 트랙보다 짧은 딜레이보다 적은 수이지만, 전체 트랙은 더 짧다.

480 값을 갖는 노트 사이의 시간이 좋아 보이지만 그 전에는 지연이 필요하지 않습니다.

도와주세요!

+1

onCreate 메서드에서 파일을 모두 생성, 저장,로드 및 재생하려고 할 때 지연이 발생한다는 것이 나에게 들립니다. 그것들은 즉각적인 조작이 아닙니다. MediaPlayer.start() 호출을 버튼에 의해 트리거 된 함수로 이동해보십시오. 플레이어가 재생을 초기화하는 동안 약간의 지연이 예상되지만 제공된 코드는 첫 번째 음표를 틱 0으로 지정하므로 경험 한 지연은 MIDI 파일 또는 라이브러리로 인해 발생하지 않습니다. 또한 480 값이 무엇인지 이해하지 못하는 경우 MIDI에 대해 더 자세히 알아야합니다. – LeffelMania

답변

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; 
} 

지연 재생되어야 몇시 노트에 의미합니다. 따라서 모든 음을 하나씩 연주하려면 이전의 모든 음표 길이의 합계로 지연을 설정해야합니다.