ทำให้แป้นพิมพ์ของคุณเป็นแป้นพิมพ์


10

งาน

คุณควรเขียนโปรแกรมที่เมื่อกดปุ่มมันจะส่งเสียงที่แตกต่างกันออกไปสำหรับแต่ละปุ่ม

กุญแจที่คุณจะใช้คือ:

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

โน้ตเริ่มต้นที่Cและแต่ละปุ่มด้านบนจะเพิ่มเซมาโทนหนึ่งใบ

ช่วยทำให้ง่ายขึ้นสำหรับคุณเล็กน้อย คุณสามารถเลือกระหว่าง 2 งานที่คล้ายกัน

1) เอาท์พุทโน้ตที่แตกต่างกันเมื่อกดปุ่มที่ดำเนินการต่อไปจนกระทั่งกดปุ่มอื่น โปรแกรมนี้ทำงานอย่างไม่มีกำหนด

2) ใช้สตริงเป็นอินพุตที่มีอักขระด้านบนเท่านั้นที่จะส่งออกแต่ละบันทึกย่อเป็นเวลา 1 วินาที (อนุญาตการเปลี่ยนแปลง 0.05 วินาที)

อินพุต

  1. มีการกดคีย์
  2. สตริงเดี่ยวที่มีสัญลักษณ์ด้านบนเท่านั้น

เอาท์พุต

  1. โน้ตดนตรีเดียวที่ฟังจนกระทั่งกดปุ่มอื่น
  2. ชุดบันทึกย่อแต่ละอันมีความยาว 1 วินาที

หมายเหตุ

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

กฎระเบียบ

  • คุณอาจเลือกระหว่างงาน แต่โปรดบอกว่าคำตอบของคุณคืออะไร
  • คุณได้รับการเปลี่ยนแปลง± 0.05 วินาทีในงาน 2
  • แต่ละสัญลักษณ์พร้อมเสียงที่เพิ่มขึ้น 1 semitone
  • บันทึกย่อแต่ละรายการแสดงไว้ด้านบน
  • นี่คือสั้นที่สุดที่จะชนะ

สิ่งนี้นำมาจากที่นี่โดยได้รับความยินยอมจากcaird coinheringaahing


หากต้องการเปิดสิ่งนี้ขึ้นกับภาษาที่ไม่มีไลบรารีเสียงฉันขอแนะนำรูปแบบเอาต์พุตที่สาม: ไฟล์ WAV ที่มีเอาต์พุต 2 ตัวเลือกเขียนไปยัง stdout ที่จะช่วยให้รายการในภาษาใด ๆ ที่สามารถพิมพ์ข้อมูลไบนารี
เรย์

คำตอบ:


6

Python 3, 154 140 ไบต์

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

ฉันเลือกประเภทงานที่สอง

การวนซ้ำผ่านแต่ละอักขระและค้นหาดัชนีขององค์ประกอบนี้ในสตริง ดัชนีนี้คือจำนวนเซมิโคลอนที่เพิ่มขึ้นจาก Low C ('1') การคำนวณความถี่ที่ต้องการทำโดยสูตรนี้

PS ไลบรารีนี้ทำงานได้เฉพาะใน Windows

-13 ไบต์ขอบคุณ ovs

-1 ไบต์ขอบคุณ Jonathan Allan


1
คุณควรพูดถึงว่าใช้งานได้กับ Windows เท่านั้น
มนุษย์โดยรวม

1
เล่นกอล์ฟถึง 141 bytes:from winsound import* for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)
ovs

แต่คำถามที่ถามสำหรับโปรแกรมที่ ....
Neil A.

ความอดทนจะช่วยให้คุณใช้0.05 999
Jonathan Allan


3

JavaScript (ES6), 247 หรือ 230 ไบต์

ตัดสินใจที่จะลองใช้ตัวเลือกทั้งสอง

บันทึกสองสามไบต์ขอบคุณ @darrylyeo สำหรับการแนะนำwithข้อความ
ขอขอบคุณที่ @ .search()КириллМалышевสำหรับการชี้ให้เห็นปัญหากับ

