Pregunta

Estoy pensando en escribir un sintetizador de audio en Java y me preguntaba si alguien tiene algún consejo o buenos recursos para escribir un programa de este tipo.Estoy buscando información sobre cómo generar ondas de sonido sin procesar, cómo generarlas en una forma utilizable (reproduciendo a través de parlantes), así como teoría general sobre el tema.Gracias chicos.

¿Fue útil?

Solución

  1. Este problema consiste básicamente en asignar funciones a matrices de números.Un lenguaje que admita funciones de primera clase sería muy útil aquí.

  2. Verificarhttp://www.harmony-central.com/Computer/Programming yhttp://www.developer.com/java/other/article.php/3071021 para obtener información relacionada con Java.

  3. Si no conoce los conceptos básicos de codificación de datos de sonido, lea http://en.wikipedia.org/wiki/Sampling_rate

  4. El formato WAVE canónico es muy simple, ver http://www.lightlink.com/tjweber/StripWav/Canon.html.Un encabezado (primeros 44 bytes) + los datos de la onda.No necesita ninguna biblioteca para implementar eso.

En C/C++, la estructura de datos correspondiente se vería así:

typedef struct _WAVstruct
{
    char headertag[4];
    unsigned int remnantlength;
    char fileid[4];

    char fmtchunktag[4];
    unsigned int fmtlength;
    unsigned short fmttag;
    unsigned short channels;
    unsigned int samplerate;
    unsigned int bypse;
    unsigned short ba;
    unsigned short bipsa;

    char datatag[4];
    unsigned int datalength;

    void* data; //<--- that's where the raw sound-data goes
}* WAVstruct;

No estoy seguro acerca de Java.Supongo que tendrás que sustituir "struct" por "class" y "void* data" por "char[] data" o "short[] data" o "int[] data", correspondiente al número de bits por muestra, tal y como se define en el campo bipsa.

Para llenarlo con datos, usarías algo como esto en C/C++:

int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
    result->headertag[0] = 'R';
    result->headertag[1] = 'I';
    result->headertag[2] = 'F';
    result->headertag[3] = 'F';
    result->remnantlength = 44 + datalength - 8;
    result->fileid[0] = 'W';
    result->fileid[1] = 'A';
    result->fileid[2] = 'V';
    result->fileid[3] = 'E';

    result->fmtchunktag[0] = 'f';
    result->fmtchunktag[1] = 'm'; 
    result->fmtchunktag[2] = 't';
    result->fmtchunktag[3] = ' ';
    result->fmtlength = 0x00000010;
    result->fmttag = 1;
    result->channels = channels;
    result->samplerate = samplerate;
    result->bipsa = bipsa;
    result->ba = channels*bipsa / 8;
    result->bypse = samplerate*result->ba;

    result->datatag[0] = 'd';
    result->datatag[1] = 'a';
    result->datatag[2] = 't';
    result->datatag[3] = 'a';
    result->datalength = datalength;

    result->data = data; // <--- that's were the data comes in

    return 0; // an error code, not implemented, yet ...; in Java: return result
}

Nuevamente, no estoy seguro acerca de Java, pero la conversión debería ser sencilla si convierte el puntero vacío en una matriz correspondiente a la tasa de bits.

Luego simplemente escriba la estructura completa en un archivo para obtener un archivo wave reproducible.

Otros consejos

Verificar frinica.Es una estación de trabajo de música con todas las funciones implementada en Java (código abierto).Con la API, puede ejecutar eventos midi a través del sintetizador, leer la salida de sonido sin procesar y escribirla en un archivo WAV (consulte el enlace del código fuente a continuación).

Información adicional:

Mientras estudiaba para obtener mi título, mi proyecto de tesis fue la creación de un sintetizador modular basado en Java, y la universidad en la que estudié consideró oportuno hacer que mi informe estuviera disponible públicamente:

Un sintetizador modular basado en software en Java

No sé si eso ayuda, pero si puedes usar MIDI para cualquier cosa, deberías consultar JFuge.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top