এই নোটের ফ্রিকোয়েন্সি কত?


21

দ্রুত সঙ্গীত রিফ্রেশার:

পিয়ানো কীবোর্ডে 88 টি নোট রয়েছে। প্রতিটি অষ্টকটিতে 12 টি নোট C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭এবং রয়েছে B। প্রতিবার আপনি যখন একটি 'সি' চাপুন, তখন প্যাটার্নটি একটি অষ্টককে উচ্চতর পুনরাবৃত্তি করে।

এখানে চিত্র বর্ণনা লিখুন

একটি নোট স্বতন্ত্রভাবে চিহ্নিত করা হয় 1) চিঠিগুলি, কোনও শার্প বা ফ্ল্যাটগুলি সহ এবং 2) অষ্টক, যা 0 থেকে 8 পর্যন্ত একটি সংখ্যা, কীবোর্ডের প্রথম তিনটি নোট A0, A♯/B♭এবং B0। এর পরে অষ্টক 1 C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1এবং সম্পূর্ণ ক্রোম্যাটিক স্কেল আসে B1। এই তারপর octaves 2, 3, 4, 5, 6, এবং 7 এ একটি পূর্ণ বর্ণীয় স্কেল আসে পরে, গত লক্ষ্য করুন, একটি হল C8

প্রতিটি নোট 20-4100 হার্জ ব্যাপ্তির মধ্যে একটি ফ্রিকোয়েন্সি এর সাথে মিলে যায়। সঙ্গে A0ঠিক 27,500 হের্ত্স্ থেকে শুরু, প্রতিটি সংশ্লিষ্ট নোট পূর্ববর্তী নোট বার দুই, বা মোটামুটিভাবে 1,059463 দ্বাদশ মূল। আরও সাধারণ সূত্রটি হ'ল:

এখানে চিত্র বর্ণনা লিখুন

যেখানে এন 0 এর নম্বরটি নোটের সংখ্যা 1 (আরও তথ্যের জন্য এখানে )

চ্যালেঞ্জ

এমন কোনও প্রোগ্রাম বা ফাংশন লিখুন যা কোনও নোটকে উপস্থাপন করে এমন স্ট্রিং নেয় এবং সেই নোটটির ফ্রিকোয়েন্সি মুদ্রণ করে বা প্রদান করে। আমরা #ধারালো প্রতীক (বা আপনার যুবকদের জন্য হ্যাশট্যাগ) এবং bফ্ল্যাট চিহ্নের জন্য একটি ছোট হাতের ব্যবহার করব। সমস্ত ইনপুট (uppercase letter) + (optional sharp or flat) + (number)কোনও শ্বেতস্থান ছাড়া দেখতে হবে। যদি ইনপুটটি কীবোর্ডের সীমার বাইরে থাকে (A0 এর চেয়ে কম বা সি 8 এর চেয়ে বেশি), বা সেখানে অবৈধ, অনুপস্থিত বা অতিরিক্ত অক্ষর রয়েছে তবে এটি একটি অবৈধ ইনপুট, এবং আপনাকে এটি পরিচালনা করতে হবে না। আপনি নিরাপদে ধরে নিতে পারেন যে আপনি কোনও অদ্ভুত ইনপুট যেমন ই #, বা সিবি পাবেন না।

স্পষ্টতা

যেহেতু অসীম নির্ভুলতা সত্যই সম্ভব নয়, তাই আমরা বলব যে সত্য মানের এক শতাংশের মধ্যে কিছু গ্রহণযোগ্য। অতিরিক্ত বিশদে না গিয়ে, একটি সেন্ট দুইটি বা 1.0005777895 এর 1200 তম মূল। এটি আরও স্পষ্ট করতে একটি কংক্রিট উদাহরণ ব্যবহার করুন। ধরা যাক আপনার ইনপুটটি A4 ছিল। সঠিক এই নোটের মান 440 Hz হয় হয়। একবার সেন্ট ফ্ল্যাট হয় 440 / 1.0005777895 = 439.7459। একবার সেন্ট তীক্ষ্ণ হয় 440 * 1.0005777895 = 440.2542সুতরাং, 439.7459 এর চেয়ে বেশি তবে 440.2542 এর চেয়ে ছোট কোনও সংখ্যা গণনা করার জন্য যথেষ্ট যথাযথ।

পরীক্ষার মামলা

