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

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

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.

Imagen de jali

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

29a30
>     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());
Imagen de jali

@OscarRyz: gracias por la observacion

Listo! el codigo ya fue modificado

Saludos