synthesizer - online - Principiante Digital Synth
synth music (4)
Estoy buscando escribir un sintetizador de audio en Java, y me preguntaba si alguien tiene algún consejo o buenos recursos para escribir dicho programa. Estoy buscando información sobre la generación de ondas de sonido en bruto, cómo darles salida en una forma utilizable (reproducción a través de altavoces), así como la teoría general sobre el tema. Gracias chicos.
Echa un vistazo a Frinika . Es una estación de trabajo musical con todas las funciones implementada en Java (código abierto). Usando la API, puede ejecutar eventos midi a través del sintetizador, leer la salida de sonido sin formato 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 disertación fue la creación de un sintetizador modular basado en Java, y la Universidad en la que estudié vio la posibilidad de poner mi informe a disposición del público:
No sé si eso ayuda, pero si puedes usar MIDI para cualquier cosa, deberías consultar JFuge .
Este problema básicamente se trata de asignar funciones a matrices de números. Un lenguaje que admita funciones de primera clase sería muy útil aquí.
Consulte http://www.harmony-central.com/Computer/Programming y http://www.developer.com/java/other/article.php/3071021 para obtener información relacionada con Java.
Si no conoce los conceptos básicos de la codificación de datos de sonido, lea http://en.wikipedia.org/wiki/Sampling_rate
El formato canónico de WAVE es muy simple, consulte http://www.lightlink.com/tjweber/StripWav/Canon.html . Un encabezado (primeros 44 bytes) + datos de 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" con "char [] data" o "short [] data" o "int [] data", correspondiente al número de bits por muestra, como se define en el campo bipsa.
Para completarlo con datos, usaría algo así 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
}
De nuevo, no estoy seguro acerca de Java pero la conversión debería ser simple si convierte el puntero void a una matriz correspondiente a la tasa de bits.
Luego, simplemente escriba la estructura completa en un archivo para obtener un archivo de onda reproducible.