Este es el desafío semanal n. ° 1. Tema: Procesamiento de audio
Su tarea es escribir un programa, que escribe un archivo de audio en el disco (en un formato de su elección), que contiene el código Morse para 2015
, es decir
..--- ----- .---- .....
Usted es libre de elegir cualquier tipo de sonido para los segmentos, como una onda sinusoidal de frecuencia única, un acorde, ruido, algún instrumento (por ejemplo, usando archivos MIDI), siempre que sea audible. Sin embargo, hay algunas limitaciones en el tiempo:
- Los segmentos cortos deben tener al menos 0.2 segundos de longitud.
- Los segmentos largos deben ser al menos 3 veces más largos que los segmentos cortos.
- Los saltos entre segmentos dentro de un dígito deben tener la misma longitud que los segmentos cortos.
- Los saltos entre dígitos deben tener la misma longitud que los segmentos largos.
- Cada segmento y ruptura puede desviarse hasta un 10% de la longitud promedio de ese tipo de segmento / ruptura.
- El archivo de audio completo no puede durar más de 30 segundos.
Los descansos no necesitan ser completamente silenciosos, pero los segmentos Morse deberían ser audiblemente más fuertes que los descansos.
Tenga en cuenta que tiene que escribir un archivo de audio. No puede simplemente reproducir el sonido, por ejemplo, utilizando pitidos del sistema. Puede usar cualquier tipo de biblioteca para manejar el formato de archivo y la generación de audio, pero no debe usar las funciones integradas para la codificación Morse.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Considere vincular a una carga del archivo de audio resultante (en SoundCloud o similar), para que las personas puedan ver el resultado sin tener que ejecutar su código. Si carga en SoundCloud, asegúrese de habilitar las descargas en la pestaña Permisos de la pista.
Si su salida utiliza un formato de archivo poco común, agregue información sobre cómo reproducirlo y / o conviértalo a un formato más común y cárguelo.
Pista de ejemplo
Esta es una pista de ejemplo generada manualmente que se ajusta a la especificación y utiliza ruido para los segmentos Morse (ruido de fondo del micrófono, para ser precisos). Aquí hay un enlace a SoundCloud si el reproductor incorporado no funciona para usted.
Detalles de la recompensa
Otorgaré la recompensa al envío más breve en un lenguaje de programación de audio , es decir, un lenguaje diseñado para sintetizar sonido. Esa lista no está completa, así que siéntase libre de usar otro lenguaje de programación de audio, si conoce uno. Si no está seguro de si algún lenguaje que desea utilizar se clasifica como un lenguaje de programación de audio, hágamelo saber en los comentarios o en el chat , y podemos discutirlo.
Tenga en cuenta que su envío aún debe cumplir con todas las reglas, en particular, tiene que escribir un archivo, que podría no ser posible en todos los lenguajes de programación de audio. Por ejemplo, por lo que puedo decir, gibber solo puede reproducir el sonido y no guardarlo en un archivo.
Respuestas:
AWKBASH:66866774 bytesSegún lo solicitado por Martin Büttner, agregué un tempo ya que después de verificar el estándar de notación ABC , parece que no hay un valor predeterminado definido para esto (gracias nutki por señalar esto).
También escribo en un archivo de disco (a) en lugar de STDOUT ya que la pregunta quería explícitamente "un archivo en el disco".
Puse un tempo de 99 que hace que el archivo de audio dure 22 segundos; Es más lento que mi versión anterior, pero al menos ahora se supone que tiene la misma longitud en todos los jugadores de ABC, y se ajusta a menos de 30 segundos.
Se ve ... muy parecido a la versión anterior como puedes ver:
Aquí está el nuevo archivo midi .
Primera versión de BASH (falta el tempo)
¿Por qué no pensé en esto primero ...: o)
Eso es 22 bytes menos que con AWK, para el mismo resultado
Al igual que la versión anterior en AWK, escribe en stdout un archivo de notación "ABC" válido (gracias Tobia por descubrir que la declaración "L" era opcional)
Se parece a esto:
Y suena exactamente como la versión anterior .
Versión anterior en AWK (86 Bytes)
Aquí hay una nueva versión; un poco más, pero con una sincronización más precisa. Dejo la primera versión a continuación para comparación / referencia:
Este sigue siendo un archivo "abc" válido, que se ve así:
Aquí está el nuevo archivo midi (aceleré el tempo para permanecer por debajo del límite de 30 segundos).
Primera versión en AWK (66 Bytes):
Esto es mucho menos interesante que mi respuesta anterior , pero es mucho más corto, así que:
Esto genera un archivo "abc" válido, que puede leerse (entre otros) en EasyABC. Se verá así:
y sonará así (archivo midi) . +
fuente
Código de máquina x86 (archivo .COM):
121120113109 bytesHexdump:
Se puede ejecutar fácilmente en DosBox; la salida es un archivo .SND llamado
SND
. Aquí hay una versión FLAC de su salida (y aquí el archivo .COM).Asamblea comentada:
Lo que se
data.dat
incluye arriba es una representación fácil de usar de la cadena Morse (bit inferior: sonido activado / desactivado, superior 7 bits: longitud del sonido en muestras >> 4) generada por un script de Python:fuente
a
ofa.snd
se coloca justo antes del encabezado SND, que comienza.snd
seguido de un byte cero, por lo que obtengo la.snd
pieza de forma gratuita y reciclo su terminador cero. Además, el hecho de que el encabezado comienza un byte después del nombre del archivo me permite usar ainc dx
para mover al encabezado (1 byte) en lugar de amov dx, header
(3 bytes). OTOH, si se me permitiera llamarlo.snd
solo, podría guardar dos bytes, pero no estoy seguro de que el DOS real lo permita (el tratamiento de la extensión bajo DOS fue bastante peculiar)..SND
: me puse.SND
en DosBox,SND~1
en FreeDOS, y espero algo más en DOS "real"; por lo tanto, definitivamente es un área de "comportamiento indefinido". Al final, decidí llamar al archivoSND
(1 byte menos debido a que se eliminóa
, manteniendo el costo de loinc dx
que se conviertedec dx
).Mathematica - 130
Jugar en linea
fuente
Export
, como"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
(b=None~s~#&)@.4
También debería , puede guardar 3 caracteres usandor = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5:
94122 140Los archivos SND tienen encabezados más simples, no es necesario imprimir en binario. Esta versión produce un archivo SND mono de 8khz llamado 'a':
El archivo de resultados .
Antigua solución Produce un archivo WAV mono de 8 bits de 1 kHz llamado 'a':
El archivo de resultados .
Para llegar a 122 caracteres, tuve que pegar el encabezado en binario en lugar de empaquetarlo, lo que hace que el código sea difícil de copiar aquí. La versión escapada es:
Codificación Base64 de la solución real de 122 bytes:
fuente
.au
extensión, tal vez. ¡Bien hecho!AWK:
172170 bytes... y sin usar ninguna biblioteca de ondas! (*)
Esto genera un archivo de audio Sun au en stdout que puede reproducirse mediante vlc (entre otros). Si bien el formato de archivo au no tiene ninguna limitación de frecuencia de muestreo, VLC se niega a reproducir cualquier archivo con una frecuencia de muestreo inferior a 4096 Hz, por lo que utilicé esta frecuencia
EDITAR: Enlace al archivo de audio resultante en DropBox
(*) ¿No debería haber una bonificación por esto? ; o)
fuente
d=d "\177
... concatenación. Eso ahorra un byte. Pero cuando reproduzco el archivo de audio resultante, parece que falta el último dit de los 5.Python, 155
Utiliza el módulo de onda incorporado de Python.
Escribe en un archivo llamado
n
.Gracias Sp3000 por su sugerencia sobre el uso de la comprensión de la lista para el bucle (esto ayudó a eliminar un poco de sangría).
Escúchalo:
https://soundcloud.com/bitpwner/morse-the-new-year-2015
Aquí hay un enlace a SoundCloud si el reproductor incorporado no funciona para usted.
Código comentado:
fuente
w
es un efecto secundario, creo que puede enumerar comp para guardar dos bytes:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 bytesUtiliza la biblioteca Wav.Net .
Salidas a un archivo llamado
a
.Resultado alojado en Dropbox
Código sin golf:
fuente
Pitón
32,191188174171 (sin bibliotecas)Los archivos Wav son increíblemente simples. Quería probar sin bibliotecas. Por alguna razón, mis archivos parecen bloquear el Reproductor de Windows Media. Tiempo rapido
trabajoserrores a mitad de camino en el archivo. La conversión a una frecuencia de muestreo mayor usando Audition corrige esto.Actualización : Implementé algunas optimizaciones de la respuesta de Perl. Ahora sale solo con el nombre
n
y en muestreo de 1000Hz. Información editada arriba en consecuencia.Versión antigua
fuente
C # ~ 485 bytes
Usando la biblioteca Wav.Net .
Y aquí está la salida.
Versión legible,
fuente
C #
382333bytesNo utiliza ninguna biblioteca no estándar, escribe un wav de 8 bits por muestra 44100 muestras por segundo, con lo que espero sea un encabezado válido (parece reproducir / cargar felizmente en WMP / .NET / Audacity).
El encabezado está codificado en base64, y el morse está codificado como señal de encendido / apagado que se almacena en un solo largo (64 bits) porque los últimos 5 bits son los mismos que el primero.
El resultado se puede encontrar aquí.
Código de golf:
Con comentarios:
fuente
.wav
, por lo que puede guardar 4 bytes allí.SuperCollider ,
625605 bytesEnvío de lenguaje de programación de audio!
La salida se escribe en un archivo
b
en formato AIFF. Windows Media Player no puede abrirlo, pero funciona bien en el reproductor multimedia VLC. El archivo generadoa
es un archivo OSC .Creé algunas funciones de SuperCollider:
f
genera un pitido corto,g
un breve descanso,h
un pitido largo yi
un descanso largo. SuperCollider necesita las posiciones iniciales para cada onda sinusoidal y no una longitud, por lo que tuve que crear funciones que generen una onda con la posición inicial correcta y tengo que llamar a las funciones cada vez que necesito una onda sinusoidal. (No pude almacenar una onda con una longitud específica en una variable para reutilizar). La\w
definición se crea al final del bloque de código.En mi computadora con Windows, no guardó el archivo de audio en el mismo directorio que mi código, pero en este directorio:
Resultado alojado en Dropbox
Código con sangría:
fuente
ChucK -
1195217201147145144ChucK es un lenguaje de programación de audio. bitpwner me ayudó a reducir esto de 201 bytes a 147 bytes.
Aquí hay un enlace directo a SoundCloud si el reproductor incorporado no funciona para usted.
fuente
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
para evitar la matriz?1016835
en binario es11111000010000000011
.j
está ahí para simplemente hacer un seguimiento de las pausas entre cada dígito de2015
(cada dígito tiene 5 sonidos).Csound, 140 + 40 = 180
Lenguaje de programación de audio.
Este es el archivo de orquesta:
y este es el archivo de puntuación:
Los tamaños se calculan suponiendo que no haya espacios en blanco adicionales, un terminador de línea simple (UNIX) y ningún terminador después de la última línea.
Los invocas usando el comando csound:
que producirá un archivo de salida en el directorio actual, por defecto llamado "test.aif"
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
Podría haber afeitado dos o tres bytes eligiendo una forma de onda más fea, pero me gusta el sonido de la onda sinusoidal Morse tradicional.
PD: Soy un novato en Csound, se agradece cualquier consejo de golf, ¡especialmente en lo que respecta al archivo de puntaje!
fuente
brainfuck , 649 bytes
Esto genera una secuencia de muestras sin signo de 8 bits que se pueden reproducir a 8000 muestras por segundo con una herramienta como
aplay
en Linux. Crédito a la tabla de constantes BF .Pruébalo en línea!
Algo menos golfizado
fuente