Я пытаюсь установить возможность кода javax.sound.midi
для создания простого звука, так что я могу настроить его, чтобы начать работу над более сложным MIDI-кодом. Но приведенный ниже код не создает звук. Пример кода составляет всего около 50 строк и представляет собой веб-пример, который должен просто работать из коробки. Но вместо этого он производит следующее сообщение об ошибке в консоли при запуске программы:Простой звук, не играющий в java midi test code
Synthesizer: [email protected]
Aug 04, 2015 5:03:20 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
MidiChannel: [email protected]
Кроме того, ЗВУК, вырабатываемой. ОС - Windows 8.1, если это имеет значение.
В чем причина этой ошибки? Как я могу изменить небольшой раздел кода ниже, чтобы заставить его играть простой звук?
Вот полный ~ 50 строк кода, который бросает выше выход:
package main;
import javax.sound.midi.*;
public class MidiMain {
private static boolean DEBUG = true;
public static void main(String[] args){
/** The MIDI channel to use for playing the note. */
int nChannelNumber = 1;
int nNoteNumber = 20; // MIDI key number
int nVelocity = 20;
/* Time between note on and note off event in milliseconds. Note that on most systems, the
* best resolution you can expect are 10 ms.*/
int nDuration = 20;
nNoteNumber = Math.min(127, Math.max(0, nNoteNumber));
nVelocity = Math.min(127, Math.max(0, nVelocity));
nDuration = Math.max(0, nDuration);
/* We need a synthesizer to play the note on. Here, we simply request the default synthesizer. */
Synthesizer synth = null;
try { synth = MidiSystem.getSynthesizer();}
catch (MidiUnavailableException e){
e.printStackTrace();
System.exit(1);
}
if (DEBUG) out("Synthesizer: " + synth);
/* Of course, we have to open the synthesizer to produce any sound for us. */
try {synth.open();}
catch (MidiUnavailableException e){
e.printStackTrace();
System.exit(1);
}
/* Turn the note on on MIDI channel 1. (Index zero means MIDI channel 1) */
MidiChannel[] channels = synth.getChannels();
MidiChannel channel = channels[nChannelNumber];
if (DEBUG) out("MidiChannel: " + channel);
channel.noteOn(nNoteNumber, nVelocity);
/* Wait for the specified amount of time (the duration of the note). */
try {Thread.sleep(nDuration);}
catch (InterruptedException e){e.printStackTrace();}
/* Turn the note off. */
channel.noteOff(nNoteNumber);
/* Close the synthesizer. */
synth.close();
}
private static void out(String strMessage){ System.out.println(strMessage);}
}
Я не буду на своем компьютере несколько часов. Этот API для меня совершенно незначителен, хотя я читал учебники. Можете ли вы показать рабочий код для wjat, который вы предлагаете, чтобы ваши предложения были ясными, когда я снова нахожусь на своем ПК? – CodeMed
* «Вы пробовали больше времени?» * Он работает здесь с большей продолжительностью (2000), но едва заметен при задержке 20 мс. Сказав это, вышеприведенная ошибка выглядит так, что у API возникают проблемы с настройкой MIDI-системы. OP - вы успешно использовали другие приложения. на той машине, которая будет воспроизводить MIDI? –
@ Параметр AndNotThompson 'nDuration = 1000' получает примечание к воспроизведению, но не разрешает сообщение об ошибке. Нет, я никогда раньше не использовал миди с java. Вот почему я приводил такой простой пример кода. Что еще я могу настроить, чтобы разрешить все еще постоянное сообщение об ошибке? – CodeMed