म्यूजिकल ट्वीट चैलेंज


37

यह ट्विटर छवि एन्कोडिंग चुनौती का ऑडियो संस्करण है ।

एक ऑडियो संपीड़न प्रारूप डिज़ाइन करें जो 140 बाइट्स में कम से कम एक मिनट के संगीत का प्रतिनिधित्व कर सकता है या मुद्रण योग्य UTF-8-एन्कोडेड पाठ से कम हो सकता है।

एक कमांड-लाइन प्रोग्राम लिखकर इसे लागू करें जो निम्नलिखित 3 तर्क लेता है (कार्यक्रम के नाम के बाद):

  1. तार encodeया decode
  2. इनपुट फ़ाइल नाम।
  3. आउटपुट फ़ाइल नाम।

(यदि आपकी पसंदीदा प्रोग्रामिंग भाषा में कमांड-लाइन तर्कों का उपयोग करने की क्षमता का अभाव है, तो आप वैकल्पिक दृष्टिकोण का उपयोग कर सकते हैं, लेकिन आपको अपने उत्तर में स्पष्ट करना होगा।)

encodeआपरेशन अपनी चुनी ऑडियो प्रारूप से अपने संकुचित "ट्वीट" प्रारूप करने के लिए परिवर्तित कर देंगे, और decodeसंचालन अपने "ट्वीट" प्रारूप से मूल ऑडियो प्रारूप करने के लिए परिवर्तित कर देंगे। (बेशक, आपको हानिपूर्ण संपीड़न लागू करने की उम्मीद है, इसलिए आउटपुट फ़ाइल को इनपुट के समान नहीं होना चाहिए, बस उसी प्रारूप में।)

अपने उत्तर में शामिल करें:

  • आपके कार्यक्रम का स्रोत कोड, पूर्ण में। (यदि यह इस पृष्ठ के लिए बहुत लंबा है, तो आप इसे कहीं और होस्ट कर सकते हैं और इसके लिए एक लिंक पोस्ट कर सकते हैं।)
  • यह कैसे काम करता है इसका स्पष्टीकरण।
  • मूल ऑडियो फ़ाइल (लिंक) के साथ कम से कम एक उदाहरण, "ट्वीट" पाठ जो इसे संकुचित करता है, और ट्वीट को डिकोड करके प्राप्त ऑडियो फ़ाइल। (उत्तरदाता कॉपीराइट "निष्पक्ष उपयोग" के लिए जिम्मेदार है।)

नियम

  • मैं किसी भी समय प्रतियोगिता नियमों में किसी भी खामियों को बंद करने का अधिकार सुरक्षित रखता हूं।
  • [संपादित २४ अप्रैल] आपके encodeफ़ंक्शन के इनपुट के लिए (और आपके फ़ंक्शन का आउटपुट decode), आप किसी भी उचित, सामान्य ऑडियो प्रारूप का उपयोग कर सकते हैं, चाहे वह हो:
    • WAV की तरह असम्पीडित तरंग।
    • संपीडित तरंग, जैसे MP3।
    • मिडी की तरह "शीट संगीत" शैली।
  • आपका संपीड़ित "ट्वीट" प्रारूप वास्तव में इनपुट फ़ाइल में ध्वनियों को एनकोड करना होगा। तो, निम्न प्रकार के आउटपुट की गणना नहीं होती है:
    • एक URI या फ़ाइल पथ वह स्थान देता है जहाँ वास्तविक आउटपुट संग्रहीत होता है।
    • डेटाबेस तालिका की एक कुंजी जहां वास्तविक आउटपुट को बूँद के रूप में संग्रहीत किया जाता है।
    • कुछ भी समान।
  • आपका प्रोग्राम जेनेरिक संगीत फ़ाइलों को संपीड़ित करने के लिए डिज़ाइन किया जाना चाहिए , इसलिए ऐसा सामान न करें जो आपके विशिष्ट उदाहरण गीत से बहुत स्पष्ट रूप से बंधा हो। उदाहरण के लिए, यदि आप "ट्विंकल, ट्विंकल, लिटिल स्टार" का प्रदर्शन कर रहे हैं, तो आपकी संपीड़न दिनचर्या को अनुक्रम-डो-सो-ला-ला-सो के लिए एक विशिष्ट प्रतीक को हार्ड-कोड नहीं करना चाहिए।
  • आपके कार्यक्रम का आउटपुट वास्तव में ट्विटर के माध्यम से जाने और अनसुना करने में सक्षम होना चाहिए। मेरे पास सटीक वर्णों की सूची नहीं है जो समर्थित हैं, लेकिन अक्षरों, अंकों, प्रतीकों और विराम चिह्न से चिपके रहने की कोशिश करते हैं; और नियंत्रण वर्ण, संयोजन वर्ण, BIDI मार्कर, या उस जैसे अन्य अजीब सामान से बचें।
  • आप एक से अधिक प्रविष्टि जमा कर सकते हैं।

