বাদ্যযন্ত্র টুইট চ্যালেঞ্জ


37

এটি টুইটার ইমেজ এনকোডিং চ্যালেঞ্জের অডিও সংস্করণ ।

একটি অডিও সংকোচনের ফর্ম্যাট ডিজাইন করুন যা কমপক্ষে এক মিনিটের সংগীতকে 140 বাইট বা তার চেয়ে কম মুদ্রণযোগ্য ইউটিএফ-8-এনকোডযুক্ত পাঠের প্রতিনিধিত্ব করতে পারে Design

কমান্ড-লাইন প্রোগ্রাম লিখে এটি প্রয়োগ করুন যা নিম্নলিখিত 3 টি আর্গুমেন্ট গ্রহণ করে (প্রোগ্রামটির নাম অনুসারে):

  1. স্ট্রিং encodeবা decode
  2. ইনপুট ফাইলের নাম।
  3. আউটপুট ফাইলের নাম।

(আপনার পছন্দের প্রোগ্রামিং ভাষার যদি কমান্ড-লাইন আর্গুমেন্টগুলি ব্যবহার করার ক্ষমতা না থাকে তবে আপনি একটি বিকল্প পদ্ধতি ব্যবহার করতে পারেন, তবে অবশ্যই আপনার উত্তরে এটি ব্যাখ্যা করতে হবে))

encodeঅপারেশন আপনার নির্বাচিত অডিও ফরম্যাট থেকে আপনার সংকুচিত "কিচ্কিচ্" ফরম্যাট রূপান্তর করা হবে, এবং decodeঅপারেশন আপনার "কিচ্কিচ্" ফরম্যাট থেকে মূল অডিও ফরম্যাট রূপান্তরিত করবে। (অবশ্যই, আপনি ক্ষতিকারক সংকোচনের বাস্তবায়ন প্রত্যাশা করেছেন, সুতরাং আউটপুট ফাইলটি কেবল একই ফর্ম্যাটে ইনপুটটির মতো হবে না need)

আপনার উত্তরে অন্তর্ভুক্ত করুন:

  • আপনার প্রোগ্রামের উত্স কোডটি সম্পূর্ণ। (যদি এই পৃষ্ঠার জন্য এটি খুব দীর্ঘ হয় তবে আপনি এটিকে অন্য কোথাও হোস্ট করতে এবং এটির একটি লিঙ্ক পোস্ট করতে পারেন))
  • এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা।
  • কমপক্ষে একটি উদাহরণ, মূল অডিও ফাইল (গুলি) এর লিঙ্ক সহ, "টুইট" পাঠ্যটি এতে সংকুচিত হয় এবং টুইটটি ডিকোড করে অডিও ফাইল পাওয়া যায়। (উত্তরদাতা কপিরাইট "ন্যায্য ব্যবহার" প্রতিশ্রুতি জন্য দায়ী।)

