আমি কী খেলেছি? গিটার ফিঙ্গারিংগুলি chords এ অনুবাদ করুন


22

সম্পর্কিত: সংগীত: এই জ্যাটিতে কি আছে? , ট্যাবলেটরে নোট , গিটার ট্যাব তৈরি? , গিটার নোটে নম্বর জোড়া অনুবাদ করুন

একটি গিটার আঙ্গুলের দেওয়া, জোর এটি প্রতিনিধিত্ব করে আউটপুট। আপনি স্ট্যান্ডার্ড ইনপুট এবং আউটপুট ব্যবহার করতে পারেন বা কোনও ফাংশন লিখতে পারেন যা কোনও স্ট্রিং দেয়।

ইনপুট ফিঙ্গনিংগুলি নিম্নোক্ত তীরগুলির মধ্যে একটি হিসাবে শ্রেণিবদ্ধযোগ্য হবে, নিম্নলিখিত হিসাবে প্রকাশ করা হবে (যদি মূল নোটটি সি হয়):

  • প্রধান ত্রয়ী: C
  • গৌণ ত্রয়ী: Cm
  • (প্রভাবশালী) সপ্তম: C7
  • গৌণ সপ্তম: Cm7

জ্যাণ্ডটি বিপরীত হতে পারে, তাই আপনি মূল হ'ল নোটের উপর নির্ভর করতে পারবেন না। বা আপনি বাস্তব বিশ্বে এটি কোনও সহজ বা সাধারণ আঙুলের উপর নির্ভর করতে পারবেন না। আরও সাধারণভাবে, আপনার প্রোগ্রামের আউটপুটটি অবশ্যই পিচের অষ্টভাকে অগ্রাহ্য করবে এবং একই বাদ্য নোটের সাথে সম্পর্কিত সমস্ত পিচগুলি (যেমন, A) সমান হিসাবে বিবেচনা করবে।

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

ছক পূরণ করা

ইনপুটটি 6 টি মানের একটি সিরিজ যা নির্দেশ করে যে স্ট্যান্ডার্ড টিউনিং (EADGBE) এর 6-স্ট্রিং গিটারের প্রতিটি স্ট্রিংয়ের জন্য , যা স্ট্রিংটি খেলবে। এটি স্ট্রিং মোটেও খেলেনি তাও ইঙ্গিত করতে পারে। "জেরোথ" ফ্রেটটি ওপেন পজিশন হিসাবেও পরিচিত এবং ফ্রেট সংখ্যাগুলি সেখান থেকে গণনা করা হয়। ধরুন গিটারের 21 টি ফ্রেট পজিশন রয়েছে যেমন সর্বোচ্চ ফ্রেট পজিশনটি 20 নম্বরে।

উদাহরণস্বরূপ, ইনপুটটির X 3 2 0 1 0অর্থ গিটারের ঘাড়ের উপরের অংশে নিম্নলিখিত অবস্থানগুলিতে একটিতে আঙুল দেওয়া:

(6th) |---|---|---|---|---
      |-X-|---|---|---|---
      |---|---|---|---|---
      |---|-X-|---|---|---
      |---|---|-X-|---|---
(1st) |---|---|---|---|---

এবং str ষ্ঠ স্ট্রিংয়ের মাধ্যমে ২ য় স্ট্রিমিং। এটি এই ASCII ট্যাবের সাথে সম্পর্কিত :

e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|

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

আপনি উপরে উল্লিখিত 4 টি জ্যা প্রকারের সাথে সংশ্লিষ্ট ইনপুটটির উপর নির্ভর করতে পারেন।

আপনার সমাধান কী ধরণের ইনপুট গ্রহণ করে তা আপনার পোস্টে ব্যাখ্যা করুন।

আউটপুট ফরমেট

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

