"টুইঙ্কল টুইঙ্কল লিটল স্টার" এ গানগুলি মুদ্রণ করুন


24

আপনার লক্ষ্যটি প্রতিটি নোটটি চালিত হওয়ার সাথে সাথে "টুইঙ্কল টুইঙ্কল লিটল স্টার" গানে লিরিকগুলি মুদ্রণ করা।

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

এখানে প্রদত্ত মিউজিকাল নোটগুলি এবং নীচের গীতগুলি ব্যবহার করুন: (উল্লম্ব লাইনগুলি বর্ণনামূলক বিরতি উপস্থাপন করে))

যমজ | ক্লে, যমজ | ক্লে, লিটল | টলে স্টার,

আমি কীভাবে জিতেছি

উপরে | বিশ্বকে এত উঁচু করে তোলা,

আকাশে একটি ডায়া | মন্ডের মতো।

যমজ | ক্লে, যমজ | ক্লে, লিটল | টলে স্টার,

আমি কীভাবে জিতেছি

সংগীতের একটি রেকর্ডিং এখানে পাওয়া যাবে

উদাহরণ

কম্পিউটারটি মাঝারি সি শুনে এবং "যমজ" মুদ্রণ করে

এটি অন্য মাঝের সি শুনে এবং "ক্লে," মুদ্রণ করে

তারপরে এটি অন্য মাঝারি সি (ভুল নোট) শুনে এবং কিছুই করে না।

তারপরে এটি মধ্য সি এর উপরে জি শুনে এবং "যমজ" প্রিন্ট করে।

বিধি

  • বিরামচিহ্ন অবশ্যই প্রদর্শিত হবে।
  • ব্যবধানটি অবশ্যই দেখানো (স্পেস এবং নিউলাইন সহ) হওয়া উচিত।
  • পূর্ববর্তী বা পরবর্তী অক্ষরের সাথে শ্বেত স্থানটি মুদ্রিত হতে পারে।

2
শিথিল করার কোনও উপায় আছে "নোট শেষ হওয়ার আগে অবশ্যই মুদ্রণ করা উচিত?" ১/১ second সেকেন্ড নোটের সাথে, আপনি যদি সেই সময়ের 3/4 স্যাম্পলিং করতে উত্সর্গ করেন তবে আপনার সাথে কাজ করার জন্য কেবল 47 ডলার সাউন্ড রয়েছে। এটি মিড-রেঞ্জ নোটগুলির জন্য বেশ মুরগি ফ্রিকোয়েন্সি রেজোলিউশন দেয়।
জিওবিটস

@ জিওবিটস গুড পয়েন্ট; আমি সেই নিয়ম সরিয়ে দিয়েছি।
Ypnypn

1
এটি অডিও ইনপুট ব্যবহার করে আমি প্রথম পাজলটি খুঁজে পেতে পারি! অভিনন্দন!
চার্লস

1
দুটি পলককে আলাদা করার উদ্দেশ্যে শিরোনামটি ভুলভাবে বানানো হয়েছে?
রেইনবোল্ট

1
পরীক্ষার জন্য আমাদের কোনও অডিও ফাইলের লিঙ্ক থাকতে পারে?
ক্যালভিনের শখ 4

উত্তর:


7

পাইথন 3 - আংশিক সমাধান ( 760 742 734 710 705 657 অক্ষর)

(শেষ সম্পাদনা; আমি প্রতিশ্রুতি)

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

A=-52
F=44100
C=4096
import pyaudio as P
import array
import scipy.signal as G
import numpy as N
import math
L=math.log
i=0
j=[9,2,0,2,4,5,7,9]
k=[2,4,5,7]
n=j+k+k+j
w="Twinkle, |twinkle, |little |star,\n|How I |wonder |what you |are.\n|Up a|bove the |world so |high,\n|Like a |diamond |in the |sky.\n".split('|')
w+=w[:8]
e=P.PyAudio().open(F,1,8,1,0,None,0,C)
while i<24:
 g=array.array('h',e.read(C));b=sum(map(abs,g))/C
 if b>0 and 20*L(b/32768,10)>A:
  f=G.fftconvolve(g,g[::-1])[C:];d=N.diff(f);s=0
  while d[s]<=0:s+=1
  x=N.argmax(f[s:])+s;u=f[x-1];v=f[x+1]
  if int(12*L(((u-v)/2/(u-2*f[x]+v)+x)*F/C/440,2))==n[i]+15:print(w[i],end='',flush=1);i+=1