A0  --> 27.500
C4  --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4  --> 440
D9  --> Too high, invalid input.
G0  --> Too low, invalid input.
Fb5 --> Invalid input.
E   --> Missing octave, invalid input
b2  --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.

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

যথারীতি এটি কোড-গল্ফ, সুতরাং মানক লুফোলগুলি প্রয়োগ হয় এবং বাইট জেতে সংক্ষিপ্ত উত্তর।


9
"এইচ # 4 -> এইচ সত্যিকারের নোট নয়, অবৈধ ইনপুট।" ইউরোপ বাদে।
লুই

6
@ লুই ইউরোপ সম্পর্কে এই জিনিসটি কি পুরো ইউরোপ ব্যবহার করে H? Hএর অর্থ B কেবলমাত্র আফগানিস্তান জার্মান ভাষী দেশগুলিতে ব্যবহৃত হয়। (যেখানে Bবিবি মানে উপায় হয়)) ব্রিটিশ এবং আইরিশরা বি কে ডাকে স্পি এবং ইতালিতে সি বা তি বলে ড ডো মি ফা সোল লা সি হিসাবে in
স্তর নদী সেন্ট

3
আমি এর আগে একটি ভায়োলায় একটি বি 2 খেলেছি এটি একেবারে যুক্তিসঙ্গত নোট এবং একেবারেই অদ্ভুত নয়।
নিল

3
@steveverrill H, জার্মানি, চেক প্রজাতন্ত্র, স্লোভাকিয়া, পোল্যান্ড, হাঙ্গেরি, সার্বিয়া, ডেনমার্ক, নরওয়ে, ফিনল্যান্ড, এস্তোনিয়া ও অস্ট্রিয়া ব্যবহার করা হয় অনুযায়ী উইকিপিডিয়া । (আমি নিজেও ফিনল্যান্ডের পক্ষে এটি নিশ্চিত করতে পারি))
পূর্কাকাডারী

6
@ নীল এটি সম্ভবত দুর্ঘটনাজনক ছিল। ;)
বেকার

উত্তর:


21

জাপট, 41 37 35 34 বাইট

আমার অবশেষে ¾ভাল ব্যবহার করার সুযোগ আছে ! :-)

55*2pU¬®-1¾ª"C#D EF G A B"bZ /C} x

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

          // Implicit: U = input string, C = 12
U¨    }  // Take U, split into chars, and map each item Z by this function:
-1¾       //  Subtract 1.75 from Z. This produces NaN for non-digits.
ª"..."bZ  //  If the result is falsy (NaN), instead return the index of Z in this string.
          //  C produces 0, D -> 2, E -> 4, F -> 5, G -> 7, A -> 9, B -> 11.
          //  # -> 1, and b -> -1, so we don't need to calculate them separately.
/C        //  Divide the index by 12.
x         // Sum.
2p        // Take 2 to the power of the result.
55*       // Multiply by 55.

পরীক্ষার মামলা

সমস্ত বৈধ পরীক্ষার মামলা জরিমানার মাধ্যমে আসে। এটি অবৈধ যেখানে এটি অদ্ভুত হয় ...