প্রথম অংশ নির্দেশ করে রুট নোট , এক A, A#/ Bb, B, C, C#/ Db, D, D#/ Eb, E, F, F#/ Gb, Gঅথবা G#/ Ab। (আমি ব্যবহার করছি #পরিবর্তে , এবং bপরিবর্তে , ইউনিকোড প্রয়োজন এড়াতে।) রুট নোট যে তাদের ছাড়া প্রকাশ করা উচিত নয় একটি ধারালো বা ফ্ল্যাট ছাড়া প্রকাশ করা যেতে পারে (কখনও আউটপুট B#, Fbবা Dbb); যেগুলি অবশ্যই একটি একক তীক্ষ্ণ বা সমতল প্রতীক দিয়ে প্রকাশ করা যায় না (যেমন হয় হয় C#বা Dbতবে কখনও হয় না B##)। অন্য কথায়, আপনাকে অবশ্যই নোটের নামে দুর্ঘটনার সংখ্যা (শার্প বা ফ্ল্যাট) কমিয়ে আনতে হবে।

দ্বিতীয় অংশটি জ্যা প্রকারের ইঙ্গিত দেয়, হয় প্রধান ত্রিয়ার জন্য খালি, mএকটি গৌণ ত্রৈমাসিকের 7জন্য, প্রভাবশালী সপ্তম বা m7ছোট সপ্তমীর জন্য। সুতরাং একটি জি মেজর Gসরল হিসাবে আউটপুট হয় , যখন একটি ডি মাইনর সপ্তম হয় হয় হয় আউটপুট D#m7বা হিসাবে Ebm7। আরও উদাহরণের শেষে পরীক্ষার ক্ষেত্রে পাওয়া যাবে।

তত্ত্ব এবং ইঙ্গিতগুলি

স্বরলিপি

ক্রোমাটিক স্কেলটিতে প্রতি অক্টোমাতে 12 পিচ রয়েছে। সমান মেজাজে সুর করা হলে, এই প্রতিটি পিচ তার প্রতিবেশী 1 থেকে সমানভাবে দূরে থাকে । পিচগুলি যেগুলি 12 টি সেমিটোন বিচ্ছিন্ন (একটি অষ্টক) একই সংগীতের নোট হিসাবে বিবেচিত হয়। এই উপায়ে পূর্ণসংখ্যার 12 modulo, 0 থেকে 11 সাত এই চিঠি নাম দেওয়া হয় হচ্ছে আমরা নোট চিকিৎসা করতে পারে 2 জি এই একটি থেকে সমস্ত 12 পিচ নাম যথেষ্ট নয়, কিন্তু accidentals সংশোধন করা হয়েছে যোগ যে: যোগ করার সময় একটি ♯ ( তীক্ষ্ণ) একটি নোটকে এটি এক সেমিটোন উচ্চতর করে তোলে এবং একটি ♭ (ফ্ল্যাট) যুক্ত করা এটিকে একটি সেমিটোন নিম্ন করে দেয়।

chords

একটি জ্যা 2 বা ততোধিক নোট একসাথে বাজানো হয়। জ্যাডের ধরণটি নোটগুলির মধ্যে সম্পর্কের উপর নির্ভর করে, যা তাদের মধ্যে দূরত্বগুলি দ্বারা নির্ধারণ করা যেতে পারে। একটি জ্যা এর মূল নোট রয়েছে, যেমনটি আগেই উল্লেখ করা হয়েছে। আমরা এই উদাহরণগুলিতে মূল নোটটিকে 0 হিসাবে বিবেচনা করব, তবে এটি স্বেচ্ছাসেবী এবং এই চ্যালেঞ্জের যে বিষয়টি গুরুত্বপূর্ণ তা হল মডুলো পাটিগণিতের নোটগুলির মধ্যে দূরত্ব। উত্তরের জন্য সর্বদা এক অনন্য জ্যা টাইপ থাকবে, হয় ত্রয়ী বা সপ্তম জ্যা । মূল নোটটি সর্বদা সর্বনিম্ন-ফ্রিকোয়েন্সি পিচ হবে না; রুট নোটটি এমনটি চয়ন করুন যাতে আপনি নীচের চারটি জ্যা প্রকারের মধ্যে জর্ডাকে বর্ণনা করতে পারেন:

  • একটি প্রধান ত্রয়ী হ'ল নোটগুলির সাথে জড় 0 4 7
  • একটি গৌণ ত্রয়ী হ'ল নোটগুলির সাথে জড় 0 3 7
  • একটি প্রভাবশালী (বা প্রধান / অপ্রাপ্তবয়স্ক) সপ্তম তীরের নোট থাকে 0 4 7 10
  • একটি নাবালিক (বা অপ্রাপ্তবয়স্ক / নাবালক) সপ্তম তীরের নোট রয়েছে 0 3 7 103

