ウクレレのコードチャートを生成する

あなたの任務は、与えられたコードシンボルに対して、次の形式でウクレレコードチャートを出力する関数を書くことです。たとえば、入力
G7 “の場合、次のように出力する必要があります。

 G C E A
---------
| | |#| |
---------
| |#| |#|
---------
| | | | |
---------
| | | | |
---------
| | | | |
---------

次のフォームのすべてのコードをサポートする必要があります: X Xm X7 Xm7 Xmaj7 Xsus4
Xdim Xdim7

     

Xは A C D F G

(BbやEbなどのフラットをサポートする必要はありません)

残りのチャレンジの説明(「出力とスコアリング」まで)は純粋に説明的なものです。ウクレレのコードがすでに分かっている場合、それは必要ありません。

コードのチャートを作成するには、3つのステップがあります。

  1. まず、どの音符が和音に含まれているか調べてください。
  2. 音符と一致する各文字列の正しいフレットを選択します。
  3. グラフを描画します。

どの音符が和音の中にあるか調べる

A、A、B、C、C#、D、D#、E、F、Fの各12音の音符
F#、G、G#
、次にA、A#….

(あなたが音楽に慣れていないならば、すべての ” A “を 0
、すべての ” A#1 など、すべてうまくいく)

コードは、基本音符から始まる定義されたパターンのパターンに従って、3つまたは4つの音符のセットです。

  • X: 0 + 4 + 3 (“major”). Example: C,
    C+E+G
  • Xm: 0 + 3 + 4 (“minor”). Example: Cm,
    C+D#+G
  • X7: 0 + 4 + 3 + 3 (“seven”). Example: C7,
    C+E+G+A#
  • Xm7: 0 + 3 + 4 + 3 (“minor seven”).
    Example: Cm7, C+D#+G+A#
  • Xmaj7: 0 + 4 + 3 + 4 (“major seven”) .
    Example: Cmaj7, C+E+G+B
  • Xsus4: 0 + 5 + 2 (“sus four”): Example:
    Csus4, C+F+G
  • Xdim: 0 + 3 + 3 (“diminished”). Example:
    Cdim, C+D#+F#
  • Xdim7: 0 + 3 + 3 + 3 (“diminished seven”).
    Example: C+D#+F#+A#. [You may find it helpful to know that this
    is the same chord as A#dim7, D#dim7 and F#dim7].

(カッコ内の名前はあなたの音楽教育のためのものですが、チャレンジには関係ありません)

例えば、 ” Am “は和音であり、 “A”はベースノートであり、
“m”は和音タイプである。テーブル( “Xm:0 + 3 + 4″)を見ると、3つのノートがあることがわかります。

  • ベースノート( A )、
  • 上の3つの半音( CA#B
    を数える)、および
  • その上に4つの半音の音符( E )があります。

(3つの音符を持つコードは、必然的に4つの音符にまたがる音符の1つを繰り返すことになります。

ノートの正しいフレットを選択する

ウクレレは、ノートG、C、E、Aを演奏する4つの文字列を持つ楽器です。フレットに対して文字列を押すと、フレットごとに1つ半音高くなります。
(Aストリングでフレット1を押すとA#に、フレット2でBにリターンするなど)。

コードチャート

コードチャートは、左手で演奏される最初の数フレットを表し、上から下に向かって読み上げられます(「高い」フレットはページの下側にあります)。
文字列は、 | 記号で区切られた列です。
フレットは、 -
記号で区切られた行です。記号
は、右手が発音している間に、そのフレットに対してストリングが押された(「フレットされている」)ことを意味します。

だから開始時のコードチャートで:

  • Gの文字列はフレットしていない(「開いている」)ので、Gのように聞こえる。
  • Cの文字列はフレット2(2つの半音上)でフレッティングされるので、Dのように聞こえます。
  • E文字列はフレット1(半音上がり)で、Fのように聞こえます。
  • Aの文字列はフレット2になっているので、Bのように聞こえます。

G、D、F、B(G7、G + B + D + F、ピッチの順番は関係ありません)

コードの計算

与えられたコードに対して、与えられた文字列に対してどのフレットを再生するかを計算するには:

  • 文字列のベースノート(G、E、AまたはC)がコードにまだ含まれていない場合は、コードに属する最も低いフレットを再生します。
  • 4つの文字列ごとに繰り返します。

例1

たとえば、 E7E + G# +
B + D )。

  1. G の文字列はコードにはありません。それを
    G#(フレット1)に上げます。
  2. C の文字列はコードにありません。それを D
    (フレット2)に上げます。
  3. E の文字列がコードにあります。それを恐れないでください。
    (文字列を開いたままにしておきます)
  4. A の文字列はコードにはありません。それを B
    (フレット2)に上げます。

したがって、 G#DE
B を再生しています。

だから我々は出力:

 G C E A
---------
|#| | | |
---------
| |#| |#|
---------
| | | | |
---------
| | | | |
---------
| | | | |
---------

例2

別の例: G#G# + B# +
D#

    G の文字列がコードにない場合は、 G#(fret 1)に上げます。
    C の文字列はコード(B#)にあります。 E
    の文字列がコードに含まれていない場合は、 G#(fret 4)に上げます。 A
    の文字列がコードに含まれていない場合は、 B#(C)(fret 3)に上げます。

So we are playing G#, C,
G#, C

 G C E A
---------
|#| | | |
---------
| | | | |
---------
| | | |#|
---------
| | |#| |
---------
| | | | |
---------

(コードのすべての音符が再生されないことがあることに気付くかもしれませんが、それを心配しないでください。「適切な」ウクレレコードは、この基本的なアルゴリズムよりもやや複雑です。

アウトプットとスコアリング

あなたの出力は上記のものと厳密に一致する必要があります。 (em-ダッシュやASCII線画のような |
-
の代わりに他の文字を使用することもできます視覚的に優れています。円で囲まれていない文字はより優れています)。各行の末尾の行スペースは大丈夫です。最初の行の前または最後の行の後の空白は大丈夫ではありません。最終改行はオプションです。

入力と出力の通常の形式。正しい場合には、上の表にあることが保証された1つのコード名を受け取ります。

標準的な抜け穴は許されません。オンラインサービスは禁止されています。あなたの言語が標準ライブラリに音楽機能を持っているなら、それらを使うことができます(ただし、プラグイン、パッケージなどではありません)

This is .
Lowest score (in bytes) wins.

余分なクレジット

このシンプルなアルゴリズムは、和音の重要な音符をすべて含まない無駄な和音を生成することがあります。 (たとえば、
Dm の場合、 Fm と同じ ACFA
を生成します)。

For 余分なクレジット, modify the algorithm so that:

  • すべてのコードについて、少なくとも1つの文字列でそれぞれルートと3番目の音符(最初の2つの音符、通常0と3または0と4)が再生されます。
  • 4音符のコード(X7、Xm7、Xmaj7、Xdim7)の場合、ルート、第3および第7の音符(第1、第2および第4音符)はそれぞれ少なくとも1つの文字列で再生されます。
ベストアンサー

Javascript 280 <282> <287 バイト

(読みやすくするために重要でない改行が挿入されています)

<div class=”snippet” data-lang=”js” data-hide=”false”
data-console=”false” data-babel=”false”> <div
class=”snippet-code”>

f=

a=>' G C E A'+[1,2,3,4,5].map(y=>
(l=`
---------
`)+[-2,3,7,0].map(
x=>(z=a.match(/(.#?)(.*)/),
[...'9'+{'':14,7:147,m:40,m7:740,maj7:148,sus4:24,dim:30,dim7:360}[z[2]]]
.map(i=>(i-x+'D EF G A BC'.search(z[1][0])+!!z[1][1]+8)%12)
.sort((a,b)=>a-b)[0]-y?'| ':'|#'
)).join``+'|').join``+l



document.getElementById("mysubmit").onclick=function() {
  document.getElementById("out").innerHTML=f(document.getElementById("myinput").value)
}
<input type="text" value="G7" id="myinput">
<input type="submit" id="mysubmit">

</div> </div>

解説

私はJavascriptの奇妙なタイプの変換でとても満足していることはありません。これはおそらく私が今まで40 +
9を409にしたかったのは初めてです:)オブジェクトのキーとして整数が受け入れられるのは本当に幸運です。

あまりにも賢いことはここではない。私は0〜9の範囲を保つために各コードノートから3を引いて、3桁の数字としてコードを一時的に表現することができます。幸いにも、音符の順番は重要ではないので、036を360と表現することができます。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です