বিধি

  • প্রতিযোগিতার নিয়মের যে কোনও সময়ে যে কোনও ফাঁকগুলি বন্ধ করার অধিকার আমি সংরক্ষণ করি।
  • [২৪ শে এপ্রিল সম্পাদিত] আপনার encodeফাংশনের ইনপুট (এবং আপনার decodeফাংশনের আউটপুট ) এর জন্য, আপনি যে কোনও যুক্তিসঙ্গত, সাধারণ অডিও ফর্ম্যাটটি ব্যবহার করতে পারেন, তা তা হ'ল:
    • WAV এর মতো সঙ্কুচিত তরঙ্গরূপ।
    • এমপি 3 এর মতো সংকুচিত তরঙ্গাকার।
    • মিডি'র মতো "শীট সংগীত" স্টাইল।
  • আপনার সঙ্কুচিত "টুইট" ফর্ম্যাটটি অবশ্যই ইনপুট ফাইলের শব্দগুলিকে এনকোড করতে হবে। সুতরাং, নিম্নলিখিত ধরণের আউটপুট গণনা করে না :
    • একটি ইউআরআই বা ফাইলের পথ যেখানে আসল আউটপুট সংরক্ষণ করা হয় সেই অবস্থানটি দেয়।
    • একটি ডাটাবেস টেবিলের একটি কী যেখানে আসল আউটপুট একটি ব্লব হিসাবে সঞ্চিত থাকে।
    • অনুরূপ কিছু।
  • আপনার প্রোগ্রামটি অবশ্যই জেনেরিক মিউজিক ফাইলগুলি সংকুচিত করার জন্য তৈরি করা উচিত , সুতরাং আপনার নির্দিষ্ট উদাহরণের গানে খুব স্পষ্টভাবে আবদ্ধ এমন জিনিসগুলি করবেন না। উদাহরণস্বরূপ, যদি আপনি "টুইঙ্কল, টুইঙ্কল, লিটল স্টার" প্রদর্শন করে থাকেন তবে আপনার সংক্ষেপণ রুটিনটি ডু-ডু-তাই-লা-লা-সিকোয়েন্সের জন্য নির্দিষ্ট চিহ্নকে হার্ড-কোড করা উচিত নয়।
  • আপনার প্রোগ্রামের আউটপুটটি আসলে টুইটারের মধ্য দিয়ে যেতে এবং অনাবৃত থাকা থেকে বেরিয়ে আসতে সক্ষম হওয়া উচিত। সমর্থিত নির্ভুল অক্ষরের একটি তালিকা আমার কাছে নেই, তবে অক্ষর, অঙ্ক, চিহ্ন এবং বিরামচিহ্নগুলিকে আঁকড়ে রাখার চেষ্টা করুন; এবং নিয়ন্ত্রণের অক্ষরগুলি, অক্ষরগুলি, বিডিআই মার্কারগুলি, বা এর মতো অন্যান্য অদ্ভুত জিনিসগুলি একত্রিত করে এড়িয়ে চলুন।
  • আপনি একাধিক এন্ট্রি জমা দিতে পারেন।

বিচারের মানদণ্ড

এটি একটি জনপ্রিয়তা প্রতিযোগিতা (অর্থাত্, বেশিরভাগ নেট আপভেস্টস জিত), তবে ভোটারদের নিম্নলিখিত বিষয়গুলি বিবেচনা করার জন্য অনুরোধ করা হয়েছে:

সঠিকতা

  • গানটি সংকুচিত হওয়ার পরেও আপনি কি চিনতে পারবেন?
  • ভাল লাগছে?
  • আপনি কি এখনও সনাক্ত করতে পারবেন কোন যন্ত্রগুলি বাজানো হচ্ছে?
  • আপনি এখনও লিরিক চিনতে পারেন? (এটি সম্ভবত অসম্ভব, তবে কেউ যদি এটি সম্পাদন করে তবে তা চিত্তাকর্ষক হবে))

জটিলতা

উদাহরণ গানের পছন্দটি এখানে গুরুত্বপূর্ণ।

  • [২৪ শে এপ্রিল যোগ করা হয়েছে] এমআইডিআই বা অনুরূপ ফর্ম্যাটগুলির সাথে এই চ্যালেঞ্জটি সহজতম হবে। তবে আপনি যদি ওয়েভফর্ম-টাইপ ফর্ম্যাটগুলির সাথে এটি কাজ করার জন্য অতিরিক্ত প্রচেষ্টা করেন তবে এটি অতিরিক্ত creditণের দাবিদার।
  • কাঠামো কি? অবশ্যই, আপনি একই 4 টি স্বতঃস্ফূর্ত সংখ্যার বার বার করে এক মিনিটের প্রয়োজনীয়তা পূরণ করতে পারেন। তবে আরও জটিল গানের কাঠামো আরও বেশি পয়েন্টের দাবি রাখে।
  • ফর্ম্যাটটি একবারে প্রচুর নোট প্লে হতে পারে?

কোড

  • এটি যতটা সম্ভব সংক্ষিপ্ত এবং সহজ রাখুন। তবে এটি কোনও কোড গল্ফ নয়, তাই পাঠযোগ্যতা চরিত্রের গণনার চেয়ে বেশি গুরুত্বপূর্ণ।
  • চালাক, জটিল অ্যালগরিদমগুলি ঠিক আছে, যতক্ষণ না তারা ফলাফলের উন্নত মানের দ্বারা ন্যায়সঙ্গত হয়।

