El usuario quartata publicó este desafío , pero descuidó el hecho de que, por cualquier razón, no puede reproducir archivos MIDI en su computadora.
Vamos a ayudarlo escribiendo un programa completo que lea una canción en formato RTTTL desde la entrada estándar, imprima el nombre de la canción en la salida estándar y la reproduzca (a la velocidad y tono adecuados).
Detalles de formato
RTTTL es un formato de tono de llamada bastante tonto y poco especificado. Consiste en un nombre, algunos valores predeterminados y una serie de notas (solo una nota a la vez) en un formato de texto simple.
Ejemplo: fifth: d=4,o=5,b=63: 8P, 8G5, 8G5, 8G5, 2D#5
El nombre es una cadena terminada por dos puntos. Aquí el nombre es "quinto". Su programa debe aceptar nombres con al menos 15 caracteres.
A continuación, la sección predeterminada (también terminada por dos puntos) enumera algunos valores predeterminados para la duración (d), la octava (o) y los latidos por minuto (b) de la canción. Están separados por comas y usan una sintaxis "clave = valor". Puede haber cualquier número de espacios alrededor de cada parte "clave = valor". Puede suponer que los valores predeterminados d, o y b están todos presentes, en este orden. La duración y la octava se explicarán a continuación; los bpm se refieren al número de latidos (correspondientes a las notas negras) que se deben reproducir en un minuto, y debe admitir cualquier valor entero entre 20 y 900 (inclusive).
Luego, la canción real aparece como una serie de notas separadas por comas utilizando una sintaxis "DPO", donde D es la duración, P es el tono (nota) y O es la octava. Puede haber cualquier número de espacios y líneas nuevas alrededor de cada parte "DPO".
La duración es una potencia de 2 entre 1 y 32 (inclusive), que representa una fracción de una nota completa. Entonces, por ejemplo, un valor de 4 (cuarto de nota) es dos veces más largo que un valor de 8 (octava nota). Puede faltar la duración, en cuyo caso se utilizará la duración predeterminada. La duración también puede modificarse por la presencia de un punto ( .
), específicamente el punto hace que la nota dure un 50% más. Como no todos están de acuerdo sobre dónde se supone que debe estar el punto, debe aceptar un punto después del tono o después de la octava (es decir, tanto "DP.O" como "DPO" deberían funcionar).
El tono es uno de A, B, C, D, E, F, G, A #, C #, D #, F #, G #, P donde AG # son las notas musicales estándar (nota: sin flats, use la nota aguda correspondiente) y P es una pausa. El tono es la única parte de la nota que se requiere y no distingue entre mayúsculas y minúsculas.
Y finalmente, la octava es un número normalmente del 4 al 8, pero debe admitir cualquier número del 1 al 8 inclusive. Por ejemplo, C4 es el C medio estándar con una frecuencia de aproximadamente 261.63Hz. Puede faltar la octava, en cuyo caso se usará la octava predeterminada. Puede suponer que las pausas no tienen una octava especificada (ya que no tiene significado).
Como se mencionó en el otro desafío, puede usar este sitio para convertir canciones RTTTL a formato MIDI para pruebas (pero tenga en cuenta que puede no seguir exactamente la misma especificación).
Requisitos:
Su programa debe tocar cada nota a la velocidad y tono adecuados. Puede usar cualquier tipo de sonido (seno / triángulo / onda cuadrada, sonido de piano, sonido de campana, lo que sea; también puede ser un pitido estándar, sonido de onda o sonido MIDI, etc.) siempre que sea audible y el tono sea reconocible.
Cada nota debe reproducirse de forma continua durante la duración especificada o no más de una nota 64 más corta que esa, excepto si está usando algo como un sobre ADSR , en cuyo caso la fase de liberación puede continuar hasta la próxima pausa o sobre la siguiente nota .
Si dos notas consecutivas tienen el mismo tono, deben distinguirse claramente, ya sea a través de un breve descanso (usando no más de la duración de una nota 64, como parte de la duración de la primera nota) o usando un sonido no uniforme (como como el sobre ADSR mencionado anteriormente), o al menos a través de un cambio de fase si es lo suficientemente claro. Dos pausas consecutivas deben tratarse igual que una pausa única con la duración total.
El programa debe ser ejecutable en Linux utilizando software disponible gratuitamente. Debe leer la canción desde la entrada estándar e imprimir el nombre de la canción en la salida estándar.
Si la entrada no coincide con la especificación anterior, el comportamiento no se especifica. Su programa puede ignorar errores, imprimir un mensaje o reproducir algo incorrecto, colgarse o bloquearse, simplemente no debería causar ningún daño.
Las lagunas estándar no están permitidas.
Puntuación
Código de golf, el programa más corto (medido en UTF-8 bytes) gana.
Respuestas:
Java, 813
Todavía estoy trabajando en ello.
Es un poco sensible a la velocidad de la CPU y al ajetreo cuando se inicia.
fuente
C ++, 15186 bytes
Hay un enlace en la parte inferior donde puedes escuchar una muestra
Les presento una de las formas menos prácticas para reproducir música en su máquina Linux:
Desafortunadamente, no puedo incluir tanto el código golfizado como el no golfista (restricciones de espacio), y el código podría ser más golfizado.
Una gran parte de la razón por la que el archivo es tan largo es que tiene que crear cada tono (12 notas * 5 octavas) individualmente usando ondas sinusoidales.
Compilación Compilé utilizando el indicador dev cmd para visual studio, pero es muy similar con g ++ en Linux.
Solo necesita vincular las cosas correctamente.
crédito a SFML y esta publicación por la idea.
Creo que los tiempos son correctos, avíseme si no lo son.
Escúchalo
Aquí (Link to DropBox) hay una grabación de pantalla que reproduce una versión rápida del tema Morrowind que preparé. Tenga en cuenta que en el video no solicita entrada porque el archivo ya existe.
fuente