এটি প্রয়োজন ...

আপনার মাইক্রোফোনের উপর ভিত্তি করে শীর্ষ লাইনে A = -52 (ন্যূনতম প্রশস্ততা) পরিবর্তন করুন, পরিবেষ্টিত শব্দের পরিমাণ, গানটি কত জোরে চলছে, ইত্যাদি আমার মাইক্রোফোনে, -57 এর চেয়ে কম পরিমাণে বহিরাগত শব্দ উঠছে বলে মনে হচ্ছে এবং -49 এর বেশির জন্য আপনাকে এটি খুব জোরে খেলতে হবে।

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

আমি https://gist.github.com/endolith/255291 থেকে স্বতঃসিদ্ধকরণের মাধ্যমে ফ্রিকোয়েন্সি সনাক্তকরণের জন্য কোডটি চুরি করেছি

Ungolfed:

import pyaudio
from array import array
import scipy.signal
import numpy
import math
import sys

MIN_AMPLITUDE = -52
FRAMERATE = 44100

def first(list):
    for i in range(len(list)):
        if(list[i] > 0):
            return i
    return 0

# Based on: https://en.wikipedia.org/wiki/Decibel#Acoustics
def getAmplitude(sig):
    total = 0;
    elems = float(len(sig))
    for x in sig:
        total += numpy.abs(x) / elems
    if(total == 0):
        return -99
    else:
        return 20 * math.log(total / 32768., 10)    

# Based on: https://en.wikipedia.org/wiki/Piano_key_frequencies
def getNote(freq):
    return int(12 * math.log(freq / 440, 2) + 49)

# --------------------------------------------------------------------------
# This is stolen straight from here w/ very slight modifications: https://gist.github.com/endolith/255291
def parabolic(f, x):
    return 1/2. * (f[x-1] - f[x+1]) / (f[x-1] - 2 * f[x] + f[x+1]) + x

def getFrequency(sig):
    # Calculate autocorrelation (same thing as convolution, but with
    # one input reversed in time), and throw away the negative lags
    corr = scipy.signal.fftconvolve(sig, sig[::-1], mode='full')
    corr = corr[len(corr)/2:]

    # Find the first low point
    diffs = numpy.diff(corr)

    # Find the next peak after the low point (other than 0 lag). This bit is
    # not reliable for long signals, due to the desired peak occurring between
    # samples, and other peaks appearing higher.
    # Should use a weighting function to de-emphasize the peaks at longer lags.
    start = first(diffs)
    peak = numpy.argmax(corr[start:]) + start
    return parabolic(corr, peak) * (FRAMERATE / len(sig))
# --------------------------------------------------------------------------

# These are the wrong keys (ie it is detecting middle C as an A), but I'm far too lazy to figure out why.
# Anyway, these are what are detected from the Wikipedia .ogg file:
notes = [73,          66,           64,       66,         68,       69,        71,          73,       66,     68,          69,         71,         66,        68,         69,        71      ] 
words = ["Twinkle, ", "twinkle, ", "little ", "star,\n",  "How I ", "wonder ", "what you ", "are.\n", "Up a", "bove the ", "world so ", "high,\n", "Like a ", "diamond ", "in the ", "sky.\n"]
notes += notes[:8]
words += words[:8]

pa = pyaudio.PyAudio()
stream = pa.open(format=pyaudio.paInt16, channels = 1, rate = FRAMERATE, input = True, frames_per_buffer = 4096)
idx = 0
while(idx < len(notes)):
    # Read signal
    sig = array('h', stream.read(4096))
    if(getAmplitude(sig) > MIN_AMPLITUDE):
        note = getNote(getFrequency(sig))
        if(note == notes[idx]):
            sys.stdout.write(words[idx])
            sys.stdout.flush()
            idx += 1

আমি আপনার জন্য একটি সামান্য বাক্য গঠন সাহায্য লিখেছি। 14-29 এবং 80-88 লাইন পরীক্ষা করুন। পেস্টবিন.
com

@ সিগ - অসাধারণ; ধন্যবাদ! পুরানো অভ্যাস ভঙ্গ করা কঠিন;
রবার্ট ফ্রেজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.