Tarea
Debe escribir un programa que, cuando se presiona un botón, emita un sonido diferente para cada tecla.
Las teclas que usará son:
1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
Las notas comienzan en Cy cada tecla de arriba agrega un semitono.
Sin embargo, vamos a hacerlo un poco más fácil. Puedes elegir entre 2 tareas similares,
1) Produce una nota diferente cuando se presiona una tecla que continúa hasta que se presiona otra tecla. Este programa se ejecuta indefinidamente
2) Tome una cadena como entrada que solo contenga los caracteres anteriores que generarán cada nota durante exactamente 1 segundo (se permite una variación de 0.05 segundos)
Entrada
- Una tecla presionada
- Una sola cadena que contiene solo los símbolos de arriba
Salida
- Una sola nota musical que suena hasta que se presiona otra tecla
- Una serie de notas, cada una de 1 segundo de duración
Notas
Letter | Note
-------+-------
1 | C
! | C#
2 | D
" | D#
3 | E
4 | F
$ | F#
5 | G
% | G#
6 | A
^ | A#
7 | B
8 | C
* | C#
9 | D
( | D#
0 | E
q | F
Q | F#
w | G
W | G#
e | A
E | A#
r | B
t | C <-- middle C
T | C#
y | D
Y | D#
u | E
i | F
I | F#
o | G
O | G#
p | A
P | A#
a | B
s | C
S | C#
d | D
D | D#
f | E
g | F
G | F#
h | G
H | G#
j | A
J | A#
k | B
l | C
L | C#
z | D
Z | D#
x | E
c | F
C | F#
v | G
V | G#
b | A
B | A#
n | B
m | C
Reglas
- Puede elegir entre las tareas, pero indique cuál en su respuesta
- Se le da una variación de ± 0.05 segundos en la tarea 2
- Cada símbolo incrementa el tono en 1 semitono.
- Las notas individuales se muestran arriba
- Este es un código de golf, por lo que el código más corto gana
Esto fue tomado originalmente de aquí con el consentimiento de caird coinheringaahing

Respuestas:
Python 3,
154140 bytesElegí el segundo tipo de tarea.
El bucle pasa a través de cada carácter y busca el índice de este elemento en la cadena. Este índice es el número de semitonos arriba de Low C ('1'). El cálculo de la frecuencia deseada se realiza mediante esta fórmula .
PD: esta biblioteca solo funciona en Windows.
-13 bytes gracias a los ovs.
-1 byte gracias a Jonathan Allan.
fuente
from winsound import*for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)0.05tolerancia debería permitirte usar999.JavaScript (ES6), 247 o 230 bytes
Decidí probar ambas opciones.
Ahorré algunos bytes gracias a @darrylyeo por sugerir la
withdeclaración.Gracias a @ Кирилл Малышев por señalar un problema con
.search().Opción 1 - Entrada de teclado,
252246247 bytesSe basa en el elemento de entrada que recibe la letra real escrita, en lugar de los códigos de caracteres. El foco debe estar en el cuadro de entrada.
Opción 2: entrada de cadena,
234229230 bytesSimplemente toma la cadena como parámetro de función.
Fragmento combinado
Sugiero bajar el volumen mientras se ejecuta esto, puede ser ruidoso. Para detener la reproducción, el fragmento requiere agregar
o=dentro de cada unowith(c.createOscillator()).fuente
withdeclaración parao._=>{c=new AudioContext;with(c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.search(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),r||(start(),r=1)))}withdeclaración, pero rompe el último bit (o.r||(o.start(),o.r=1)) ya que estaba usando el hecho queo.rno está definido hasta ese momento, pero ahora se equivoca ya querno se ha declarado. Resulta que fue más corto declarar esa variable separada de cualquier objeto, así que lo hice..search()trata la entrada como expresión regular. Al cambiar a.indexOf().AHK , 130 bytes
Elegí la opción 2.
Explicación:
Almacenar la cadena de búsqueda como la variable
sera más corta que escapar de ese desorden directamente en laSoundBeepfunción. Tuve que escapar del signo de porcentaje, ya que es un carácter de escape para nombres de variables, pero el resto de la cadena está bien como está.Por defecto, la variable
1es el primer parámetro de entrada. Introducir eso en un bucle de análisis sin especificar un delimitador dará como resultado que cada carácter en la cadena de entrada se analice individualmente.SoundBeeptoma una frecuencia en Hz y una duración en milisegundos y toca esa nota durante ese tiempo.La parte divertida fue descubrir las frecuencias correctas. Haciendo referencia a la tabla de frecuencias de teclas de piano de Wikipedia y la fórmula en la misma página, encontré que la codificación más corta fue usar A 1 como nota de referencia porque su frecuencia es la ronda agradable de 55 Hz. Como queremos comenzar en C 1 , tenemos que ajustar desde A 1 (la nota 13) a C 1 (la nota 4). Eso, más el hecho de que
InStrestá un índice, es la razón por la que restamos 10 del resultado de laInStrfunción.fuente