গিটার টিউনিং

--স্ট্রিং গিটারের স্ট্যান্ডার্ড টিউনিং ই এর সাথে সর্বনিম্ন স্ট্রিংয়ের সাথে শুরু হয় এবং তারপরে 5, 5, 5, 4 এর বিরতিতে নোটগুলি আঘাত করে, তারপরে 5 টি সেমিটোনগুলি স্ট্রিংগুলিতে যায়। সর্বনিম্ন ই 0 হিসাবে নেওয়া, এর অর্থ গিটারের সমস্ত স্ট্রিংয়ের ঝাঁকুনি আপনাকে পিচগুলি সংখ্যাযুক্ত দেয় 0 5 10 15 19 24যা মডুলো 12 0 5 10 3 7 0বা নোটগুলির সমান E A D G B E

কাজের উদাহরণ

যদি আপনার ইনপুটটি হয় তবে 0 2 2 0 0 0এটি নোটগুলির সাথে মিলে যায় E B E G B E, তাই কেবল E, B এবং G These এই জ্যোতিগুলি তৈরি করে Em, যা এগুলি আমাদের হিসাবে প্রদান করে মূল হিসাবে তাদের সংখ্যা দিয়ে দেখা যায় 0 3 7। (ফলাফলটি একই রকম হবে X 2 X 0 X 0, বা 12 14 14 12 12 12।)

যদি আপনার ইনপুটটি থাকে 4 4 6 4 6 4, সি-এর মূল দিয়ে এগুলি সংখ্যায়ন দেয় 7 0 7 10 4 7, বা 0 4 7 10, সুতরাং উত্তরটি C#7(বা Db7)। পরিবর্তে যদি এটি হয় 4 4 6 4 5 4, নম্বরটি দেবে 7 0 7 10 3 7, বা 0 3 7 10, যা C#m7(বা Dbm7)।

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

X 3 2 0 1 0  --->  C
0 2 2 0 0 0  --->  Em
X 2 X 0 X 0  --->  Em
4 4 6 4 6 4  --->  C#7  (or Db7)
4 4 6 4 5 4  --->  C#m7 (or Dbm7)
0 2 2 1 0 0  --->  E
0 0 2 2 2 0  --->  A
X X 4 3 2 2  --->  F#   (or Gb)
3 2 0 0 0 1  --->  G7
X X 0 2 1 1  --->  Dm7
3 3 5 5 5 3  --->  C
4 6 6 5 4 4  --->  G#   (or Ab)
2 2 4 4 4 5  --->  B7
0 7 5 5 5 5  --->  Am7
7 6 4 4 X X  --->  B
8 6 1 X 1 3  --->  Cm
8 8 10 10 9 8 -->  Fm
0 19 5 16 8 7 -->  Em
6 20 0 3 11 6 -->  A#   (or Bb)
X 14 9 1 16 X -->  G#m  (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20  --> Cm7
X 13 18 10 11 10  --> A#7 (or Bb7)

1 তাদের ফ্রিকোয়েন্সিগুলির লগারিদম দ্বারা

2 বা, সল্ফাইজে , ডু , রে, মির মতো নাম । এই চ্যালেঞ্জে অক্ষরের নাম ব্যবহার করুন।

3 এটিকে মূল নোটের পৃথক পছন্দ সহ একটি প্রধান ষষ্ঠ জ্যোতিও বলা যেতে পারে। এই চ্যালেঞ্জে, এটিকে এর ছোট ছোট সপ্তম নাম দিয়ে কল করুন।


3
দুর্দান্ত চ্যালেঞ্জ!
লুইস মেন্ডো

1
আমার ভবিষ্যতের চ্যালেঞ্জ থেকে ডুপ হিসাবে বন্ধ করার প্রলোভন: ডি (আমার মনে একটি খুব অনুরূপ চ্যালেঞ্জ ছিল, তবে আপনি খুব তাড়াতাড়ি ছিলেন।)
flawr

আউটপুট স্ট্রিংয়ে পেছনের শ্বেতক্ষেত্রের অনুমতি রয়েছে?
লুইস মেন্ডো

