2011-07-13 14 views
13

Lo que estoy tratando de lograr es tocar un acorde de guitarra de mi aplicación Python. Sé (o puedo calcular) las frecuencias en el acorde si es necesario.La manera más fácil de producir acordes de guitarra en Linux y/o Python

Estoy pensando que incluso si hago el trabajo de bajo nivel de producción de ondas sinusoidales múltiples en las frecuencias correctas, no sonará bien debido a que la envolvente también debe ser correcta, sino que no sonará como una guitarra, sino más de un zumbido

Tantilisingly, el juego de comandos Linux sox puede producir una nota individual con bastante convincente:

play -n synth 0 pluck E3

Así que en realidad lo que estoy preguntando es,

a) es posible el calzador comando play para hacer un acorde completo (idealmente con tiempos de inicio ligeramente diferentes para simular el trazo de la cadena de plectro) - no he podido hacer esto, pero tal vez hay algo de bash fairydust que tenedor un proceso o algo así suena bien . Si esto es posible, me conformaría con llamar a un comando bash desde mi código (no me gusta reinventar la rueda).

b) (incluso mejor) ¿hay alguna manera en python de lograr esto (un sonido de cuerda de guitarra)? He visto unas cuantas librerías python midi accesibles pero francamente midi no es una buena opción para el sonido que quiero, por lo que puedo ver.

Respuesta

13

El manual da este ejemplo:

play -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \ 
       delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1 

Esto crea 6 instancias simultáneas de sintetizador (como canales de audio separados), retrasa 5 de los canales por los tiempos ligeramente crecientes, a continuación, los mezcla a un solo canal.

El resultado es un acorde de guitarra bastante convincente; Por supuesto, puede cambiar las notas o los retrasos muy fácilmente. También puede jugar con el sostenido y el tono de la "guitarra", o agregar un efecto de sobremarcha; consulte el manual para obtener más detalles.

+0

agradable. Voy a intentar esto. La solución actual es bastante hacky y he descubierto que si la ejecutas una y otra vez puede romperse, pero suena bien siempre y cuando lo hagas lentamente. - Lo intentaré y volveré en las próximas semanas. – Sirex

+0

¡increíble! moveré la respuesta aceptada para que sea esto, porque realmente suena mucho mejor. :-) Gracias ! – Sirex

+0

¿Tienes una idea de cómo hacer objetos filosos/planos usando el subcomando 'pl' synth? – sehe

4

a) ¿es posible calzar el comando reproducir para hacer un acorde completo ...?

Si su arquitectura de sonido lo admite, puede ejecutar varios comandos que emiten audio al mismo tiempo. Si está utilizando ALSA, necesita dmix u otras variantes en su ~/.asoundrc. Use subprocess.Popen para generar muchos procesos hijos. Si esto fuera hipotéticamente una escritura del golpe, que podría hacer:

command1 & 
command2 & 
... 

b) (aún mejor) hay una manera de pitón de lograr esto (un sonido acorde de la guitarra)?

Compila a MIDI y envía a través de un sintetizador de software como FluidSynth.

+0

Voy a intentar esto esta noche, pero estoy en fedora (y supongo que los usuarios de mis clientes estarán en fedora o ubuntu principalmente) pero estoy usando pulseaudio. Pensé en el & truco de anoche, pero cuando lo probé no se reprodujo nada hasta que traje el proceso al primer plano, que de alguna manera venció al punto. Con respecto a B) me estoy preguntando qué hace Sox, porque probé cada instrumento en tuxguitar con midi y sonaba como basura, pero sox me parece bien. Tal vez es una ilusión. – Sirex

6

a) La manera difícil es generar un subproceso en segundo plano para ejecutar cada comando play. Como un subproceso en segundo plano no hace que el intérprete de comandos espere a que termine, puede tener múltiples play s ejecutándose a la vez. Algo como esto funcionaría:

for p in "C3" "E3" "G3"; do (play -n synth 3 pluck $p &); done 

veo que ninjagecko registró básicamente lo mismo que estoy escribiendo esto.

b) El punto clave para darse cuenta de los datos MIDI es que es más como una receta de alto nivel para producir un sonido, no el sonido en sí mismo. En otras palabras, cada nota MIDI se expresa como un tono, un nivel dinámico, tiempos de inicio y finalización, y otros metadatos surtidos. El sonido real es producido por un sintetizador, y diferentes sintetizadores hacen el trabajo con diferentes niveles de calidad. Si no le gusta el sonido que obtiene de sus archivos MIDI, no es un problema con MIDI, es un problema con su sintetizador, por lo que solo necesita encontrar uno mejor. (En la práctica, eso generalmente requiere $$$; la mayoría de los sintetizadores gratuitos o baratos son bastante malos.)

Una alternativa sería cavar bajo el capó, por así decirlo, e implementar un algoritmo para crear su propio sonido de guitarra .Para eso, querrá consultar digital signal processing, en particular algo como Karplus-Strong algorithm (una de las muchas formas de crear un sonido de cuerdas sintéticas). Es un tema fascinante, pero si tu única exposición a la síntesis de sonido está en el nivel play y la creación de archivos MIDI, tendrías un poco de aprendizaje que hacer. Además, Python probablemente no sea la mejor opción de lenguaje, ya que la velocidad de ejecución es bastante crítica.

Si tiene curiosidad acerca de DSP, es posible que desee descargar y jugar con ChucK.

+0

que para el bucle parece funcionar, aunque con cierto recorte debido a la amplitud, pero es un buen comienzo, gracias :-) - Principalmente había descartado el midi como una opción, ya que sonará diferente en la máquina de cada usuario final. Veré a dónde me lleva el bucle for. – Sirex

+0

corregido con el especificador "vol". Esto parece una solución viable, ¡gracias! :-) – Sirex

Cuestiones relacionadas