Afinador/Reproductor de instrumentos en java
Este programa fue desrrollado debido a que comenzaron a monitorear la red de mi chamba y pues nos regañan si estamos navegando en sitios "sin fines productivos" y ya que algunas veces traigo mi guitarra a la oficina... pues aqui tenia un afinador online.
Pues ahora lo tengo en mi propia maquina.
Aqui dejo el codigo que utilice para reproducir sonidos con Java.
La variable listaNotas tiene la afinacion estandar(los numeros para afinar se peuden ver aqui
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sound;
import java.util.Scanner;
import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Patch;
import javax.sound.midi.Soundbank;
import javax.sound.midi.Synthesizer;
/**
*
* @author ACASARRU
*/
public class SonidoTest {
private void pintaMenu() {
imprimeInstrumentos();
}
Synthesizer sintetizador;
MidiChannel canales;
Soundbank bancoSonidos;
Instrument listaInstrumentos[];
Patch patch;
int[] listaNotas;
static int upperRange;
SonidoTest() {
try {
listaNotas = new int[]{40, 47, 52, 55, 59, 64};
//Se obtiene el sintetizador midi
sintetizador = MidiSystem.getSynthesizer();
//Se abre el sintetizador para poder reproducir sonidos
sintetizador.open();
//Se obtienen los canales del sintetizador
canales = sintetizador.getChannels()[1];
//se carga el banco de sonidos
bancoSonidos = sintetizador.getDefaultSoundbank();
//se carga la lista de sonidos
sintetizador.loadAllInstruments(bancoSonidos);
//Se cargan los instrumentos
listaInstrumentos = sintetizador.getLoadedInstruments();
upperRange = listaInstrumentos.length -1 ;
} catch (Exception exc) {
exc.printStackTrace();
}
}
public void imprimeInstrumentos() {
System.out.println("Presiona que instrumento deseas escuchar: ");
System.out.println("0) Piano ");
System.out.println("30) Guitarra (distorsion)");
System.out.println("33) Bajo(con dedos)");
System.out.println("34) Bajo(con pllumilla)");
System.out.println("tambien puedes introducir un numero entre el 0 - el "+upperRange+" y escuchar su sonido");
}
public static void main(String[] args) {
SonidoTest sonido = new SonidoTest();
int opcion = 0;
while (opcion >= 0) {
sonido.pintaMenu();
Scanner sc = new Scanner(System.in);
opcion = sc.nextInt();
if (opcion < 0 || opcion > upperRange) {
System.out.println("El numero debe estar contenido[0 - "+upperRange+"], se reproducira el sonido de la guitarra.");
opcion = 30;
}
sonido.afinaInstrumento(opcion);
}
}
private void afinaInstrumento(int opcion) {
System.out.println("-> " + opcion);
Instrument instrumento = listaInstrumentos[opcion];
patch = instrumento.getPatch();
canales.programChange(patch.getBank(), patch.getProgram());
try {
for (int i = 0; i < listaNotas.length; i++) {
canales.noteOn(listaNotas[i], 100);
Thread.sleep(1000);
}
Thread.sleep(3000);
canales.allNotesOff();
} catch (Exception exc) {
exc.printStackTrace();
}
}
}
Jeje no puedo navegar pero puedo afinar la lira... que bonito no? :P
Saludos
- jali's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Bien!
Casi le podrías responder a estos posts, sólo que usaste MIDI y para esas dos dudas se requiere generar audio directamente manipulando frecuencias, en vez de mandar instrucciones MIDI. Pero éste es un muy buen ejemplo de uso de MIDI desde Java.
Yo me encontré un afinador para Android, bastante bueno, y es cromático, así que no te da la nota para que tú afines usándola de guía, sino que por el micrófono capta la frecuencia de la cuerda que tocas y te dice en qué nota estás, qué frecuencia es y si andas arriba o abajo de la nota. Pero implementar eso en JSE debe estar un poco más complicado por la onda del micrófono; aunque una vez que capturas audio, ya la conversión de los sampleos digitales a la frecuencia y de ahí a la nota no cambia.
Para android? Es interesante
Eso tendria que checarlo, se oye interesante ese afinador que mencionas. Ademas de que se escucha bastante sencillo de utilizar ya que capta la nota por el micro.
Gracias por la info
Worales!!!
No sabía que eso se podía hacer.
En mi máquina no dio los 410 instrumentos.
Aquí va el diff para que sea hasta max instrumentos
> static int upperRange;
45a47
> upperRange = listaInstrumentos.length-1;
57c59
< System.out.println("tambien puedes introducir un numero entre el 0 y el 410 y escuchar su sonido");
---
> System.out.println("tambien puedes introducir un numero entre el 0 y el "+upperRange+" y escuchar su sonido");
67,68c69,70
< if (opcion < 0 || opcion > 410) {
< System.out.println("El numero debe estar contenido[0 - 410], se reproducira el sonido de la guitarra.");
---
> if (opcion < 0 || opcion > upperRange) {
> System.out.println("El numero debe estar contenido[0 - "+upperRange+"], se reproducira el sonido de la guitarra.");
77d78
< System.out.println("-> " + opcion);
78a80,81
> System.out.println("-> " + opcion + " : " + instrumento.getName());
@OscarRyz: gracias por la observacion
Listo! el codigo ya fue modificado
Saludos