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.Beginner Digital Synth
Respuesta
Este problema es básicamente acerca de funciones de mapeo a arrays de números. Un lenguaje que admita funciones de primera clase sería muy útil aquí.
Salida http://www.harmony-central.com/Computer/Programming y http://www.developer.com/java/other/article.php/3071021 algo de información relacionada con Java.
Si no conoce los conceptos básicos de la codificación de datos de sonido, a continuación, lea http://en.wikipedia.org/wiki/Sampling_rate
El formato WAVE canónico es muy simple, ver 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 sería algo como esto:
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.
a llenarlo con los datos, se 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
}
Una vez más, no estoy seguro acerca de Java, pero la conversión debería ser sencillo si convierte el vacío triple a una matriz correspondiente a la tasa de bits.
Luego, simplemente escriba toda la estructura en un archivo para obtener un archivo de onda reproducible.
Echa un vistazo 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 mi grado, mi proyecto de tesis fue la creación de un sintetizador modular basado en Java, y la Universidad a la que he estudiado tuvo a bien hacer mi informe a disposición del público:
yo no No sé si eso ayuda, pero si puede usar MIDI para cualquier cosa, debe consultar JFuge.
Eso es JFugue en http: //www.jfugue.org –
MIDI es como pedernal: merece respeto por su servicio a la humanidad en el pasado distante, pero hoy en día no es algo que nadie debería estar usando en serio. – MusiGenesis
@MusiGenesis - ¿Hablas en serio? LOL – Krakkos
- 1. Software Synth Library para Java
- 2. XSD key/keyref beginner pregunta
- 3. StructureMap Beginner | Inyección de propiedad
- 4. android: pregunta de layout_weight beginner
- 5. Huella digital de video digital de código abierto
- 6. firma digital en android
- 7. XML Digital Signature Java
- 8. Cómo generar fácilmente sonidos de acordes Synth en Android?
- 9. Prolog Beginner - ¿Es esta una mala idea?
- 10. resources.designer.cs no se autogenera. (MonoDevelop beginner)
- 11. jquery beginner - función para iniciar por tiempo
- 12. python - beginner - integrando optparse en un programa
- 13. Guice Beginner - ¿Cómo enlazar clases concretas?
- 14. Generar PDF con firma digital
- 15. ¿cuál es la diferencia entre la firma digital y el certificado digital?
- 16. Firma digital para mensaje SOAP en WCF
- 17. Parse Lego Digital Designer * archivos .lxf
- 18. Creación de reloj digital usando un hilo
- 19. Cómo convertir voz humana en formato digital?
- 20. iso 19794-2 formato de huella digital
- 21. Convertir las teclas hash en minúsculas - Ruby Beginner
- 22. sed beginner: cambiar todas las ocurrencias en una carpeta
- 23. Lazy Load images on Listview in android (Beginner Level)?
- 24. WCF Beginner Tutorial - No se puede depurar (ingrese)
- 25. cómo comprobar si un archivo tiene una firma digital
- 26. Correo electrónico de firma digital en Ruby con S/MIME
- 27. Creación de una estación de trabajo de audio digital
- 28. Mostrar texto en un UILabel en formato digital?
- 29. Insertar firma digital en el archivo pdf existente
- 30. ¿La mejor manera de generar una huella digital de máquina?
papel muy útil, especialmente para los conceptos básicos. – leolobato