gpt4 book ai didi

android-midi-lib 音符前延迟

转载 作者:行者123 更新时间:2023-11-30 04:00:18 25 4
gpt4 key购买 nike

我正在尝试生成 midi 文件并在 Android 上播放它。我找到了 android-midi-lib,但是几乎没有关于这个库的任何文档。我试图从这个库运行示例。有用。但是在我的笔记开始播放轨道之前有大约 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 值的音符之间的时间对我来说很好,但我不需要在它们之前延迟。

请帮帮我!

最佳答案

好的,我想出了问题所在。

根据这个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;
}

延迟表示应该在什么时间播放音符。因此,如果我们想一个一个地演奏所有音符,我们需要将延迟设置为所有先前音符持续时间的总和。

关于android-midi-lib 音符前延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12599823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com