Salida "Mozart - Alla Turca" a stdout (vea la muestra para "implementación de referencia")
Intenta encontrar cómo empaquetar el sintetizador y la música en un tamaño mínimo.
Requisitos:
- Formato adecuado para alimentar
aplay -f cd
(little endian firmado de 16 bits, 2 canales); - Se debe reproducir música completa (sin notas o partes omitidas, al menos no menos que en el programa de muestra), aunque no se requiere polifonía;
- No puedo simplemente llamar
/usr/bin/timidity
,/usr/bin/sox
o algo así (por ejemplo, requiere instalar un módulo de música especial); - No puedo acceder a la red o asumir que la música está disponible localmente;
"Implementación de referencia" con puntaje analizable: https://gist.github.com/vi/5478693
(Programa Perl de muestra anterior: https://gist.github.com/vi/5447962 )
Respuestas:
Polifónico, Haskell,
282631774719Salida de audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
caracteristicas:
de la mano derecha . Por supuesto, también podría agregar la mano izquierda(hecho eso).como si te subieras a un piano realen realidad, bastante más ... oye, se supone que esta pieza debe estar imitando bandas turcas de Janissary , ¿verdad?Aquí hay una versión parcialmente ignorada y comentada: https://gist.github.com/leftaroundabout/5517198 .
fuente
Python, 331 + 286 = 617 (0.548 bytes por nota)
Mi solución usa un archivo de datos y un script de Python. El archivo de datos debe usarse como entrada para el script. No tengo una aplicación, pero funciona cuando la importo como datos sin procesar en Audacity con PCM de 16 bits firmado, little-endian y 2 canales.
El archivo de datos tiene 331 bytes. Aquí hay un script de Python que lo genera:
Aquí está el script de Python:
Nota: Si está ejecutando Windows, use el
-u
interruptor para ambos scripts, ya que stdin y stdout están tratando con datos binarios.fuente
os.read/write
lugar desys.stdin/stdout
.GolfScript (129 + 369 = 498 bytes)
Tanto el programa como el archivo de datos incluyen caracteres no imprimibles, por lo que voy a dar representaciones de Base64 y xxd.
Programa (129 bytes):
Datos (369 bytes):
Explicación
He destrozado la puntuación suministrada (actualizada) (más sobre eso más adelante) en una sola cadena que contiene bytes con valores de 0 a 24. Las duraciones de las notas son lo primero; luego los valores de las notas, representados mod 25 y codificados por diferencia. La razón de la codificación de la diferencia es que los pasajes que se repiten en la transposición se reducirán a la misma secuencia y se pueden comprimir.
Luego ejecuté esto a través de un programa de compresión de cadena a GolfScript que he mencionado antes (y que mejoré para ser competitivo en este golf) para obtener el archivo de datos, que se descomprime en la primera parte del programa:
Es una simple expansión gramatical de un tipo que es familiar para cualquiera que haya examinado muchas preguntas etiquetadas como complejidad kolmogorov .
Luego divido esta cadena en pares
[length note]
e itero a través de los pares. Los caracteres no imprimibles provienen de una cadena mágica que contiene parámetros de frecuencia para las notas: estoy usando el mod 256 de truncamiento implícito de GolfScript de matrices de enteros que se convierten en cadenas para producir una onda triangular *, por lo que la frecuencia base es 22050/256 Hz. Escribí un programa para encontrar relaciones enteras que dan una buena sintonía; la cadena mágica contiene numeradores, y el denominador 17 es el mismo para todas las notas. El error de ajuste promedio es de aproximadamente 3.4 centavos.Las duraciones de las notas se representan como son y son mucho más plausibles que la versión anterior de la partitura. Como sospechaba, el redondeo aumentó la redundancia en la cadena y acortó el archivo de datos comprimido en 30 bytes, sin mencionar que guardó la matriz de búsqueda. Sin embargo, todavía hay algunos pasajes que me parecen sospechosos:
o
dar barras que son una sexta parte de un ganchillo más largas que el resto de las barras en la puntuación, y
o
son un número integral de barras, pero con algunas compensaciones dudosas.
El programa podría ser un poco más corto. Deliberadamente he optado por cambiar la escasez por tiempo de ejecución. Con algunas mejoras de velocidad en el intérprete de GolfScript que he enviado a Darren Smith y que creo que planea publicar en algún momento, la versión actual se ejecuta en menos de 15 minutos en mi computadora. Si no hago
puts
cada nota después de generarla, entonces se ejecuta mucho más lento.* Por la presente confieso que mi comentario sobre todos los que usan ondas cuadradas fue incorrecto.
fuente
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript y dicegolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(lo mismo si guardo el programa en un archivo, por supuesto)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), obtengoundefined method
class_id 'for nil: NilClass`Código de máquina x86: 513 bytes
Esto no cumple completamente con el desafío, ya que en lugar de emitir en un formato adecuado para alimentar un aplay, reproduce el midi.
Archivo ejecutable .COM y código fuente asm : la música puede tardar hasta 14 segundos en iniciarse. También jugará un poco lento, ya que la resolución del temporizador es 1/18 de segundo.
La música se codifica en 375 bytes utilizando la codificación Fibonacci y un diccionario compuesto por la música previamente decodificada.
Algoritmo de decodificación de pseudocódigo:
Una vez que se decodifica la música, es una simple cuestión de enviarla al puerto Midi.
fuente