Java Doc for FunctionКак использовать функцию Java MidiSystem.write()?
Я не могу понять, как использовать эту функцию. У меня есть Java.Midi.Sequence и файл, который я хочу написать, но я не могу понять, что такое «int fileType». Нет никакого статического int для ссылки в MidiSystem, Sequence или MidiFileWriter. Также не помогает 0.
Я получаю ошибку при использовании нуля так:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: seph.reed.effigy.MidiLoader$1 cannot be cast to javax.sound.midi.ShortMessage
at com.sun.media.sound.StandardMidiFileWriter.writeTrack(StandardMidiFileWriter.java:386)
at com.sun.media.sound.StandardMidiFileWriter.getFileStream(StandardMidiFileWriter.java:204)
at com.sun.media.sound.StandardMidiFileWriter.write(StandardMidiFileWriter.java:137)
at com.sun.media.sound.StandardMidiFileWriter.write(StandardMidiFileWriter.java:153)
at javax.sound.midi.MidiSystem.write(MidiSystem.java:1060)
at seph.reed.effigy.MidiLoader.saveClipAs(MidiLoader.java:197)
at seph.reed.effigy.EffigyMenuBar$2.onClick(EffigyMenuBar.java:47)
Персональная функция ссылка является:
public void saveClipAs(File selectedFile) {
try {
Sequence out = new Sequence(Sequence.PPQ, 256);
Track toMe = out.createTrack();
Sequencer fromMe = ANCESTOR(Effigy.class).m_gui.getCurrentClip().m_sequencer;
//traverse linked list adding notes to track
for(MidiEventEntity ptr = fromMe.m_head; ptr != null; ptr = ptr.m_next) {
byte[] midiData = new byte[3];
midiData[0] = MidiToolBox.NOTE_ON;
midiData[1] = (byte)ptr.getNote();
midiData[2] = (byte)127;
long tick = (long) (256 * ptr.getBeat()); //256 ticks per 1/4 note
MidiEvent addMe = new MidiEvent(new MidiMessage(midiData) {
@Override
public Object clone() {
return null; }
}, tick);
toMe.add(addMe);
}
//THIS LINE BELOW
MidiSystem.write(out, 0, selectedFile);
}
catch (InvalidMidiDataException e) {
e.printStackTrace(); }
catch (IOException e) {
e.printStackTrace();
}
}
Спасибо за любую помощь. Я совершенно не понимаю, что действительно задает int fileType.
EDIT: удален немой вторичный вопрос.
EDIT: функциональный код:
for(MidiEventEntity ptr = fromMe.m_head; ptr != null; ptr = ptr.m_next) {
byte status = MidiToolBox.NOTE_ON;
byte note = (byte)ptr.getNote();
byte velocity = (byte)127;
long tick = (long) (256 * ptr.getBeat()); //256 ticks per 1/4 note
ShortMessage msg = new ShortMessage(status, note, velocity);
MidiEvent addMe = new MidiEvent(msg, tick);
toMe.add(addMe);
}
вы не знаете, в тот момент я отправляю, я понимаю, что «$ 1» должны означать, что мой новый MidiMessage. Тем не менее, мне бы хотелось, чтобы какая-то помощь выяснила, что хочет аргумент fileType. –
Я обнаружил, что замена моего встроенного «нового MidiMessage (...) {...}» на «ShortMessage (...)» все функционально. Тем не менее, если кто-нибудь знает, где я могу найти лучшую замену fileType, чем магическое число 0, я буду считать его полным ответом на этот вопрос. –