अपने कीबोर्ड को एक कीबोर्ड बनाएं


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

नियम

  • आप कार्यों के बीच चयन कर सकते हैं, लेकिन कृपया कहें कि आपके उत्तर में कौन सा है
  • आपको कार्य 2 में second 0.05 दूसरी भिन्नता दी गई है
  • प्रत्येक प्रतीक 1 सेमीिटोन द्वारा स्वर को बढ़ाता है।
  • अलग-अलग नोट ऊपर दिखाए गए हैं
  • यह एक इसलिए सबसे छोटा कोड जीतता है

यह मूल रूप से यहां से केर्ड सिक्कााहरिंग की सहमति से लिया गया था


यह उन भाषाओं को खोलने के लिए जिनके पास ऑडियो लाइब्रेरी नहीं है, मैं एक तीसरा आउटपुट प्रारूप सुझाता हूं: एक WAV फ़ाइल जिसमें विकल्प 2 आउटपुट होता है, जिसे stdout को लिखा जाता है। यह किसी भी भाषा में प्रविष्टियों की अनुमति देगा जो बाइनरी डेटा प्रिंट कर सकता है।
रे

जवाबों:


6

पायथन 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)

मैंने दूसरा टास्क टाइप चुना।

लूप प्रत्येक वर्ण से गुजरता है और स्ट्रिंग में इस तत्व के सूचकांक की तलाश करता है। यह सूचकांक लो सी ('1') से सेमीटोन की संख्या है। वांछित आवृत्ति की गणना इस सूत्र द्वारा की जाती है

PS यह लाइब्रेरी केवल विंडोज में काम करती है।

-13 बाइट्स ओव्स के लिए धन्यवाद।

-1 जोनाथन एलन को धन्यवाद।


1
आपको शायद यह उल्लेख करना चाहिए कि यह केवल विंडोज पर काम करता है।
21

1
141 बाइट्स के लिए गोल्फ: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सहिष्णुता आप उपयोग के लिए अनुमति चाहिए 999
जोनाथन एलन


3

जावास्क्रिप्ट (ईएस 6), 247 या 230 बाइट्स

दोनों विकल्पों को आज़माने का फैसला किया।

withबयान का सुझाव देने के लिए @darrylyeo को कुछ बाइट्स से बचा लिया ।
@ Кирилл Малышев के साथ एक मुद्दे को इंगित करने के लिए धन्यवाद .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>


आप इस तरह के 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घोषित नहीं होने के बाद से त्रुटिपूर्ण है। यह बताता है कि यह केवल उस चर को किसी भी ऑब्जेक्ट से अलग घोषित करने के लिए कम था, इसलिए मैंने ऐसा किया।
जस्टिन मेरिनर

जब आप प्रतीक '$' में प्रवेश करते हैं, तो बहुत उच्च आवृत्ति उत्पन्न होती है।
Кирилл Малышев

@ КириллМалышев अच्छा पकड़, कि कारण .search()regex के रूप में इनपुट व्यवहार करता है। पर स्विच किया गया .indexOf()
जस्टिन मेरिनर

1

एएचके , 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 हर्ट्ज में एक आवृत्ति और मिलीसेकंड में एक अवधि लेता है और उस लंबे समय तक उस नोट को खेलता है।

मज़ेदार हिस्सा सही आवृत्तियों का अनुमान लगा रहा था। विकिपीडिया से पियानो कुंजी आवृत्ति तालिका और उसी पृष्ठ पर सूत्र को संदर्भित करते हुए , मैंने पाया कि सबसे कम एन्कोडिंग को संदर्भ नोट के रूप में ए 1 का उपयोग करना था क्योंकि यह आवृत्ति 55 हर्ट्ज का अच्छा दौर है। चूंकि हम C 1 से शुरू करना चाहते हैं , इसलिए हमें A 1 (13 वां नोट) से C 1 (4 वां नोट) समायोजित करना होगा। यह, प्लस तथ्य यह InStrहै कि एक-अनुक्रमित है, इसलिए हम InStrफ़ंक्शन के परिणाम से 10 घटाते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.