Escribe un programa para tocar la popular canción infantil inglesa.
(Este archivo está licenciado bajo la licencia Creative Commons Reconocimiento-Compartir Igual 3.0 Unported . Atribución: Helix84 en Wikipedia en inglés ; Blahedo en Wikipedia en inglés ).
Algunos artículos de Wikipedia que pueden ser útiles:
- Twinkle Twinkle Little Star (tiene un clip de audio de cómo debería sonar la salida de tu programa)
- Símbolos musicales modernos (para aprender sobre la notación musical utilizada anteriormente)
- Nota # Frecuencia de nota (hertz) (la fórmula para calcular la frecuencia de cada nota)
Algunas pautas para su envío:
Su programa debe usar la tarjeta de sonido de la computadora. Si su lenguaje de programación no tiene acceso conveniente al hardware de audio, su programa debe crear un archivo de salida en algún formato estándar como WAV o MIDI.
Su programa realmente debe generar su salida. Por ejemplo, no se permitiría incrustar el archivo Ogg Vorbis de Wikipedia.
La calidad del audio debe ser aceptable. Por lo menos, la canción debe ser fácilmente reconocible. Preferiblemente, también debería sonar bien.
El enfoque debe estar en el tamaño del código, la calidad del sonido o en ambos (explique cuál decidió). Las soluciones elegantes también serían geniales. ¡Que te diviertas!
Este es un código de golf , por lo que gana el código más corto
Respuestas:
QBasic (56)
El foco está en la reminiscencia :)
(Sin embargo, no tengo un QBasic para probar esto)
fuente
JavaScript (
214212211 caracteres)Abra Safari, Opera o Google Chrome a JavaScript Shell , luego ingrese el código a continuación:
No minificado para facilitar la lectura (incluso entonces puede ser difícil de entender):
Con varios caracteres más, podría funcionar también en Firefox, pero puede cambiar la
audio/wav
parte para guardar al menos el archivo WAV.fuente
open(...)
aAudio(...).play()
(8 caracteres más) para que utilizara el reproductor de audio incorporado de Firefox.C # (Longitud: LOL)
Entonces, lo que hice aquí fue implementar soporte para generar un archivo .wav a partir de la cadena utilizada para la solución QBasic en C # (octava única, sin accidentes). El énfasis estaba en:
unsafe
bloques de códigofuente
FromDigits["LOL",36]==28101
Eso no se parece a LOL <sub> 36 </sub> bytes ...Pitón (259)
fuente
import ttls
?C, 277 caracteres
Perl, 203 caracteres
Convenientemente, el valor predeterminado de OSS es 8
/dev/dsp
kHz mono u8; Todo lo que hago aquí es abrir el dispositivo y escribir muestras calculadas.fuente
j,f;main(i){char b[8000];f=open("/dev/dsp",1);for(i=24;i--;write(f,b,j))for(j=0;j<8000;j++)b[j]=(i%4&&j/400%20==9?1:1+sinf(j*powf(2,("@BDEGIG@BDEGBDEG@BDEGIG@"[i]-64)/12.)))*127;}
PowerShell: 207
Código de golf:
Sin golf, con comentarios:
No es la interpretación de la canción que suena mejor, pero funciona.
fuente
n{
lugar den {
?C - 520
Bache.
¿Por qué usar hardware del siglo pasado como parlantes y auriculares? Este excelente código te permite tocar la canción en un hardware moderno: ¡una unidad de disquete!
Ningún requerimiento especial:
-lm
/dev/fd0
, por lo que puede ver el dispositivo o ejecutarlo como superusuarioDobla un poco las reglas, pero consideremos por un segundo la unidad de disquete como un dispositivo de sonido y el controlador IDE como una tarjeta de sonido integrada.
fuente
HyperCard 2.2 - 113
Uso: Inicie HyperCard, escriba ⌘M para abrir el cuadro de mensaje, pegue el código anterior y presione Entrar.
harpsichord
puede ser reemplazado porflute
oboing
para obtener diferentes sonidos.fuente
harpsichord
->flute
-6 elimina el espacio entre el instrumento y las comillas -1 total -7C, 96 caracteres
Produce datos de audio mono sin signo de 8 bits sin procesar en el clásico estilo bytebeat . Las frecuencias de muestreo recomendadas para la reproducción son entre 8 y 16 kHz; cambiar la frecuencia de muestreo cambia el tempo y el tono.
Para compilar y jugar en Linux, guarde el código anterior como
twinkle.c
y ejecute los siguientes comandos:Algunas notas sobre cómo funciona el código:
El truco general utilizado para composiciones de bytebeat como este es que
putchar()
toma un valor entero pero solo imprime los ocho bits más bajos. Por lo tanto,putchar(t)
dondet
hay un contador creciente, genera una onda de diente de sierra, y la frecuencia de la onda se puede alterar multiplicándolat
con un valor adecuado.!!(t>>9&7|!(-t>>12&7))
produce el patrón repetitivo de 6 + 1 notas. Específicamente,!!(t>>9&7)
evalúa a0
cuandot>>9 & 7 == 0
y de lo1
contrario. Por lo tanto, produce una brecha de 512 muestras en la forma de onda cada 4096 muestras, mientras que!(-t>>12&7)
elimina cada octava brecha.96+"#d|dOE3#dOE3dOE3"[t>>13&15]
genera la melodía: el código ASCII de cada carácter en la cadena más 96 da la frecuencia relativa de la nota correspondiente. En realidad, los valores son las frecuencias aproximadas en Hz de las notas de tono de concierto en la tercera / octava pequeña, es decir, con A correspondiente a 220. Sin embargo, dado que el tono base con el que se multiplican estos valores es de aproximadamente 64 Hz (cuando se reproduce a 16 kHz , o 32 Hz cuando se juega a 8 kHz), necesitamos reducir el resultado en cinco octavas>>5
para que la frecuencia vuelva a un rango razonable.PD. Si desea probar este código en un reproductor de bytebeat basado en JavaScript, reemplácelo
[t>>13&15]
con.charCodeAt(t>>13&15)
.fuente
Pitón
317305301Esta es mi solución, usando solo bibliotecas python estándar:
Y aquí está con un poco más de espacio en blanco para facilitar la lectura:
fuente
Mathematica, 86 caracteres
fuente
Arduino, 688
Conecte el timbre en la salida 11. Me concentré principalmente en la calidad , pero también en la longitud del código.
fuente
"ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "
eliminar espacio?int beats[] =
eliminar espacio?for (long
eliminar espacio?11, LOW
eliminar espacio?note, int
eliminar espacio?i], duration
eliminar espacio?11, OUTPUT
eliminar espacio?ffeeddc "
es para algún tipo de retraso, que no es necesario al final, ybeats[] =
no tiene ninguna razón para tener un espacio. Además, debe hacer una versión que se concentre en la longitud del código, ¡solo por el gusto de hacerlo!bash + say + gunzip, 136 bytes
say
, por supuesto, siendo el comando de texto a voz de OS X. Esto es ... tonto. Sí, vamos con Dorky.Los 117 bytes son, por supuesto, una secuencia gzip que contiene caracteres no imprimibles. Aquí hay un volcado xxd del script que incluye esos caracteres:
Explicación
Los 117 bytes son el siguiente script comprimido:
Así es, acabo de hacer que un montón de
say
voces diferentes digan "o". Para averiguar cuáles, escribí un guión usando aubionotes para obtener una estimación rápida y sucia del tono de cada voz, luego hice un montón de prueba y error para encontrar las que suenan más bien correctas.Pensé en intentar jugar golf manualmente, pero hay tanta repetición que pensé que Zopfli haría un trabajo más corto, así que tomé el camino fácil.
fuente
SmileBASIC, 45 bytes
fuente
PowerShell,
120117 bytes[Console]::beep
, notas de etiquetas y frecuencias inspiradas en IsziIdea principal :
A
,C
,D
,E
,F
,G
.double duration
.$_-band7
) de cada usos nota como índice de la matriz de frecuencias (A->1
,C->3
,D->4
...)(0,110,0,65,73,82,87,98)[$_-band7]*4
lugar de Iszi(0,440,0,262,294,330,349,392)[$_-band7]
.[console]::Beep
no es el instrumento musical más preciso, por lo que puede ser un poco falso :)Explicación : Para cada char de la cadena de melodía
ccggaaGffeeddCggffeeDggffeeDccggaaGffeeddC
, el script:[console]::beep
para tocar la notafuente