@ লুইস মেন্ডো নিশ্চিত; সেটা ঠিক আছে.
ড্যান গেটেজ

1
@officialaimm না, আপনার অন্য কোনও পরিস্থিতি পরিচালনা করার দরকার নেই। আপনি ধরে নিতে পারেন এটি সর্বদা 4 4 টি জোর ধরনের be অন্য কথায়, আপনার কোডটি আপনি যা চান তা করতে পারে (ত্রুটি সহ বা একটি ভুল উত্তর দিতে পারে) যদি এটি অন্যরকম হয়ে যায়।
ড্যান গেটেজ

উত্তর:


9

এমএটিএল , 115 114 বাইট

[OAXICO]+tZN~)Y@!"@t1)XH- 12\XzXJK7hm?O.]JI7hm?'m'.]J[KCX]m?'7'.]J[ICX]m?'m7'.]]'FF#GG#AA#BCC#DD#E'l2741B~QY{HX)wh

ইনপুট ফর্ম্যাটটি [N 3 2 0 1 0]যেখানে Nঅব্যবহৃত স্ট্রিং নির্দেশ করে।

আউটপুট স্ট্রিং সর্বদা ব্যবহার করে #, না b

এটি অনলাইন চেষ্টা করুন! অথবা অনলাইন সংকলক সময় নির্ধারণের সময়টি এড়াতে দুটি পরীক্ষায় সমস্ত পরীক্ষার কেস যাচাই করুন:

ব্যাখ্যা

[OAXICO]            % Push [0 5 10 3 7 0]. This represents the pitch of each open
                    % string relative to the lowest string, modulo 12