input --> output       (program's reasoning)
A0  --> 27.5           (Yep, I can do that for you!)
C4  --> 261.625565...  (Yep, I can do that for you!)
F#3 --> 184.997211...  (Yep, I can do that for you!)
Bb6 --> 1864.6550...   (Yep, I can do that for you!)
A#6 --> 1864.6550...   (Yep, I can do that for you!)
A4  --> 440            (Yep, I can do that for you!)
D9  --> 9397.27257...  (Who says that's too high?)
G0  --> 24.49971...    (I've heard that note before.)
Fb5 --> 659.25511...   (Wait, Fb isn't supposed to be a note?)
E   --> 69.295657...   (I'm gonna guess that the missing octave is 1¾.)
b2  --> 61.735412...   (I assume that b means Cb...)
H#4 --> 261.625565...  (H# is C!)

13
¾ :) ব্যবহারের জন্য +
অ্যানাটলিগ


@ পেট্রিকরোবার্টস এটি ইউটিএফ -8-তে 38 বাইট, তবে জাপট আইএসও -8859-1 এনকোডিং ব্যবহার করে , যাতে প্রতিটি অক্ষর হুবহু একটি বাইট হয়।
ETH প্রোডাকশনগুলি

8

পাইথ, 46 44 43 42 39 35 বাইট

*55^2tsm.xsdc-x"C D EF GbA#B"d9 12z

এটি অনলাইনে চেষ্টা করুন। পরীক্ষা স্যুট.

কোডটি এখন ইটিএইচ প্রডাকশনগুলির জ্যাপ উত্তরের অনুরূপ অ্যালগোরিদম ব্যবহার করে , সুতরাং তার জন্য তাকে জমা দিন।

ব্যাখ্যা

                                            implicit: z = input
       m                          z         for each character in input:
          sd                                  try parsing as number
        .x                                    if that fails:
               "C D EF GbA#B"                   string "C D EF GbA#B"
              x              d                  find index of character in that
             -                9                 subtract 9
            c                   12              divide by 12
      s                                     sum results
     t                                      decrement
   ^2                                       get the correct power of 2
*55                                         multiply by 55 (frequency of A1)

পুরানো সংস্করণ (42 বাইট, 39 ডাব্লু / প্যাক স্ট্রিং)

*55^2+tsezc+-x"C D EF G A B"hz9-}\#z}\bz12

ব্যাখ্যা


এটা মজার. পাইথ প্যাক স্ট্রিংগুলি কীভাবে হয়?
লুইস মেন্ডো

@LuisMendo আপনি যে উপর তথ্য খুঁজে পেতে পারেন ডক্স । মূলত, এটি ডেটাতে রূপান্তর করতে ক্ষুদ্রতম বেসটি সন্ধান করে এবং তারপরে ফলাফলটি 256 বেসে এনকোড করে
PurkkaKoodari

7

গণিত, 77 বাইট

2^((Import[".mid"~Export~Sound@SoundNote@#,"RawData"][[1,3,3,1]]-69)/12)440.&

ব্যাখ্যা :

এই ফাংশনের মূল ধারণাটি নোটের স্ট্রিংটিকে তার সম্পর্কিত পিচে রূপান্তর করা এবং তার ফ্রিকোয়েন্সি গণনা করা।

আমি যে পদ্ধতিটি ব্যবহার করি তা হ'ল শব্দটি মিডিকে রপ্তানি করে এবং কাঁচা ডেটা আমদানি করে তবে আমি সন্দেহ করি যে এর চেয়ে আরও মার্জিত উপায় আছে।


পরীক্ষার কেস :

f=%; (* assign the function above to f *)
f["A4"]    (* 440.    *)
f["A5"]    (* 880.    *)
f["C#-1"]  (* 8.66196 *)
f["Fb4"]   (* 329.628 *)
f["E4"]    (* 329.628 *)
f["E"]     (* 329.628 *)

2
সাধারণত গাণিতিকভাবে সমস্যার সমাধান করা ম্যাথামেটিকার বিল্টিনগুলি দেখে আমি দু: খিত, তবে এটি এটি করার একটি দুর্দান্ত অনুপ্রেরণামূলক উপায়।
রবার্ট ফ্রেজার

4

এমএটিএল , 56 53 50 49 48 বাইট

Hj1)'C D EF G A B'=f22-'#b'"G@m]-s+ 12/G0)U+^55*

বর্তমান প্রকাশ (10.1.0) ব্যবহার করে , যা এই চ্যালেঞ্জের চেয়ে আগের।

এটি অনলাইন চেষ্টা করুন !

ব্যাখ্যা

H                   % push 2
j1)                 % get input string. Take first character (note)
'C D EF G A B'=f    % find index of note: 1 for C, 3 for D...
22-                 % subtract 22. This number comes from three parts:
                    % 9; 1 for 0-based indexing; 12 to subtract 1 octave
'#b'"G@m]-s         % For loop. Gives 1 if input contains '#', -1 if 'b', 0 otherwise
+                   % add to previous number. Space needed to separate from next literal
12/                 % divide by 12
G0)                 % push input and get last character (octave)
U+                  % convert to number and add to previous number
^                   % raise 2 (that was initially pushed) to accumulated number 
55*                 % multiply by 55 (=27.5*2). Implicitly display


3

রুবি, 69 65

->n{2**((n.ord*13/8%12-n.size+(n=~/#/?7:5))/12.0+n[-1].to_i)*55/4}

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

f=->n{
  2**(                    #raise 2 to the power of the following expression:
   (
     n.ord*13/8%12-       #note name C..B maps to number 0..11 calculated from the ascii code of n[0] 
     n.size+(n=~/#/?7:5)  #Correction for flat: length of n is 1 more for flat (or sharp) than for natural. Then apply correction for sharp
                          #now we have a number 3..14 for C..B (so 12 for A, will be a whole number when divided)
   )/12.0+                #divide by 12 to convert into a fraction of an octave

  n[-1].to_i              #add the octave number, last character in n
  )*                      #end of power expression, now we have A0=2,A1=4,A2=4 etc

  55/4                    #multiply to get correct frequency, this is shorter than 13.75 or 440/32                      
}

#complete octave test case
puts %w{A0 A#0 Bb0 B0 C1 C#1 Db1 D1 D#1 Eb1 E1 F1 F#1 Gb1 G1 G#1 Ab1 A1 A#1}.map{|e|[e,f[e]]}

#test case per OP
puts %w{A0 C4 F#3 Bb6 A#6}.map{|e|[e,f[e]]}

আউটপুট

A0
27.5
A#0
29.13523509488062
Bb0
29.13523509488062
B0
30.867706328507758
C1
32.70319566257483
C#1
34.64782887210901
Db1
34.64782887210901
D1
36.70809598967595
D#1
38.890872965260115
Eb1
38.890872965260115
E1
41.20344461410875
F1
43.653528929125486
F#1
46.2493028389543
Gb1
46.2493028389543
G1
48.999429497718666
G#1
51.91308719749314
Ab1
51.91308719749314
A1
55.0
A#1
58.27047018976123
A0
27.5
C4
261.6255653005986
F#3
184.9972113558172
Bb6
1864.6550460723593
A#6
1864.6550460723593

2

ES7, 82 বাইট

s=>55*2**(+s.slice(-1)+("C D EF G A B".search(s[0])+(s[1]<'0')-(s[1]>'9')-21)/12)

প্রত্যাশিত হিসাবে "বি # 2" ইনপুটটিতে 130.8127826502993 প্রদান করে।

সম্পাদনা: @ ব্যবহারকারী81655 ধন্যবাদ 3 বাইট সংরক্ষণ করা।


@ ব্যবহারকারী81655 2*3**3*2ফায়ারফক্সের ব্রাউজার কনসোলে 108 টি, যা এতে সম্মত 2*(3**3)*2। এছাড়াও নোট করুন যে পৃষ্ঠাটিতে আরও বলা হয়েছে যে ?:এর চেয়ে বেশি অগ্রাধিকার রয়েছে =তবে তাদের আসলে সমান প্রাধান্য রয়েছে (বিবেচনা করুন a=b?c=d:e=f)।
নীল

আহ, ঠিক আছে. আমার ফায়ারফক্সে **তাই আমি এটি পরীক্ষা করতে সক্ষম হয়েছি না। আমি মনে করি যদিও এর ?:চেয়ে উচ্চতর নজির রয়েছে =কারণ আপনার উদাহরণে aত্রিশটি bকার্যকর করার পরিবর্তে, তার্নারি ফলাফলের উপর সেট করা আছে । অন্য দুটি অ্যাসাইনমেন্টটি টের্নারিতে আবদ্ধ রয়েছে তাই তারা একটি বিশেষ কেস।
ব্যবহারকারী81655

@ ইউজার 81655 টেননারির e=fভিতরে কেমন আছে?
নিল

বিবেচনা করুন a=b?c=d:e=f?g:h। যদি সেগুলি একই নজির হয়ে থাকে এবং প্রথম ত্রৈমাসিকটি এর =পরে শেষ হয় তবে eএটি একটি অবৈধ বাম-হাতের অ্যাসাইনমেন্ট ত্রুটির কারণ হতে পারে।
ব্যবহারকারী81655

@ user81655 তবে যে কোনও উপায়ে ?:উচ্চতর অগ্রাধিকার থাকলে তাও সমস্যা হবে =। যেমন যদি এটা ছিল অভিব্যক্তি গ্রুপ প্রয়োজন a=(b?c=d:(e=(f?g:h)))। তাদের যদি একই নজির না থাকে তবে আপনি এটি করতে পারবেন না।
নিল

2

সি, 123 বাইট

float d(char*s){int n=*s++,m=(n*12+(n<67?90:6))/7,o=*s++,a=o^35?o^98?0:-1:1;return exp((m+(a?*s++:o)*12+a)/17.3123-37.12);}

ব্যবহার:

#include <stdio.h>
#include <math.h>

float d(char*s){int n=*s++,m=(n*12+(n<67?90:6))/7,o=*s++,a=o^35?o^98?0:-1:1;return exp((m+(a?*s++:o)*12+a)/17.3123-37.12);}

int main()
{
    printf("%f\n", d("A4"));
}

গণনা করা মানটি সর্বদা যথাযথ মানের থেকে প্রায় 0.8 সেন্ট কম, কারণ আমি ভাসমান-পয়েন্ট সংখ্যাগুলি থেকে যতগুলি সম্ভব সম্ভব সংখ্যাকে কাটা করি।

কোডটির ওভারভিউ:

float d(char*s){
    int n=*s++,        // read the letter
        m=(n*12+       // multiply by 12/7 to convert from A...G to 0...11
        (n<67?90:6)    // if A or B, add 1 octave; also add some fix-up rounding value
        )/7,

        o=*s++,        // read next char: the octave digit or accidental

        a=o^35?o^98?0:-1:1; // if accidental, convert it into +1 or -1; else 0

        return exp((m+ // I adjusted the factors to use exp instead of pow
            (a?*s++:o) // if was accidental, now read the octave digit
            *12+a)/
            17.3123-   // a more exact value is 17.3123404447
            37.12);    // a more exact value is 37.1193996632
}

1

আর, 157 150 141 136 বাইট

f=function(x){y=strsplit(x,"")[[1]];55*2^(as.double(y[nchar(x)])-1+(c(10,12,1,3,5,6,8)[LETTERS==y[1]]-switch(y[2],"#"=9,"b"=11,10))/12)}

ইনডেন্ট এবং নিউলাইনগুলি সহ:

f=function(x){
     y=strsplit(x,"")[[1]]
     55 * 2^(as.double(y[nchar(x)]) - 1 + 
         (c(10,12,1,3,5,6,8)[LETTERS==y[1]] - 
         switch(y[2],"#"=9,"b"=11,10))/12)
     }

ব্যবহার:

> f("A0")
[1] 27.5
> f("C8")
[1] 4186.009
> sapply(c("C4","Bb6","A#6","A4"),f)
       C4       Bb6       A#6        A4 
 261.6256 1864.6550 1864.6550  440.0000 

1

পাইথন, 97 95 বাইট

def f(n):a,*b,c=n;return 2**(int(c)+('C@D@EF@G@A@B'.find(a)-(21,(22,20)['#'in b])[b>[]])/12)*55

পিটু 1998 এর (এবং অন্যদের) 'C@D@EF@G@A@B'কিছু খালি চর বা অন্য কোনওটির জন্য স্ট্রিংয়ে নোটটির সূচি সন্ধান করার পুরানো পদ্ধতির উপর ভিত্তি করে । আমি শর্ত ছাড়াই নোটের স্ট্রিংকে পার্স করতে পুনরাবৃত্তযোগ্য আনপ্যাকিং ব্যবহার করি। রূপান্তর অভিব্যক্তিটি সরল করতে আমি শেষে কিছুটা বীজগণিত করেছি। আমার পদ্ধতির পরিবর্তন না করে আমি আরও সংক্ষিপ্ত করতে পারি কিনা তা জানেন না।


1
আমি মনে করি b==['#']সংক্ষিপ্ত করা যেতে পারে '#'in b, এবং not bথেকে b>[]
Zgarb

সুন্দর পয়েন্ট! ধন্যবাদ, আমার টেস্ট স্যুটটির জন্য কাজ করে। আমি মনে করি পাইথনে মোটামুটি কন্ডিশনাল গল্ফ করে উন্নত করতে পারি, ধন্যবাদ।
ওগাদে

1

ওল্ফ্রাম ভাষা (গণিত), 69 বাইট

ToExpression@("Music`"<>StringReplace[#,{"b"->"flat","#"->"sharp"}])&

সঙ্গীত প্যাকেজটি ব্যবহার করে , যার সাহায্যে একটি অভিব্যক্তি হিসাবে কেবল একটি নোট প্রবেশ করা তার ফ্রিকোয়েন্সিটির মূল্যায়ন যেমন:

 In[1]:= Eflat3
Out[1]:= 155.563

সাথে প্যাকেজ আমদানি করতে এড়িয়ে বাইট সংরক্ষণ করতে <<Music, আমি সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নাম ব্যবহার করছি: Music`Eflat3। তবে, আমি এখনও প্রশ্নের ইনপুট ফর্ম্যাটটির bসাথে flatএবং এর #সাথে প্রতিস্থাপন sharpকরতে হবে, যা আমি একটি সাধারণ সাথে করি StringReplace

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