Tarefa
Você deve escrever um programa que, quando um botão é pressionado, emite um som diferente para cada tecla.
As chaves que você usará são:
1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
As notas começam às C
e cada tecla acima adiciona um semitom.
Vamos torná-lo um pouco mais fácil para você. Você pode escolher entre 2 tarefas semelhantes,
1) Emita uma nota diferente quando uma tecla é pressionada e continua até que outra tecla seja pressionada. Este programa é executado indefinidamente
2) Pegue uma string como entrada que contenha apenas os caracteres acima que produzirão cada nota por exatamente 1 segundo (variação de 0,05 segundo permitida)
Entrada
- Uma tecla sendo pressionada
- Uma única sequência contendo apenas os símbolos acima
Resultado
- Uma única nota musical que soa até que outra tecla seja pressionada
- Uma série de notas, cada uma com um segundo de duração
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
Regras
- Você pode escolher entre as tarefas, mas diga qual delas na sua resposta
- Você recebe uma variação de ± 0,05 segundo na tarefa 2
- Cada símbolo aumenta o tom em 1 semitom.
- As notas individuais são mostradas acima
- Este é um código de golfe, então o código mais curto ganha
Foi originalmente tirada daqui com o consentimento de caird coinheringaahing
Respostas:
Python 3,
154140 bytesEu escolhi o segundo tipo de tarefa.
O loop passa por cada caractere e procura o índice desse elemento na string. Este índice é o número de semitons acima do Baixo C ('1'). O cálculo da frequência desejada é feito por esta fórmula .
PS Esta biblioteca funciona apenas no Windows.
-13 bytes graças a ovs.
-1 byte graças a Jonathan Allan.
fonte
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.05
tolerância deve permitir que você use999
.JavaScript (ES6), 247 ou 230 bytes
Decidiu experimentar as duas opções.
Economizei alguns bytes graças a @darrylyeo por sugerir a
with
declaração.Agradecemos a @ Кирилл Малышев por apontar um problema com
.search()
.Opção 1 - Entrada do teclado,
252246247 bytesConfia no elemento de entrada que recebe a letra digitada real, em vez de códigos de caracteres. O foco deve estar na caixa de entrada.
Opção 2 - Entrada de
sequência,234229230 bytesSimplesmente pega a string como parâmetro de função.
Snippet combinado
Eu sugiro que abaixe o volume, pois isso pode estar alto. Para interromper a reprodução, o snippet exigia a adição de
o=
cada umwith(c.createOscillator())
.fonte
with
declaração à golfe fora todas as instânciaso.
, como este:_=>{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)))}
with
declaração, mas ela quebra o último bit (o.r||(o.start(),o.r=1)
) desde que eu estava usando o fato de que nãoo.r
estava definido até esse momento, mas agora ele errou, poisr
não foi declarado. Acontece que foi mais curto declarar essa variável separada de qualquer objeto, então eu fiz isso..search()
trata a entrada como regex. Mudou para.indexOf()
.AHK , 130 bytes
Eu escolhi a opção 2.
Explicação:
Armazenar a string de pesquisa como a variável
s
era menor do que escapar dessa bagunça diretamente naSoundBeep
função. Eu tive que escapar do sinal de porcentagem, pois esse é um caractere de escape para nomes de variáveis, mas o restante da string está OK como está.Por padrão, a variável
1
é o primeiro parâmetro de entrada. Alimentá-lo em um loop de análise sem especificar um delimitador resultará em cada caractere na cadeia de entrada sendo analisado individualmente.SoundBeep
capta uma frequência em Hz e uma duração em milissegundos e toca essa nota por tanto tempo.A parte divertida foi descobrir as frequências certas. Referenciando a tabela de frequências tecla de piano da Wikipedia ea fórmula na mesma página, eu achei a codificação mais curto era usar um 1 como a nota de referência porque é a frequência é o círculo agradável 55 Hz. Como queremos começar em C 1 , temos que ajustar de A 1 (nota 13) para C 1 (nota 4). Isso, mais o fato de
InStr
ser um indexado, é o motivo pelo qual subtraímos 10 do resultado daInStr
função.fonte