+                   % Add to implicit input. May contain NaN's, for unused strings
tZN~)               % Remove NaN's
Y@!                 % Matrix of all permutations, each in a column
"                   % For each column
  @                 %   Push current column
  t1)               %   Duplicate and get first entry
  XH                %   Copy into clipboard H
  - 12\             %   Subtract. This amounts to considering that the first note
                    %   of the current permutation is the root, and computing
                    %   all intervals with respect to that
  12\               %   Modulo 12
  Xz                %   Remove zeros
  XJ                %   Copy into clipboard J
  K7hm?             %   Are all intervals 4 or 7? If so: it's a major chord
    O               %     Push 0 (will become space when converted to char)
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  I7hm?             %   Are all intervals 3 or 7? If so: it's a minor chord
    'm'             %     Push this string
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  [KCX]m?           %   Are all intervals 4, 7 or 10? If so: it's a dominant-7th
                    %   chord
    '7'             %     Push this string
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  [ICX]m?           %   Are all intervals 3, 7 or 10? If so: it's a minor 7th chord
    'm7'            %     Push this string
    .               %     Break for loop
  ]                 %   End if
]                   % End for. The loop is always exited via one of the 'break'
                    % statements. When that happens, the stack contains 0, 'm',
                    % '7' or 'm7', indicating the type of chord; and clipboard H
                    % contains a number that tells the root note using the lowest 
                    % string as base (1 is F, 2 is F# etc)
'FF#GG#AA#BCC#DD#E' % Push this string. Will be split into strings of length 1 or 2
l                   % Push 1
2741B~Q             % Push [1 2 1 2 1 2 1 1 2 1 2 1] (obtained as 2741 in binary,
                    % negated, plus 1)
Y{                  % Split string using those lengths. Gives a cell array of
                    % strings: {'F', 'F#', ..., 'E'}
H                   % Push the identified root note
X)                  % Index into cell array of strings
wh                  % Swap and concatenate. Implicitly display

4

এমএস-ডস .কম ফাইল (179 বাইট)

ফাইল (এখানে এইচএক্স হিসাবে প্রদর্শিত হয়েছে):

fc be 81 00 bf 72 01 31 db b9 06 00 51 e8 73 00
59 e2 f9 b9 0c 00 be 48 01 ad 39 c3 74 0d 40 75
f8 d1 fb 73 03 80 c7 08 e2 ec c3 31 db 88 cb 8a
87 59 01 e8 42 00 8a 87 65 01 e8 3b 00 81 c6 08
00 ac e8 33 00 ac eb 30 91 00 89 00 91 04 89 04
ff ff 00 00 6d 00 37 00 6d 37 42 41 41 47 47 46
46 45 44 44 43 43 00 23 00 23 00 23 00 00 23 00
23 00 04 09 02 07 0b 04 84 c0 74 06 b4 02 88 c2
cd 21 c3 8a 0d 47 ac 3c 20 76 fb 30 ed 3c 41 73
22 2c 30 72 0b 86 c5 b4 0a f6 e4 00 c5 ac eb ed
88 e8 00 c8 30 e4 b1 0c f6 f1 88 e1 b8 01 00 d3
e0 09 c3

ইনপুটটি কমান্ড লাইনের মাধ্যমে দেওয়া হয়। অবৈধ ইনপুট অবৈধ প্রোগ্রামের আচরণের দিকে পরিচালিত করবে!

এসেম্বলারের কোডটি দেখতে এমন দেখাচ্ছে:

.text
.code16
ComFileStart:
    cld
    mov $0x81, %si
    mov $(TuneTable-ComFileStart+0x100), %di
    xor %bx, %bx
    # 6 strings: Build the mask of played tones
    mov $6, %cx
NextStringRead:
    push %cx
    call InsertIntoMask
    pop %cx
    loop NextStringRead

    # Check all base tones...
    mov $12, %cx
TestNextTone:
    mov $0x100+ChordTable-ComFileStart, %si
TestNextChord:
    lodsw
    # Is it the chord we are searching for?
    cmp %ax, %bx
    je FoundChord 
    # Is it the end of the table?
    inc %ax
    jnz TestNextChord
    # Transpose the chord we really play
    # and go to the next tone
    # This code rotates the low 12 bits of
    # BX one bit right
    sar $1, %bx
    jnc NoToneRotated
    add $8, %bh
NoToneRotated:
    loop TestNextTone
EndOfProgram:
    ret

FoundChord:
    # Get and print the tone name
    xor %bx, %bx
    mov %cl, %bl
    mov (ToneNamesTable+0x100-1-ComFileStart)(%bx),%al
    call printChar
    mov (ToneNamesTable+0x100+12-1-ComFileStart)(%bx),%al
    call printChar
    # Get the chord name suffix and print it
    add $(ChordNamesTable-ChordTable-2),%si
    lodsb
    call printChar
    lodsb
    # Note: Under MS-DOS 0x0000 is the first word on
    # the stack so the "RET" of printChar will jump
    # to address 0x0000 which contains an "INT $0x21"
    # (end of program) instruction
    jmp printChar

ChordTable:
    # Major, Minor, Major-7, Minor-7
    .word 0x91, 0x89, 0x491, 0x489, 0xFFFF
ChordNamesTable:
    .byte 0,0,'m',0,'7',0,'m','7'
ToneNamesTable:
    .ascii "BAAGGFFEDDCC"
    .byte 0,'#',0,'#',0,'#',0,0,'#',0,'#',0
TuneTable:
    .byte 4,9,2,7,11,4

#
# Subfunction: Print character AL;
#              Do nothing if AL=0
#
printChar:
    test %al, %al
    jz noPrint
    mov $2, %ah
    mov %al, %dl
    int $0x21
noPrint:
    ret

#
# Subfunction: Get one finger position
#              and insert it into a bit mask
#              of tones being played
#
# Input:
#
#   [DS:DI] = 
#        Tuning of current string (0=C, 1=C#, ..., 11=B)
#        Actually only 2=D, 4=E, 7=G, 9=A and 11=B are used
#
#   DS:SI = Next character to read
#
#   DF = Clear
#
# Input and Output:
#
#    BX = Bit mask
#    DI = Will be incremented
#
# Destroys nearly all registers but SI and BX
#
InsertIntoMask:
    mov (%di), %cl
    inc %di
SkipSpaces:
    lodsb
    cmp $' ', %al
    jbe SkipSpaces
# Now evaluate each digit
    xor %ch, %ch
GetNextDigit:
    # Number = 10*Number+Digit
    cmp $'A', %al
    jae DigitIsX
    sub $'0', %al
    jb DigitsDone
    xchg %al, %ch
    mov $10, %ah
    mul %ah
    add %al, %ch
    lodsb
    jmp GetNextDigit
DigitsDone:
    # Add the tune of the string
    # and perform modulus 12
    mov %ch, %al
    add %cl, %al
    xor %ah, %ah
    mov $12, %cl
    div %cl
    mov %ah, %cl
    mov $1, %ax
    shl %cl, %ax
    or %ax, %bx
DigitIsX:
    ret

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

6 20 0 3 11 6 -->  A#   (or Bb)

আমি ইতিমধ্যে দুটি পিয়ানো খেলোয়াড়কে পিয়ানোতে "চারহাত" এক সাথে খেলতে দেখেছি।

এই পরীক্ষার কেসটি আমি প্রথমবারের মতো গিটার প্লেয়ারদের সম্পর্কে পড়ার বিষয়ে পড়ি!

এমনকি ডান হাতের টেপ দিয়েও আপনি এভাবে কর্ড খেলতে পারবেন না!


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

3

রুবি, 129 বাইট

পূর্ববর্তী সংস্করণ হিসাবে তবে পার্সিং পদক্ষেপ এবং আউটপুট পদক্ষেপের মধ্যে ক্রম অনুসারে টের্নারি অপারেটর সহ একটি একক লুপ ব্যবহার করে। এই কাজটি করার জন্য আরও কিছু ছোট ছোট পরিবর্তন দরকার ছিল।

->a{r=0
18.times{|j|j<6?a[j]&&r|=8194<<(6--~j%5+a[j]*7)%12:(r/=2)&11==3&&puts("CGDAEBF"[j%7]+?#*(j/13)+['',?m,?7,'m7'][r>>9&3])}}

রুবি, 136 বাইট

লামদা ফাংশনটি একটি আর্গুমেন্ট হিসাবে 6 টি সংখ্যার অ্যারে গ্রহণ করে এবং স্টডআউটকে আউটপুট দেয়। অব্যবহৃত স্ট্রিং একটি মিথ্যা মান দ্বারা প্রতিনিধিত্ব করা হয় (রুবি মধ্যে একমাত্র ফালসি মান nilএবং false।)

->a{r=0
6.times{|j|a[j]&&r|=4097<<(6--~j%5+a[j]*7)%12}
12.times{|j|r&11==3&&puts("FCGDAEB"[j%7]+?#*(j/7)+['',?m,?7,'m7'][r>>9&3]);r/=2}}

ব্যাখ্যা

আমি পঞ্চমাংশের বৃত্তের উপর ভিত্তি করে 12 পিচের উপস্থাপনা ব্যবহার করি । এর অর্থ প্রতিটি পিচ পিচ 7 সেমিটোন উচ্চ (বা 5 সেমিটোন নিম্ন) অনুসরণ করে ক্রম দেয় F C G D A E B F# C# G# D# A#। এর 2 টি সুবিধা রয়েছে। একটি হ'ল সমস্ত শার্প একসাথে উপস্থিত হয়। অন্যটি হ'ল 5 স্ট্রিং বাসের ওপেন স্ট্রিং নোটগুলি একসাথে উপস্থিত হয়: জিডিএইবি (গিটার সম্পর্কিত তবে কিছুটা জটিল, নীচে দেখুন)।

প্রথম লুপটি 6 বার চলে। অভিব্যক্তি 6--~j%5(equivalently 6-(j+1)%5) খোলা স্ট্রিং জন্য নোট মান দেয়: E=5 A=4 D=3 G=2 B=6 E=5। এটিতে আমরা 7 দ্বারা গুণিত ফ্রেট সংখ্যা যুক্ত করি (উপরে দেখা যায় যে, একটি সিমিটোন যোগ করে ক্রমানুসারে আমাদের places টি স্থান এগিয়ে নিয়ে যায়)) তারপরে আমরা পুরো জিনিসটি মডিউল 12 নই এবং উপস্থিত নোটগুলির একটি বিটম্যাপ তৈরি করি (আমরা 4097<<note valueটানা ২ টি অক্টেভস দিতে ব্যবহার করুন ))

বিটম্যাপটি রচনা করে আমরা জ্যাডটি অনুসন্ধান করতে এবং এটি আউটপুট প্রস্তুত করতে প্রস্তুত।

আমরা নিম্নলিখিত নোটগুলিতে আগ্রহী:

Note       position in      position in             Note      position in 
           semitone domain  circle of fifths                  circle of fifths 
Root       0                0                       Root      0
Minor 3rd  3                9                       Fifth     1
Major 3rd  4                4                       Sixth     3
Fifth      7                1                       Major 3rd 4
Sixth      9                3                       Minor 3rd 9
Minor 7th  10               10                      Minor 7th 10

জর্ড এফ পরীক্ষা করে শুরু করে, আমরা পরীক্ষা করে দেখি যে মূল এবং পঞ্চম উপস্থিত রয়েছে কিনা: বিট 0 এবং 1 (কমপক্ষে তাৎপর্যপূর্ণ: 1 এবং 2 এর বিট গণনা করা) অনুপস্থিত: বিট 3 (8 এর বিট।) তাই আমরা এটি যাচাই করি r&&11==3এবং যদি হয় তবে আমরা জ্যাটি মুদ্রণ করি।

আমরা প্রধান তৃতীয়টিকে উপেক্ষা করি এবং জ্যা টাইপের কাজটি করতে সম্পূর্ণ বিট 9 (গৌণ তৃতীয়) এবং বিট 10 (অপ্রধান 7 তম) এর উপর সম্পূর্ণ নির্ভর করি। অভিব্যক্তিটি r>>9&3একটি অ্যারের থেকে সঠিক জ্যা টাইপ বাছাই করতে ব্যবহৃত হয়।

লুপ শেষে, আমরা বিটম্যাপ অধিকার এক বিট নামান r/=2ক্রমানুসারে সম্ভব জ্যা শিকড় পরীক্ষা করার জন্য: F C G D A E B F# C# G# D# A#

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

f=->a{                            #Accept array of 6 numbers as argument.
  r=0                             #Setup an empty bitmap.

  6.times{|j|                     #For each string
    a[j]&&                        #if the fret value is truthy (not nil or false)
    r|=4097<<(6--~j%5+a[j]*7)%12  #calculate the note value in the circle of fifths and add to the bitmap.
  }

  12.times{|j|                    #For each possible root note
    r&11==3&&                     #if root and fifth are present (bits 0 and 1) and sixth is absent (bit 3) 
    puts("FCGDAEB"[j%7]+?#*(j/7)+ #output the note name and a sharp symbol if necessary, followed by
    ['',?m,?7,'m7'][r>>9&3])      #m and/or 7 as indicate by bits 9 and 10.
    r/=2
  }
}

print 1;f[[nil,3,2,0,1,0]]       #  C
print 2;f[[0,2,2,0,0,0]]         #  Em
print 3;f[[nil,2,nil,0,nil,0]]   #  Em
print 4;f[[4,4,6,4,6,4]]         #  C#7 
print 5;f[[4,4,6,4,5,4]]         #  C#m7 
print 6;f[[0,2,2,1,0,0]]         #  E
print 7;f[[0,0,2,2,2,0]]         #  A
print 8;f[[nil,nil,4,3,2,2]]     #  F#  
print 9;f[[3,2,0,0,0,1]]         #  G7
print 10;f[[nil,nil,0,2,1,1]]    #  Dm7
print 11;f[[3,3,5,5,5,3]]        #  C
print 12;f[[4,6,6,5,4,4]]        #  G#  
print 13;f[[2,2,4,4,4,5]]        #  B7
print 14;f[[0,7,5,5,5,5]]        #  Am7
print 15;f[[7,6,4,4,nil,nil]]    #  B
print 16;f[[8,6,1,nil,1,3]]      #  Cm
print 17;f[[8,8,10,10,9,8]]      #  Fm
print 18;f[[0,19,5,16,8,7]]      #  Em
print 19;f[[6,20,0,3,11,6]]      #  A#  
print 20;f[[nil,14,9,1,16,nil]]  #  G#m 
print 21;f[[12,14,14,12,12,12]]  #  Em
print 22;f[[15,14,12,12,12,15]]  #  G
print 23;f[[20,nil,20,20,20,20]] #  Cm7
print 24;f[[nil,13,18,10,11,10]] #  A#7

2

জাভাস্ক্রিপ্ট (ES6), 335 333 বাইট

এই চ্যালেঞ্জটি পছন্দ করুন এবং পিপিসি এসই! এটি আমার প্রথম গল্ফ - পরামর্শগুলি স্বাগত কারণ আমি নিশ্চিত যে এটি অনেক উন্নত হতে পারে। (আমি এফ = অন্তর্ভুক্ত হিসাবে 2 বাইট ছিটকেছি)

ফাংশনটি fস্ট্রিংগুলির একটি অ্যারে নেয়, যা সংখ্যার প্রতিনিধিত্ব করে এবং 'এক্স', পছন্দ করে f(['X','3','2','0','1','0'])এবং একটি জ্যোতি (প্রাকৃতিক বা তীক্ষ্ণ) প্রদান করে E#m7। স্পষ্টতার জন্য নিউলাইনগুলি যুক্ত হয়েছে (বাইট গণনায় অন্তর্ভুক্ত নয়)

f=c=>[s=new Map([[435,''],[345,'m'],[4332,7],[3432,'m7']]),
n=[...new Set(c.map((e,i)=>e?(+e+[0,5,10,3,7,0][i])%12:-1)
.filter(e=>++e).sort((a,b)=>a>b))],d=[...n,n[0]+12].reduce(
(a,c,i)=>i?[...a,(c-n[i-1]+12)%12]:[],0).join``.repeat(2),
m=+d.match(/(34|43)(5|32)/g)[0],'E0F0F#0G0G#0A0A#0B0C0C#0D0D#'
.split(0)[n[d.indexOf(m)]]+s.get(m)][4]

ব্যবহারের উদাহরণ:

console.log(f(['0','2','2','0','0','0'])); // Em

পরীক্ষার মামলা চালাতে:

tests=`X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)`; // and so on...

tests.split`\n`.forEach(e=>{
    console.log(`Test: ${e}
      Result: ${f(e.split(' ').slice(0,6))}`)
})

ব্যাখ্যা সহ বর্ণহীন সংস্করণ:

f = (c) => {
    s = new Map([
        [435,''], [345,'m'], [4332,7], [3432,'m7'] 
    ]) /* Each key in s describes the intervals (semitones)
          between consecutive notes in a chord, when it is
          reduced to a single octave, including the interval
          from highest back to lowest. The values describe
          the corresponding chord suffix. E.g. C-E-G has
          intervals C-4-E-3-G-5-C. 435=major=no suffix. */

    n = [ ...new Set(
        c.map( 
         (e,i) => e ? ( +e + [0,5,10,3,7,0][i] )%12 : -1 
         ).filter( (e) => ++e ).sort( (a,b) => a>b )
        ) ] /* take the input array, c, and transform each fret
               position into a note. remove non-notes (-1), sort
               in tone order, remove duplicates. An input of
               positions X 13 18 10 11 10 becomes notes
               (-1) 6 4 1 6 10 then 1 4 6 10. */

    d = [ ...n, n[0] + 12 ].reduce(
        (a,c,i) => i ? [ ...a, (c - n[i-1] + 12)%12 ] : [], 0
    ).join``.repeat(2)
    /* convert the note array, n, into an interval string, d,
       including the lowest note repeated above it to capture
       all intervals. Repeat it twice so that, regardless of the
       inversion played, the intervals will appear in root order
       somewhere. E.g. notes 1-4-6-10 and 13 (1+12)
       become intervals 3 2 4 3, and string for searching
       32433243 */

    m = +d.match( /(34|43)(5|32)/g )[0];
      /* m is the matched chord pattern. In this case, 4332. */

    return 'E0F0F#0G0G#0A0A#0B0C0C#0D0D#'.split(0)[
    n[ d.indexOf(m) ]
    /* get the position in the interval string where the root
       interval first occurs. this corresponds to the position
       of the chord root note in the note array, n. convert this
       number 0-12 to a note name E - D# */
    ] + s.get(m)
       /* add the suffix corresponding to the matched
       chord interval pattern */
}

1
সাইটে স্বাগতম! আপনি এটি উপভোগ শুনে খুশি। :) দুর্ভাগ্যবশত, আমি তাই আমি কোন টিপস আছে না কোনো জাতীয় জানি না, কিন্তু আপনি কিছু খুঁজে পেতে সক্ষম হতে পারে এখানে
DJMcMayhem
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.