Klavyenizi klavyeye dönüştürün


10

Görev

Bir düğmeye basıldığında, her tuş için farklı bir ses çıkardığı bir program yazmalısınız.

Kullanacağınız anahtarlar:

1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm

Notlar başlar Cve yukarıdaki her tuşa bir yarı ton eklenir.

Gerçi sizin için biraz daha kolaylaştıralım. 2 benzer görev arasından seçim yapabilirsiniz,

1) Başka bir tuşa basılana kadar devam eden bir tuşa basıldığında farklı bir not alın. Bu program süresiz olarak çalışıyor

2) Bir dizeyi yalnızca her bir notayı tam olarak 1 saniye boyunca çıktılayacak olan yukarıdaki karakterleri içeren giriş olarak alın (0,05 saniye varyasyona izin verilir)

Giriş

  1. Basılan bir tuş
  2. Yalnızca yukarıdaki sembolleri içeren tek bir dize

Çıktı

  1. Başka bir tuşa basılana kadar çıkan tek bir nota
  2. Her biri 1 saniye uzunluğunda bir dizi nota

notlar

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

kurallar

  • Görevler arasında seçim yapabilirsiniz, ancak lütfen cevabınızda hangisinin olduğunu söyleyin
  • Görev 2'de ± 0,05 saniyelik bir varyasyon verilir
  • Boyunca her sembol tonu 1 yarı ton arttırır.
  • Münferit notlar yukarıda gösterilmiştir
  • Bu bir yani kısa kod kazanıyor

Bu aslen alındı Burada ile Caird coinheringaahing en rızası


Bunu ses kitaplığı olmayan dillere kadar açmak için üçüncü bir çıktı biçimi öneriyorum: stdout'a yazılan seçenek 2 çıktısını içeren bir WAV dosyası. Bu, ikili verileri yazdırabilen herhangi bir dilde girişlere izin verir.
Ray

Yanıtlar:


6

Python 3, 154140 bayt

from winsound import*
for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),999)

İkinci görev türünü seçtim.

Döngü her karakterden geçer ve dizede bu öğenin dizinini arar. Bu indeks, Düşük C'den ('1') gelen yarı ton sayısıdır. İstenen frekansın hesaplanması bu formülle yapılır .

PS Bu kütüphane yalnızca Windows'da çalışır.

Ovs sayesinde -13 bayt.

Jonathan Allan sayesinde -1 bayt.


1
Muhtemelen bunun sadece Windows üzerinde çalıştığını belirtmelisiniz.
totallyhuman

1
141 bayta from winsound import* for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)
golf oynadı

Ama soru bir program istedi ....
Neil A.

0.05Tolerans Kullanmak izin vermelidir 999.
Jonathan Allan


3

JavaScript (ES6), 247 veya 230 bayt

Her iki seçeneği de denemeye karar verdim.

Bildiriyi önerdiği için @darrylyeo sayesinde birkaç bayt kaydetti with.
@ Кирилл Малышев'a bir sorunu işaret ettiği için teşekkür ederiz .search().

Seçenek 1 - Klavye Giriş, 252 246 247 bayt

_=>{c=new AudioContext;q=1;with(c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),q&&start(q=0)))}
<input id=I

Karakter kodları yerine, girilen gerçek harfi alan giriş öğesine güvenir. Odak, giriş kutusunda olmalıdır.

Seçenek 2 - Dize Girdi, 234 229 230 bayt

s=>{c=new AudioContext;with(c.createOscillator())connect(c.destination),[...s].map((c,i)=>frequency.setValueAtTime(65.4*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(c)/12),i)),start(),stop(s.length)}

Dizeyi function parametresi olarak alır.

Kombine Snippet

Bunu çalıştırırken ses düzeyinizi düşürmenizi öneririm, yüksek olabilir. Oynatmayı durdurmak için snippet'in o=her birinin içine eklenmesi gerekiyordu with(c.createOscillator()).

f= // keyboard input
_=>{c=new AudioContext;q=1;with(o=c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),q&&start(q=0)))}

g= // string input
s=>{c=new AudioContext;with(o=c.createOscillator())connect(c.destination),[...s].map((c,i)=>frequency.setValueAtTime(65.4*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(c)/12),i)),start(),stop(s.length)}

swap=_=>{keyboard=!keyboard;A.innerHTML=keyboard?"Keyboard":"String";S.style.display=keyboard?"none":"inline";window.c&&c.close();window.o&&o.stop();keyboard?f():I.oninput=null;I.value="";}
keyboard=0;
swap();
<span id="A"></span> Input:<br>
<input id="I">
<button id="S" onclick="g(I.value)">Run</button><br>
<button onclick="swap()">Swap</button>


Osilatör nesnesini aşağıdaki gibi withtüm örneklerini golf o._=>{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)))}
oynamak için bir ifadeye koyabilirsiniz

1
@darrylyeo Teşekkürler, withifadeyi uygular , ancak bu noktaya kadar tanımsız o.r||(o.start(),o.r=1)olan gerçeği kullandığımdan beri son biti ( ) bozar o.r, ancak şimdi rbildirilmediğinden beri hata veriyor . Bu değişkeni herhangi bir nesneden ayrı olarak tanımlamanın daha kısa olduğu ortaya çıktı, bu yüzden bunu yaptım.
Justin Mariner

'$' Sembolünü girdiğinizde çok yüksek bir frekans üretilir.
Кирилл Малышев

@ КириллМалышев İyi yakalama, bu neden .search()girdiye normal ifade olarak davranır. Olarak değiştirildi .indexOf().
Justin Mariner

1

AHK , 130 bayt

s=1!2"34$5`%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
Loop,Parse,1
SoundBeep,55*2**((InStr(s,A_LoopField,1)-10)/12),999

Seçenek 2'yi seçtim.

Açıklama:

Arama dizesini değişken olarak depolamak, sbu karmaşayı doğrudan SoundBeepişlevden kaçmaktan daha kısaydı . Değişken isimleri için bir kaçış karakteri çünkü yüzde işareti kaçmak zorunda kaldı ama dize geri kalanı olduğu gibi Tamam.

Varsayılan olarak, değişken 1ilk giriş parametresidir. Bir ayırıcı belirtmeden ayrıştırma döngüsüne beslenmesi, giriş dizesindeki her karakterin ayrı ayrı analiz edilmesine neden olur.

SoundBeep Hz cinsinden bir frekansı ve milisaniye cinsinden bir süreyi alır ve bu notayı uzun süre çalar.

Eğlenceli kısım doğru frekansları bulmaktı. Referans piyano anahtar frekans tablosu Wikipedia`dan ve aynı sayfada formülü I olan en kısa kodlayan bir kullanımı olarak bulundu 1 's frekansı 55 Hz yuvarlak güzel için referans notu olarak. C 1'den başlamak istediğimiz için , A 1'den (13. not) C 1'e (4. not) ayarlamamız gerekir. Bu, artı InStrtek endeksli olmasının nedeni, InStrfonksiyonun sonucundan 10 çıkarmamızdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.