9
মিডি বনাম ডাব্লুএইভি ব্যবহার করা একেবারে আলাদা চ্যালেঞ্জ। আমি মনে করি আপনার কেবলমাত্র WAV- এ ফর্ম্যাটগুলি সীমাবদ্ধ করা উচিত।
গ্রোভসএনএল

10
আমি কোনও সমাধান দেখতে আগ্রহী, তবে সত্যি বলতে: 140 বাইটে 60s শব্দটি প্যাকিং করার অর্থ হল যে আপনার কাছে প্রতি সেকেন্ডে 19 বিটের চেয়ে কম উপলব্ধ। কয়েকটি অতি দক্ষ স্পিচ এনকোডার রয়েছে, যা 300 বিপিএস-এ পরিচালিত হয়, তবে এগুলি কেবল বোধগম্য বক্তৃতা তৈরির লক্ষ্যে সংশ্লেষিত ফোনমেজে ডিকোড করতে সক্ষম এবং কোনওভাবেই সংগীতকে এনকোড করতে সক্ষম নয়।
jarnbjo

2
আপনি কম্প্রেশন ফ্যাক্টর সহ সফ্টওয়্যারটি জিজ্ঞাসা করছেন শিল্পের বর্তমান অবস্থার চেয়ে অনেকগুলি আকারের অর্ডার। আপনি যুক্তিসম্মত উত্তর চান (অর্থাত, মত কম্পোজিশনের জড়িত না 4'33 " বা একটি বধির ম্যান শবসত্কার জন্য ফিউনারেল মার্চ ), আমি 1 দ্বিতীয় সময় বাধ্যতা ড্রপ করার জন্য উত্সাহিত করি চাই।
খুঁতখুঁতে ossifrage

3
@ স্কোয়ামিশোসিফ্রেজ তিনি বলেননি যদিও এটি স্বীকৃতিজনক শোনার দরকার ছিল।
সিজেফুরে

5
আপনার আসলে 140 বাইট বা একটি টুইট আকারের 140 টি অক্ষর আছে কিনা তা নিয়ে চ্যাটের (এবং পরের দিন) একটি যুক্তি রয়েছে
পিটার টেলর

উত্তর:


26

scala

অবশ্যই, এমআইডিআই ফাইলগুলি এনকোড করা সহজ হতে পারে তবে মিডি ফাইলগুলির একগুচ্ছ কে পেয়েছে? এটা 1997 নয়!

প্রথম জিনিস: আমি একটি "ইউনিকোড বাইট" কে "ইউনিকোড চর" হিসাবে ব্যাখ্যা করার এবং সিজেকে অক্ষর ব্যবহার করার সিদ্ধান্ত নিয়েছি, কারণ:

  • এটি চিত্রের চ্যালেঞ্জের সাথে মেলে
  • এটি দিয়ে টুইটারটি দুর্দান্ত
  • আমার আসলেই এই বিটগুলি দরকার need

উত্স থেকে এনট্রপির প্রতিটি শেষ ফোঁটা গ্রাস করতে আমি কয়েকটি কৌশল ব্যবহার করি:

প্রথমত, নোট দিয়ে সংগীত তৈরি করা হয়। তদুপরি, আমরা সাধারণত একই নোটকে একই ভিন্ন নোট হিসাবে একই আলাদা নোট হিসাবে বিবেচনা করি (যে কারণে 12-স্ট্রিং গিটারটি সঠিক শোনাচ্ছে), তাই আমাদের কাছে এনকোড করার 12 টি সম্ভাবনা রয়েছে। (আমি যখন বি বি আউটপুট করি, উদাহরণস্বরূপ, আমি আসলে একটি জেল আউটপুট করি, সমস্ত অষ্টেভের মধ্যে বি এর পুরোটা থাকে, কিছুটা 12-স্ট্রিং গিটারের মতো)।

এর পরে, আমি উচ্চ-বিদ্যালয়ের সঙ্গীত শ্রেণীর কাছ থেকে মনে করেছি যে সর্বাধিক নোট স্থানান্তরগুলি ছোট (একটি নোটের উপরে বা নীচে)। লাফানো কম দেখা যায় না। এটি আমাদের জানায় যে সম্ভবত নোটগুলির তুলনায় জাম্প আকারে কম ইন্ট্রপি রয়েছে।

সুতরাং, আমাদের দৃষ্টিভঙ্গিটি আমাদের উত্সকে বেশ কয়েকটি ব্লকের মধ্যে ভাঙ্গা - আমি প্রতি সেকেন্ডে 14 টি ব্লক ভালভাবে কাজ করেছি (সাইড নোট, আমি সবসময় ভাবতাম যে কেন অডিওটি 44100 হার্জেডে এনকোড করা হয়েছিল It এটি দেখা গেছে যে 44100 এর প্রচুর কারণ রয়েছে, সুতরাং আমি প্রতি সেকেন্ডে 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 14, 15, 18, 20, 21, 25, 28 বা 30 ব্লক বেছে নিতে পারতাম এবং এটি পরিষ্কারভাবে বিভক্ত হত )। তারপরে আমরা এই ব্লকগুলি এফএফটি করি (ভাল, প্রযুক্তিগতভাবে দ্রুত নয়, যেহেতু আমি যে লাইব্রেরিটি ব্যবহার করেছি তা অ-পাওয়ার-অফ -2 ব্লকের পক্ষে দ্রুত নয় And এবং প্রযুক্তিগতভাবে আমি হার্টলে রূপান্তর ব্যবহার করেছি , ফুরিয়ার নয়)।

এরপরে আমরা সেই নোটটি খুঁজে পাই যা সবচেয়ে জোরে শোনাচ্ছে ( উচ্চ ও লো কাট অফ সহ আমি এ-ওজন ব্যবহার করেছি , বেশিরভাগ ক্ষেত্রে এটি প্রয়োগ করা সবচেয়ে সহজ), এবং হয় এই নোটটি এনকোড করুন, অথবা নীরবতাটি এনকোড করুন (নীরবতা সনাক্তকরণ এসএনআর - নিম্ন এসএনআর উপর ভিত্তি করে নীরবতা)।

তারপরে আমরা আমাদের এনকোডযুক্ত নোটগুলিকে জাম্পগুলিতে অনুবাদ করি এবং তাদের একটি অভিযোজিত পাটিগণিত কোডারে ফিড করি। পাঠ্য থেকে অনুবাদ করার প্রক্রিয়াটি চিত্র সংক্ষেপণের প্রশ্নের মতো (তবে বিগইন্টিজারের কিছু আপত্তিজনক ব্যবহার জড়িত)।

এতক্ষণ, এত ভাল, তবে যদি নমুনায় খুব বেশি এনট্রপি থাকে? আমরা কিছু অপসারণের জন্য একটি অপরিশোধিত মনস্তাত্ত্বিক মডেল ব্যবহার করি। সর্বনিম্ন এনট্রপি জাম্পটি "কোনও পরিবর্তন নয়", তাই আমরা আমাদের ব্লকগুলি অনুসন্ধান করার জন্য আমাদের এফএফটি ডেটা দেখি যেখানে শ্রোতা সম্ভবত খেয়াল করবেন না যদি আমরা পূর্ববর্তী নোটটি যে নোটটি রয়েছে সেখানে ব্লকগুলি সন্ধান করে প্রায় জোরে জোরে নোট (যেমন "প্রায়" মানের পরামিতি দ্বারা নিয়ন্ত্রিত হয়)

সুতরাং, আমরা 140 টি অক্ষরের একটি লক্ষ্য পেয়েছি। আমরা মানের ০.০ (সর্বোচ্চ মানের) এ এনকোডিং দিয়ে শুরু করি এবং এটি দেখতে কতগুলি অক্ষর। যদি এটি অনেক বেশি হয় তবে আমরা ১.০৯ এ নেমে যাচ্ছি এবং 140 বারের অক্ষর না পাওয়া পর্যন্ত আমরা পুনরাবৃত্তি করব (বা আমরা মানের 0.05 এর পরে ছেড়ে দিই)। এটি এনকোডারকে এন <= 20 এর জন্য এন-পাস এনকোডার বানিয়েছে (যদিও এটি অন্যান্য ক্ষেত্রেও ব্যাপকভাবে অক্ষম, সুতরাং এম'এইচ)।

এনকোডার / ডিকোডারটি 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 ম: মূল , এনকোড -刲檁囉罓佖镱賑皌蝩蔲恁峕逊躹呯兲搆摼蝺筶槛庬一掛獴趤笲銗娵纜喫覤粠僭嫭裵獄鱨蠰儏咍箪浝姑椻趕挍呪白鸞盙宠埘謭擆闯脲誜忘椐笸囃庣稨俖咛脔湙弻籚砌鍖裏橈镙訁鹻塿骱踠筟七趇杅峇敖窈裞瘫峦咰呹櫬茏蛏姆臸胝婁遼憀麁黦掏毈喙眝綄鴀耢椚筤菮蟞斗俼湛营筬禴籙嬧窻丄
  • পশমের এলিস: মূল , এনকোড -訖忢擫鏝拪纒铇鯪薯鉰孝暱埛痏絘僌莻暆鴈屖鳮絒婘譮蠣託騶腀饚緂柤碠瞢碩脅歙棆敗辦冏鄔酾萖苯劺誺軩忇穤锳婁伉巠桭晘酉筟緵俅怚尵鎽蜓崁飿嘔但鈐謽酝屮呤誥俊覊鶮龔癸埙煂臙牎繬肜摲炚雗頨款驦燈菩凧咁楾媡夥俰欓焵韀冊嗥燠鱧駟髉
  • নিমিষ টুইনঙ্কাল লিটল স্টার: মূল , এনকোড -欠悺矜莳錥鷗谴裴皽鳺憝漿箔皇殤鸧蜻猻丱
  • একটি মজার চিপটিউন: মূল , এনকোড -简詐諥尘牿扫鲑龮箫颫齰蠏騁煟靸阒萎囦鮇雝愯訖芉馄鈿鬦嶏觲沠丆贀蛑蛀漥荤侲咔麑桬鲠僵擕灼攲陇亄鹘琾業纟鵼牤棌匩碆踬葫鶙懲欃铳樯柇鋡疡衻澯伅墇搢囻荸香貱夹咽蟽籐屈锂蛉袒貊屨鈦夜镤沄鍡唦魮骬乔蚖醶矕咻喸碋利褼裊匎嶮窢幘六沧鼝瞮坡葍帷锆邵旻符琨鱴郤栱烇仾椃騋荄嘵統篏珆罽

হালনাগাদ

আমি কোডটিতে নীরবতার প্রান্তটি টিক করেছিলাম এবং পুনরায় এনকোড করেছি। এনকোডিংগুলি সেই অনুযায়ী আপডেট করা হয়েছে। এছাড়াও, আমি আরও একটি গান যুক্ত করেছি (প্রযুক্তিগতভাবে ওপেন সোর্স নয়, তবে আমি সন্দেহ করি যে মূল কপিরাইট ধারক তাদের আইপি হুমকির মুখে পড়বে), কেবল মজাদার জন্য:

  • ইম্পেরিয়াল মার্চ: মূল , এনকোড -岼讶湠衢嫵焅喋藭霔憣嗗颟橳蕖匵腾嗅鈪芔区顕樭眀冂常僠寝萉乹俚戂闤灈蟑拷邢音褈霈媬盒萳璥唂焰銯艉鶱縩巻痭虊窻熲紆耺哅淙苉嘏庸锺禒旇蘄籷遪刨繱蕖嬯摺祑仰軈牰杊瘷棏郖弘卄浕眮騜阖鏴鶺艂税寛柭菸採偋隆兎豅蚦紛襈洋折踜跅軩树爺奘庄玫亳攩獼匑仡葾昐炡瞱咏斎煟价藭恐鷖璌榍脅樐嬨勀茌愋

আরও আপডেট

আমি এনকোডারটি কিছুটা সামান্য টিক করেছি, এবং এটির গুণগত মানের উপর একটি আশ্চর্যজনক প্রভাব পড়েছিল (আমি ভুলে গিয়েছিলাম যে ডিএইচটি-তে-পর্বের বাইরে সংকেতগুলি কার্যকরভাবে নেতিবাচক, তাই আমি পর্বের বাইরে সংকেতগুলি উপেক্ষা করছি)।

কোডটির পূর্ববর্তী সংস্করণ সবেমাত্র এই পর্যায়ে থাকা সংকেতগুলির বৃহত্তর অংশ নিয়েছে, তবে আমরা এখন আরএমএস নিই। এছাড়াও, আমি আর্টিফ্যাক্টিংয়ের বিরুদ্ধে লড়াই করার চেষ্টা করার জন্য এনকোডারটিতে (টুকি, আলফা ০.০) একটি মোটামুটি রক্ষণশীল উইন্ডো ফাংশন যুক্ত করেছি।

সেই অনুযায়ী সবকিছু আপডেট হয়েছে।


1
আমি টুইঙ্কল টুইঙ্কল এবং চিপটিউন খেলতে পারি না। ফুর এলিস বেশ কাছাকাছি, বীথোভেন সবেই স্বীকৃত, হাহা।
justhalf

আপনি কি আবার টুইঙ্কল টুইঙ্কল এবং চিপটিউন চেষ্টা করে দেখতে চান? আমি মনে করি আমি URL গুলি স্থির করেছি fixed
জেমস_পিক

1
এটা এখন কাজ করে. টুইঙ্কল টুইঙ্কল বেশ বংশোদ্ভূত। তবে শেষে কী হচ্ছে?
justhalf

হ্যাঁ, আমি শেষে নিশ্চিত হচ্ছি না কি ঘটছে। আমি সন্দেহ করি এটি পাটিগণিত কোডিংয়ের কোথাও ঘটছে। কোডটির পূর্ববর্তী সংস্করণে স্ট্রিমটি একটি ইওএফ প্রতীক দ্বারা শেষ করা হয়েছিল, তবে কিছু ক্ষেত্রে ডিকোডার ইওএফ প্রতীকটি পড়তে ব্যর্থ হয়েছিল। আমি সন্দেহ করি যে আমি বিটআউটপুট স্ট্রিমটি সঠিকভাবে বন্ধ করে নেই, তবে আমি এটিতে সন্ধান করব।
জেমস_পিক

1
হ্যাঁ, বাস্তবে এটি ছিল ঠিক। BitOutputStream::closeআমি কল করতে ভুলে গিয়েছিলাম একটি পদ্ধতি ছিল । আমি কোডটি ঠিক করব এবং ফলাফলগুলি আপডেট করব।
জেমস_পিক

11

পাইথন

আমি ইউটিএফ -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 সহ এনকোডিংয়ের স্বাধীনতাও দিয়েছি It এটি আরও ভাল শোনাচ্ছে।

আউটপুট

পিয়ানোফোর্ট এবং বিটবক্সের জন্য ইমপ্রোপুটু

aWnxQDg4mWqZWVl6W+LyOThfHOPyQThAe4x5XCqJK1EJ8Rh6jXt5XEMpk1Epe5JqTJJDSisrkkNCSqnSkkJDkiorCZHhCxsq8nlakfEp8vNb8iqLysp6MpJ7s4x7XlxdW4qKMinJKho

লিংক

ঝিকিমিকি ঝিকিমিকি ছোট তারা

HBobGlJSUlJSY2FlYVNRUVFCQkJCQjs5PDksKisqGxoZGVFTUVNRREFDQjs6OjoqKykpKVRRVFJDQkJCOjs6OzksKikpGxobG1JSUlNRZWFlYVNSUVFCQkJDQTw5PDorKisqGhsZGRk

লিংক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.