ตัวเลือกที่ 1 - อินพุตคีย์บอร์ด252 246 247 ไบต์

_=>{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

อาศัยองค์ประกอบอินพุตที่ได้รับตัวอักษรที่พิมพ์จริงแทนที่จะเป็นรหัสอักขระ โฟกัสจะต้องอยู่บนกล่องอินพุต

ตัวเลือกที่ 2 - อินพุตสตริง234 229 230 ไบต์

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)}

ใช้สตริงเป็นพารามิเตอร์ฟังก์ชั่น

ตัวอย่างรวม

ฉันขอแนะนำให้ลดระดับเสียงของคุณที่กำลังทำงานอยู่มันอาจดัง เพื่อที่จะหยุดการเล่นข้อมูลโค้ดที่ต้องการเพิ่มo=ในแต่ละ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>


คุณสามารถใส่วัตถุ oscillator ในwithคำสั่งเพื่อออกทุกกรณีของ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)))}
darrylyeo

1
@Darrylyeo ขอบคุณจะใช้withคำสั่ง แต่จะแบ่งบิตสุดท้าย ( o.r||(o.start(),o.r=1)) เนื่องจากฉันใช้ความจริงที่o.rไม่ได้กำหนดจนถึงจุดนั้น แต่ตอนนี้มันผิดพลาดตั้งแต่rยังไม่ได้ประกาศ ปรากฎว่ามันสั้นกว่าเพียงแค่ประกาศตัวแปรนั้นแยกจากวัตถุใด ๆ ดังนั้นฉันก็ทำเช่นนั้น
Justin Mariner

เมื่อคุณป้อนสัญลักษณ์ '$' จะมีการสร้างความถี่สูงมาก
КириллМалышев

@ КириллМалышевจับได้ดีนั่นเป็นสาเหตุให้.search()ถือว่าอินพุตเป็น regex .indexOf()เปลี่ยนไป
Justin Mariner

1

AHK , 130 ไบต์

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

ฉันเลือกตัวเลือก 2

คำอธิบาย:

การจัดเก็บสตริงการค้นหาในขณะที่ตัวแปรsนั้นสั้นกว่าการหลีกเลี่ยงความยุ่งเหยิงนั้นในSoundBeepฟังก์ชั่นโดยตรง ฉันต้องหลีกเลี่ยงเครื่องหมายเปอร์เซ็นต์เนื่องจากเป็นอักขระเลี่ยงชื่อตัวแปร แต่สตริงส่วนที่เหลือก็โอเคเหมือนเดิม

โดยค่าเริ่มต้นตัวแปร1คือพารามิเตอร์อินพุตแรก การป้อนเข้าไปในลูปแยกวิเคราะห์โดยไม่ระบุตัวคั่นจะส่งผลให้อักขระแต่ละตัวในสตริงอินพุตถูกวิเคราะห์แยกกัน

SoundBeep ใช้ความถี่เป็นเฮิร์ตซ์และใช้เวลาเป็นมิลลิวินาทีและเล่นโน้ตนั้นนาน ๆ

ส่วนที่สนุกคือการหาความถี่ที่เหมาะสม การอ้างอิงตารางความถี่คีย์เปียโนจาก Wikipedia และสูตรในหน้าเดียวกันฉันพบว่าการเข้ารหัสที่สั้นที่สุดคือการใช้ A 1เป็นบันทึกอ้างอิงเนื่องจากความถี่เป็นรอบที่ดี 55 Hz เนื่องจากเราต้องการเริ่มต้นที่ C 1เราจึงต้องปรับจาก A 1 (หมายเหตุ 13) เป็น C 1 (หมายเหตุ 4) นั่นบวกกับความจริงที่InStrเป็นดัชนีหนึ่งนั่นคือสาเหตุที่เราลบ 10 จากผลลัพธ์ของInStrฟังก์ชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.