मानदंड तय करना

यह एक लोकप्रियता प्रतियोगिता है (यानी, सबसे अधिक शुद्ध जीत हासिल करता है), लेकिन मतदाताओं से निम्नलिखित पर विचार करने का आग्रह किया जाता है:

शुद्धता

  • क्या आप संपीड़ित होने के बाद भी गीत को पहचान सकते हैं?
  • क्या यह अच्छा लगता है?
  • क्या आप अभी भी पहचान सकते हैं कि कौन से उपकरण बजाए जा रहे हैं?
  • क्या आप अब भी बोल को पहचान सकते हैं? (यह शायद असंभव है, लेकिन यह प्रभावशाली होगा यदि कोई इसे पूरा करे।)

जटिलता

उदाहरण गीत की पसंद यहां मायने रखती है।

  • [24 अप्रैल को जोड़ा गया] यह चुनौती मिडी या इसी तरह के प्रारूपों के साथ आसान होगी। हालांकि, यदि आप इसे तरंग-प्रकार के स्वरूपों के साथ काम करने के लिए अतिरिक्त प्रयास करते हैं, तो यह अतिरिक्त क्रेडिट के योग्य है।
  • संरचना क्या है? निश्चित रूप से, आप एक ही आवश्यकता को पूरा कर सकते हैं बस एक ही 4 उपायों को दोहराते हुए एक मनमाना संख्या। लेकिन अधिक जटिल गीत संरचनाएं अधिक बिंदुओं के लायक हैं।
  • क्या प्रारूप एक समय में खेले जा रहे बहुत सारे नोटों को संभाल सकता है?

कोड

  • इसे जितना संभव हो छोटा और सरल रखें। हालांकि, यह एक कोड गोल्फ नहीं है, इसलिए वर्ण गणना से अधिक पठनीयता मायने रखती है।
  • चालाक, जटिल एल्गोरिदम भी ठीक हैं, जब तक कि वे परिणामों की गुणवत्ता में सुधार के द्वारा उचित हैं।

9
मिडी बनाम WAV का उपयोग करना एक बहुत अलग चुनौती है। मुझे लगता है कि आपको प्रारूपों को केवल WAV तक सीमित रखना चाहिए।
grovesNL

10
मैं किसी भी समाधान को देखने के लिए उत्सुक हूं, लेकिन ईमानदार होने के लिए: 140 बाइट्स में 60 के दशक की ध्वनि को पैक करने का मतलब है कि आपके पास प्रति सेकंड 19 से कम बिट्स हैं। कुछ अति कुशल भाषण एनकोडर हैं, जो 300 बीपीएस पर काम करते हैं, लेकिन ये केवल संश्लिष्ट भाषण के उत्पादन के उद्देश्य से संश्लेषित स्वरों को डिकोड करने में सक्षम हैं और किसी भी तरह से संगीत को एनकोड करने में सक्षम नहीं हैं।
जर्बंजो

