最近有一個研究方向岳掐,在java里把python的noteSequence轉(zhuǎn)成midi凭疮,在網(wǎng)上找了很多文章饭耳,大部分都是介紹如何把midi文件轉(zhuǎn)成MidiEvent或者note的,好不容易找到了把noteSequence轉(zhuǎn)成midi的方法执解,記錄下來寞肖。
我做的測試時把midi轉(zhuǎn)成notes json,再把note json轉(zhuǎn)成midi衰腌。midi轉(zhuǎn)note就不多說了新蟆,網(wǎng)上很多相關文章,主要說一下note轉(zhuǎn)midi右蕊。
private static final String PATH1 = Environment.getExternalStorageDirectory().getPath() + File.separator + "xxx";
File fileDir;
private void test(){
// 1. Open up a MIDI file
fileDir = new File(PATH1);
if (!fileDir.exists() && !fileDir.mkdirs()) {
}
File output = new File(fileDir.getAbsolutePath(),"example.mid");
// 1. Create some MidiTracks
MidiTrack tempoTrack = new MidiTrack();
MidiTrack noteTrack = new MidiTrack();
MidiTrack leftNoteTrack = new MidiTrack();
// 2. Add events to the tracks
// 2a. Track 0 is typically the tempo map
TimeSignature ts = new TimeSignature();
ts.setTimeSignature(4, 3, TimeSignature.DEFAULT_METER, TimeSignature.DEFAULT_DIVISION);
Tempo t = new Tempo();
t.setBpm(128);
tempoTrack.insertEvent(ts);
tempoTrack.insertEvent(t);
SharedPreferences preferences = getSharedPreferences("SPF",MODE_PRIVATE);
String leftJson = preferences.getString("leftJson","");
String rightJson = preferences.getString("rightJson","");
List<MSequence> leftList = JsonUtilCustomer.getParses(leftJson,MSequence.class);
List<MSequence> rightList = JsonUtilCustomer.getParses(rightJson,MSequence.class);
for (MSequence rightSequence : rightList) {
NoteOn on = new NoteOn(rightSequence.getTick(),rightSequence.getChannel(),
rightSequence.getPitch(),rightSequence.getVelocity());
NoteOff off = new NoteOff(rightSequence.getTick() + rightSequence.getDuration(),rightSequence.getChannel(),
rightSequence.getPitch(),rightSequence.getVelocity());
noteTrack.insertEvent(on);
noteTrack.insertEvent(off);
}
for (MSequence leftSequence : leftList) {
NoteOn on = new NoteOn(leftSequence.getTick(),leftSequence.getChannel(),
leftSequence.getPitch(),leftSequence.getVelocity());
NoteOff off = new NoteOff(leftSequence.getTick() + leftSequence.getDuration(),leftSequence.getChannel(),
leftSequence.getPitch(),leftSequence.getVelocity());
leftNoteTrack.insertEvent(on);
leftNoteTrack.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);
tracks.add(leftNoteTrack);
MidiFile midi = new MidiFile(MidiFile.DEFAULT_RESOLUTION, tracks);
// 4. Write the MIDI data to a file
try
{
midi.writeToFile(output);
}
catch(IOException e)
{
System.err.println(e);
}
}