Reimplementar o “ToneMatrix” brinquedo áudio [fechado]
-
09-09-2019 - |
Pergunta
Há um muito legal áudio "brinquedo" chamado ToneMatrix . Gostaria de reimplementar-lo como um applet Java. Eu tentei usar JFugue 's player.play
com notas individuais para som e Thread.sleep
para o sincronismo, mas os resultados são horrível.
JFugue pára de responder após o dia 17 (sim, realmente, eu contei) invocação de player.play
e Thread.sleep
é demasiado irregular para entregar um bom ritmo.
O que você recomendaria em vez disso? Basicamente, eu estou procurando uma maneira simples de gerar notas individuais de som em tempo real. Assim, uma fração de segundo antes que o som é devido ao jogo, eu preciso ser capaz de olhar para os dados e dizer a biblioteca de áudio que notas para jogar. (Múltiplas notas em harmonia são prováveis.)
Solução
O meu palpite é que você está esquecendo de virar as notas off em JFugue, ou há um bug que está esquecendo de parar de jogar as notas uma vez iniciado.
Usando MIDI é uma maneira muito fácil de fazer o que você está falando. Aqui é um pouco de uma mistura de métodos úteis no pacote midi que você começar:
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
MidiChannel midiChannel = synth.getChannels()[0];
midiChannel.allNotesOff();
currentInstrument = synth.getAvailableInstruments()[index];
System.out.println("Switching instrument to #" + index + ": " + currentInstrument.getName());
synth.loadInstrument(currentInstrument);
midiChannel.programChange(currentInstrument.getPatch().getBank(), currentInstrument.getPatch().getProgram());
midiChannel.noteOn(noteNumber, velocity);
midiChannel.noteOff(noteNumber);