2
आप संपीड़न कारकों के साथ सॉफ्टवेयर के लिए पूछ रहे हैं कला की वर्तमान स्थिति से अधिक परिमाण के कई आदेश। आप समझदार जवाब चाहते हैं (यानी, की तरह रचनाओं को शामिल नहीं 4'33 " या एक बहरे मनुष्य के दफ़न के लिए अंतिम संस्कार मार्च ), मैं 1 सेकंड के लिए समय बाधा ड्रॉप करने की सलाह देते हैं।
उतरी ossifrage

3
@squeamishossifrage उन्होंने कहा कि यह पहचानने योग्य नहीं था, हालांकि।
cjfaure

5
चैट (और अगले दिन) पर एक तर्क है कि क्या आप वास्तव में 140 बाइट्स या एक ट्वीट-आकार के 140 वर्णों का मतलब है ।
पीटर टेलर

जवाबों:


26

स्काला

ज़रूर, MIDI फ़ाइलों को एनकोड करना आसान होगा, लेकिन मिडी फ़ाइलों का एक गुच्छा किसके पास पड़ा है? यह 1997 नहीं है!

पहली चीजें पहले: मैंने "यूनिकोड बाइट" की व्याख्या "यूनिकोड चार" के रूप में करने और CJK वीडियो का उपयोग करने का निर्णय लिया है, क्योंकि:

  • यह इमेज चैलेंज से मेल खाता है
  • ट्विटर इससे ठंडा है
  • मुझे वास्तव में उन बिट्स की जरूरत है

स्रोतों से एन्ट्रापी की हर आखिरी बूंद को निचोड़ने के लिए मैं कुछ तरकीबें इस्तेमाल करता हूं:

सबसे पहले, संगीत नोट्स के साथ बनाया जाता है। इसके अलावा, हम आम तौर पर एक ही नोट को एक अलग ऑक्टेव में एक ही नोट के रूप में मानते हैं (यही कारण है कि एक 12-स्ट्रिंग गिटार सही लगता है), इसलिए हमारे पास एन्कोड करने के लिए केवल 12 संभावनाएं हैं। (जब मैं बी का उत्पादन करता हूं, उदाहरण के लिए, मैं वास्तव में एक कॉर्ड का उत्पादन करता हूं, जिसमें सभी ऑक्टेव्स में केवल बी शामिल है, 12-स्ट्रिंग गिटार की तरह थोड़ा सा)।

इसके बाद, मुझे हाई-स्कूल म्यूज़िक क्लास से याद आया कि अधिकांश नोट संक्रमण छोटे (एक नोट के ऊपर या नीचे) होते हैं। कूदना कम आम हैं। यह हमें बताता है कि नोटों की तुलना में जंप साइज़ में शायद कम एन्ट्रॉपी है।

इसलिए, हमारा दृष्टिकोण हमारे स्रोत को कई ब्लॉकों में तोड़ना है - मुझे 14 ब्लॉक प्रति सेकंड अच्छी तरह से (साइड नोट) मिला, मैंने हमेशा सोचा कि क्यों ऑडियो को 44100 हर्ट्ज पर एन्कोड किया गया था। यह पता चलता है कि 44100 में बहुत सारे कारक हैं। इसलिए मैं प्रति सेकंड 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 15, 18, 20, 21, 25, 28 या 30 ब्लॉक चुन सकता था और यह सफाई से विभाजित हो जाता था )। हम तब इन ब्लॉकों को FFT करते हैं (अच्छी तरह से, तकनीकी रूप से तेजी से नहीं, जैसा कि मैंने जिस लाइब्रेरी का उपयोग किया है वह गैर-पावर ऑफ़-टू ब्लॉक के लिए तेज़ नहीं है। और तकनीकी रूप से मैंने हार्टले ट्रांसफ़ॉर्म का उपयोग किया है , न कि फूरियर का)।

