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. android: pregunta de layout_weight beginner
- 3. XSD key/keyref beginner pregunta
- 4. StructureMap Beginner | Inyección de propiedad
- 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. Guice Beginner - ¿Cómo enlazar clases concretas?
- 10. Prolog Beginner - ¿Es esta una mala idea?
- 11. jquery beginner - función para iniciar por tiempo
- 12. python - beginner - integrando optparse en un programa
- 13. resources.designer.cs no se autogenera. (MonoDevelop beginner)
- 14. Generar PDF con firma digital
- 15. ¿cuál es la diferencia entre la firma digital y el certificado digital?
- 16. iso 19794-2 formato de huella digital
- 17. Parse Lego Digital Designer * archivos .lxf
- 18. Creación de reloj digital usando un hilo
- 19. Firma digital para mensaje SOAP en WCF
- 20. Cómo convertir voz humana en formato digital?
- 21. Lazy Load images on Listview in android (Beginner Level)?
- 22. WCF Beginner Tutorial - No se puede depurar (ingrese)
- 23. Convertir las teclas hash en minúsculas - Ruby Beginner
- 24. sed beginner: cambiar todas las ocurrencias en una carpeta
- 25. Correo electrónico de firma digital en Ruby con S/MIME
- 26. compilador digital Mars D; adquiriendo la salida ASM
- 27. Keytool genera huella digital SHA1 en lugar de MD5?
- 28. Mostrar texto en un UILabel en formato digital?
- 29. caché de huella digital de URL en Amazon S3
- 30. ¿se puede copiar la firma del certificado digital? (ssl)
papel muy útil, especialmente para los conceptos básicos. – leolobato