फिर हम उस नोट को ढूंढते हैं जो सबसे ऊंचा लगता है (मैंने उच्च और निम्न कट-ऑफ के साथ ए-वेटिंग का इस्तेमाल किया , ज्यादातर क्योंकि यह लागू करना सबसे आसान है), और या तो इस नोट को एनकोड करें, या साइलेंस (साइलेंस डिटेक्शन एसएनआर - कम एसएनआर पर आधारित है) मौन है)।

फिर हम अपने एन्कोड किए गए नोट्स को जंप में बदल देते हैं, और उन्हें एक अनुकूली अंकगणित कोडर को खिलाते हैं। पाठ में अनुवाद के लिए प्रक्रिया छवि संपीड़न प्रश्न के समान है (लेकिन इसमें BigInteger के कुछ अपमानजनक उपयोग शामिल हैं)।

अब तक, इतना अच्छा, लेकिन क्या होगा अगर नमूना बहुत अधिक एन्ट्रापी है? कुछ को हटाने के लिए हम एक क्रूड साइकोएक्वास्टिक मॉडल का उपयोग करते हैं। सबसे कम एन्ट्रापी कूद "कोई परिवर्तन नहीं" है, इसलिए हम अपने FFT डेटा को उन ब्लॉकों को खोजने की कोशिश करते हैं जहां श्रोता शायद यह नहीं देख पाएंगे कि क्या हम पिछले नोट को खेलते रहेंगे, उन ब्लॉक की तलाश में जहां पिछले ब्लॉक से नोट निकलता है। लगभग सबसे ऊंचे स्वर के रूप में जोर से (जहां "लगभग" गुणवत्ता पैरामीटर द्वारा नियंत्रित किया जाता है)।

इसलिए, हमें 140 अक्षरों का लक्ष्य मिला है। हम गुणवत्ता 1.0 (अधिकतम गुणवत्ता) पर एन्कोडिंग द्वारा शुरू करते हैं, और देखते हैं कि कितने वर्ण हैं। यदि यह बहुत अधिक है, तो हम ०. ९ ५ पर जाते हैं और दोहराते हैं, जब तक कि हमें १४० अक्षर नहीं मिलते (या हम गुणवत्ता ०.०५ के बाद छोड़ देते हैं)। यह एनकोडर को n <= 20 के लिए एन-पास एनकोडर बनाता है (हालाँकि यह अन्य क्षेत्रों में बड़े पैमाने पर अक्षम है, इसलिए m'eh)।

एनकोडर / डिकोडर s16be मोनो प्रारूप में ऑडियो की अपेक्षा करता है। इस के रूप में avconv का उपयोग कर प्राप्त किया जा सकता है:

#decoding ogg to s16be, and keeping only the first 60s
avconv -i input.ogg -ac 1 -ar 44100 -f s16be -t 60s input.raw
#encoding s16be to mp3
avconv -f s16be -ac 1 -ar 44100 -i output.raw output.mp3

एनकोडर चलाने के लिए:

sbt "run-main com.stackexchange.codegolf.twelvestring.TwelveString encode input.raw encoded.txt"
sbt "run-main com.stackexchange.codegolf.twelvestring.TwelveString decode encoded.txt output.raw"

Https://github.com/jamespic/twelvestring पर पूरा कोड ।

ध्यान देने योग्य बात: आपको नायकी की अंकगणित कोडिंग लाइब्रेरी की आवश्यकता होगी, जिसमें वर्तमान में मावेन कलाकृतियाँ उपलब्ध नहीं हैं। इसके बजाय, आपको डेवलपर के कांटे को स्थानीय रूप से बनाने और स्थापित करने की आवश्यकता होगी ।

और यहाँ कुछ नमूने हैं। वे भयानक लग रहे हैं, लेकिन बस पहचानने के बारे में:

  • बीथोवेन की 5 वीं: मूल , एन्कोडेड -:::::::::::::::::::::::::::姑椻趕挍呪白鸞盙宠埘謭擆闯脲誜忘椐笸囃庣稨俖咛脔湙弻籚砌鍖裏橈镙訁鹻塿骱踠筟七趇杅峇敖窈裞瘫峦咰呹櫬茏蛏姆臸胝婁遼憀麁黦掏毈喙眝綄鴀耢椚筤菮蟞斗俼湛营筬禴籙嬧窻丄
  • फर एलिस: मूल , एन्कोडेड -,,,,,,,,,,,,,,,,,,,,,,,,,,苯劺誺軩忇穤锳婁伉巠桭晘酉筟緵俅怚尵鎽蜓崁飿嘔但鈐謽酝屮呤誥俊覊鶮龔癸埙煂臙牎繬肜摲炚雗頨款驦燈菩凧咁楾媡夥俰欓焵韀冊嗥燠鱧駟髉
  • ट्विंकल ट्विंकल लिटिल स्टार: मूल , एन्कोडेड - - 欠Star Star Star Star Star Star Star Star Star Star Star Star Star Star Star Star
  • एक मजेदार चिपट्यून : मूल , इनकोडिंग - : 諥::::::::::::::::::::::::::::::::灼攲陇亄鹘琾業纟鵼牤棌匩碆踬葫鶙懲欃铳樯柇鋡疡衻澯伅墇搢囻荸香貱夹咽蟽籐屈锂蛉袒貊屨鈦夜镤沄鍡唦魮骬乔蚖醶矕咻喸碋利褼裊匎嶮窢幘六沧鼝瞮坡葍帷锆邵旻符琨鱴郤栱烇仾椃騋荄嘵統篏珆罽

अद्यतन करें

मैंने कोड में मौन दहलीज को फिर से जोड़ा, और फिर से एनकोड किया। एन्कोडिंग तदनुसार अद्यतन किए गए हैं। इसके अलावा, मैंने एक और गीत जोड़ा (तकनीकी रूप से खुला स्रोत नहीं है, लेकिन मुझे संदेह है कि मूल कॉपीराइट धारक को लगेगा कि उनका आईपी खतरे में है), बस इसके लिए:

  • इंपीरियल मार्च: मूल , एन्कोडेड - , 湠,,,,,,,,,,,,,,,,,,,,,,,,, Imper Imper唂焰銯艉鶱縩巻痭虊窻熲紆耺哅淙苉嘏庸锺禒旇蘄籷遪刨繱蕖嬯摺祑仰軈牰杊瘷棏郖弘卄浕眮騜阖鏴鶺艂税寛柭菸採偋隆兎豅蚦紛襈洋折踜跅軩树爺奘庄玫亳攩獼匑仡葾昐炡瞱咏斎煟价藭恐鷖璌榍脅樐嬨勀茌愋

अधिक अद्यतन

मैंने एनकोडर को थोड़ा छोटा किया है, और इसका गुणवत्ता पर आश्चर्यजनक प्रभाव पड़ा है (मैं भूल गया कि DHT में, आउट-ऑफ-फेज़ सिग्नल प्रभावी रूप से नकारात्मक हैं, इसलिए मैं आउट-ऑफ़-फ़ेज़ सिग्नल की उपेक्षा कर रहा था)।

कोड के एक पुराने संस्करण ने इन आउट-द-फ़ेज़ सिग्नलों में से केवल बड़ा लिया, लेकिन अब हम RMS लेते हैं। इसके अलावा, मैंने एनकोडर (तुके, अल्फा 0.3) में एक काफी रूढ़िवादी विंडो फ़ंक्शन जोड़ा, जिससे कि कलाकृतियों का मुकाबला करने का प्रयास किया जा सके।

हर चीज अपने हिसाब से अपडेट होती है।


1
मैं ट्विंकल ट्विंकल और चिपटून नहीं खेल सकता। फर एलिस काफी करीब है, जबकि बीथोवेन मुश्किल से पहचानने योग्य है, हाहा।
13

क्या आप ट्विंकल ट्विंकल और चिपटन को फिर से आजमाना चाहते हैं? मुझे लगता है कि मैंने URL तय कर लिए हैं।
जेम्स_पिक

1
यह अब काम करता है। ट्विंकल ट्विंकल काफी डीसेंट हैं। लेकिन आखिर हो क्या रहा है?
१४:०४ पर

हाँ, मुझे पूरी तरह से यकीन नहीं है कि अंत में क्या हो रहा है। मुझे संदेह है कि यह अंकगणित कोडिंग में कहीं हो रहा है। कोड के एक पुराने संस्करण में, स्ट्रीम को EOF प्रतीक द्वारा समाप्त कर दिया गया था, लेकिन कुछ मामलों में डिकोडर EOF प्रतीक को पढ़ने में विफल रहा था। मुझे संदेह है कि मैंने BitOutputStream को सही ढंग से बंद नहीं किया है, लेकिन मैं इस पर गौर करूंगा।
जेम्स_पिक

1
हां, वास्तव में ऐसा ही था। एक BitOutputStream::closeविधि थी जिसे मैं कॉल करना भूल गया। मैं कोड ठीक करूंगा और आउटपुट अपडेट करूंगा।
जेम्स_पिक

11

अजगर

मैं UTF-8 के संबंध में कोई विशेष प्रबंध नहीं करता, इसलिए मेरा प्रस्तुतिकरण 140 बाइट्स की आवश्यकता को पार करता है। मैं अपने समाधान की उपयोगिता, सटीकता या दक्षता के बारे में कोई दावा नहीं करता।

मैंने इनपुट और आउटपुट के लिए 44100 हर्ट्ज की एक नमूना दर का उपयोग किया। SAMPLES_PER_BYTE रूपांतरण की गुणवत्ता को नियंत्रित करता है। संख्या जितनी कम होगी, ध्वनि की गुणवत्ता उतनी ही बेहतर होगी। मेरे द्वारा उपयोग किए गए मान परिणाम अनुभाग में दिए गए हैं।

प्रयोग

सांकेतिक शब्दों में बदलना

इनपुट फ़ाइल एक लहराती होनी चाहिए। यह केवल पहले चैनल को एनकोड करता है।

twusic.py -e [input file] > output.b64

व्याख्या करना

twusic.py -d [input file] > output.raw

डिकोडेड म्यूजिक बजा

aplay -f U8 --rate=[rate of input file] output.raw

कोड

#!/usr/bin/env python
SAMPLES_PER_BYTE = 25450

from math import sin, pi, log
from decimal import Decimal

PI_2 = Decimal(2) * Decimal(pi)

FIXED_NOTE = Decimal('220') # A
A = Decimal('2') ** (Decimal('1') / Decimal('12'))
A_LN = A.ln()

def freq(note):
    return FIXED_NOTE * (A ** Decimal(note))

def note(freq):
    return (Decimal(freq) / FIXED_NOTE).ln() / A_LN

VOLUME_MAX = Decimal('8')
def volume(level):
    return Decimal('127') * (Decimal(level+1).ln() / VOLUME_MAX.ln())

def antivolume(level):
    x = Decimal(level) / Decimal('127')
    y = VOLUME_MAX ** x
    return y - 1

NOTES = [freq(step) for step in xrange(-16, 16)]
VOLUMES = [volume(level) for level in xrange(0, VOLUME_MAX)]


def play(stream, data):
    t = 0
    for x in data:
        x = ord(x)
        w = PI_2 * NOTES[(x&0xf8) >> 3] / Decimal(16000)
        a = float(VOLUMES[x&0x07])
        for _ in xrange(0, SAMPLES_PER_BYTE):
            stream.write(chr(int(128+(a*sin(w*t)))))
            t += 1

NOTE_MAP = {'A': 0b00000000,
    'g': 0b00001000,
    'G': 0b00010000,
    'f': 0b00011000,
    'F': 0b00100000,
    'E': 0b00101000,
    'd': 0b00110000,
    'D': 0b00111000,
    'c': 0b01000000,
    'C': 0b01001000,
    'B': 0b01010000,
    'a': 0b01011000}

def convert(notes, volume):
    result = []
    for n in notes:
        if n == ' ':
            result += '\00'
        else:
            result += chr(NOTE_MAP[n] | (volume & 0x07)) * 2
    return ''.join(result)

TWINKLE = convert('C C G G A A GG' +
                    'F F E E D D CC' +
                    'G G F F E E DD' +
                    'G G F F E E DD' +
                    'C C G G A A GG' +
                    'F F E E D D CC', 0x7)

if __name__ == '__main__':
    from base64 import b64encode, b64decode
    import numpy as np
    from numpy.fft import fft, fftfreq
    import wave
    import sys

    if len(sys.argv) != 3:
        print 'must specify -e or -d plus a filename'
        sys.exit(1)

    if sys.argv[1] == '-e':
        w = wave.open(sys.argv[2], 'rb')

        try:
            output = []
            (n_channels, sampwidth, framerate, n_frames, comptype, compname) = w.getparams()
            dtype = '<i' + str(sampwidth)

            # Find max amplitude
            frames = np.abs(np.frombuffer(w.readframes(n_frames), dtype=dtype)[::n_channels])
            max_amp = np.percentile(frames, 85)

            w.rewind()

            read = 0
            while read < n_frames:
                to_read = min(n_frames-read, SAMPLES_PER_BYTE)
                raw_frames = w.readframes(to_read)
                read += to_read

                frames = np.frombuffer(raw_frames, dtype=dtype)[::n_channels]
                absolute = np.abs(frames)
                amp = np.mean(absolute)

                amp = int(round(antivolume(min((amp / max_amp) * 127, 127))))

                result = fft(frames)
                freqs = fftfreq(len(frames))

                while True:
                    idx = np.argmax(np.abs(result)**2)
                    freq = freqs[idx]
                    hz = abs(freq * framerate)
                    if hz > 0:
                        break
                    result = np.delete(result, idx)
                    if len(result) <= 0:
                        hz = 220
                        amp = 0
                        break

                n = int(round(note(hz)))
                n &= 0x1F
                n <<= 3
                n |= amp & 0x07
                output.append(chr(n))
        finally:
            w.close()
        print b64encode(''.join(output)).rstrip('=')
    else:
        with open(sys.argv[2], 'rb') as f:
            data = f.read()
        data = data + '=' * (4-len(data)%4)
        play(sys.stdout, b64decode(data))

इनपुट्स

मेरी आधिकारिक प्रस्तुति केविन मैकलियोड द्वारा पिओनोफोर्ट और बीटबॉक्स के लिए इंप्रोमेप्टू है । इस फ़ाइल के लिए मैंने 25450 का SAMPLES_PER_BYTE का उपयोग किया।

मैंने 10200 के SAMPLES_PER_BYTE के साथ ट्विंकल, ट्विंकल, लिटिल स्टार को एन्कोडिंग की स्वतंत्रता भी ले ली । यह बहुत बेहतर लगता है।

उत्पादन

Pianoforte और Beatbox के लिए Impromptu

aWnxQDg4mWqZWVl6W+LyOThfHOPyQThAe4x5XCqJK1EJ8Rh6jXt5XEMpk1Epe5JqTJJDSisrkkNCSqnSkkJDkiorCZHhCxsq8nlakfEp8vNb8iqLysp6MpJ7s4x7XlxdW4qKMinJKho

संपर्क

ट्विंकल ट्विंकल लिटल स्टार

HBobGlJSUlJSY2FlYVNRUVFCQkJCQjs5PDksKisqGxoZGVFTUVNRREFDQjs6OjoqKykpKVRRVFJDQkJCOjs6OzksKikpGxobG1JSUlNRZWFlYVNSUVFCQkJDQTw5PDorKisqGhsZGRk

संपर्क

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