ดนตรี: คอร์ดนี้ชื่ออะไร?


9

นี่คือสิ่งที่ตรงกันข้ามของดนตรี: มีอะไรในคอร์ดนี้? ซึ่งจะพิมพ์บันทึกในคอร์ดที่กำหนด เวลานี้อินพุตคือรายการบันทึกย่อในคอร์ดและงานของคุณคือส่งออกว่าเป็นคอร์ดใด

โปรแกรมของคุณควรรองรับคอร์ด triadic ต่อไปนี้ ตัวอย่างให้กับรูตซีคอร์ดกับรูทอื่น ๆ เป็นคอร์ดเดียวกันกับโน้ตทั้งหมดที่หมุนดังนั้น C จะกลายเป็นโน้ตรูทนั้นเช่น Dmaj ประกอบด้วย D, F # และ A

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
Cmaj    C       E     G
Cm      C     D#      G
Caug    C       E       G#
Cdim    C     D#    F#
Csus4   C         F   G
Csus2   C   D         G

โปรดทราบว่า Caug นั้นเหมือนกับ Eaug และ G # aug และ Csus4 นั้นเหมือนกับ Fsus2 คุณสามารถส่งออกอย่างใดอย่างหนึ่ง แต่มีโบนัสถ้าคุณออกพวกเขาทั้งหมด

และคอร์ดที่เจ็ดสำหรับโบนัสจะแสดงรายการในตารางต่อไปนี้:

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
C7      C       E     G     A#
Cm7     C     D#      G     A#
Cmmaj7  C     D#      G       B
Cmaj7   C       E     G       B
Caug7   C       E       G#  A#
Cdim7   C     D#    F#    A

กฎระเบียบ

  • คุณสามารถเขียนโปรแกรมที่สมบูรณ์หรือฟังก์ชั่น
  • อินพุตเป็นรายการโน้ตคั่นด้วยช่องว่างหรืออักขระอื่นที่สะดวก นอกจากนี้ยังสามารถเป็นอาร์เรย์ของสตริง (ถ้าใช้รับข้อมูลจากฟังก์ชั่นการโต้แย้ง) หรือการเป็นตัวแทนสตริงของอาร์เรย์ดังกล่าว
  • อินพุตไม่จำเป็นต้องอยู่ในลำดับเฉพาะ
  • อาจมีบันทึกซ้ำซ้อนในอินพุต พวกเขาจะต้องได้รับการปฏิบัติเช่นเดียวกับที่มีเพียงหนึ่งในนั้น
  • เอาต์พุตเป็นชื่อของคอร์ด ในกรณีที่มันจะออกหลายชื่อกฎเดียวกันสำหรับการป้อนข้อมูลนำไปใช้
  • หากอินพุตไม่ใช่คอร์ดที่รองรับคุณควรพิมพ์โน้ตตามที่เป็น โปรแกรมของคุณสามารถรองรับคอร์ดอื่น ๆ ที่ไม่อยู่ในตารางด้านบน (ซึ่งใช้ได้ แต่ไม่มีโบนัส)
  • คุณสามารถใช้สัญลักษณ์อื่น ๆ ที่ระบุไว้ในบทความวิกิพีเดีย แต่ถ้าคุณเลือกCสำหรับวิชาเอก C คุณควรเพิ่มคำนำหน้าที่มนุษย์สามารถอ่านได้ในทั้งสองกรณีเพื่อแยกคอร์ดด้วยโน้ตเดี่ยว
  • คุณไม่สามารถใช้ฟังก์ชันในตัวสำหรับงานนี้ (ถ้ามี)
  • นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดเป็นไบต์ชนะ

ตัวอย่าง

  • อินพุต: C D# Gเอาต์พุต: Cm.
  • อินพุต: C Eb Gเอาต์พุต: Cm.
  • อินพุต: C Eb F#เอาต์พุต: Cdim.
  • การป้อนข้อมูล: F A C#เอาท์พุท: Faug, Aaug, C#aug, DbaugหรือFaug Aaug C#aug, Faug Aaug Dbaugในลำดับใด
  • อินพุต: F D F F F F A A Fเอาต์พุต: Dm.
  • อินพุต: C Dเอาต์พุต: C D.

โบนัส

  • -30 ถ้าพิมพ์ออกมาทั้งหมดถ้ามีการตีความมากกว่าหนึ่งครั้ง (สำหรับ aug, sus4 / sus2 และ dim7)
  • -70 ถ้ามันรองรับคอร์ดที่เจ็ดด้วย
  • -200 ถ้ายอมรับอินพุต MIDI และพิมพ์แต่ละคอร์ดที่ได้รับ โปรดทราบว่าโน้ตไม่จำเป็นต้องเริ่มต้นหรือสิ้นสุดในเวลาเดียวกัน คุณตัดสินใจว่าจะเกิดอะไรขึ้นในสถานะตัวกลาง (ตราบใดที่มันไม่พังหรือหยุดทำงาน) คุณอาจคิดว่าไม่มีบันทึกย่อในช่องสัญญาณเพอร์คัชชัน (หรือมีเพียงช่องเดียวหากสะดวก) ขอแนะนำให้ระบุเวอร์ชันของข้อความ (หรืออาเรย์) สำหรับการทดสอบโดยเฉพาะอย่างยิ่งถ้ามันขึ้นอยู่กับแพลตฟอร์ม

อินพุตมีแฟลตหรือใช้ความคมชัดได้หรือไม่ ควรจัดการโน้ตเช่น B # หรือไม่
feersum

@feersum สามารถมีแฟลตได้ (เว้นแต่คุณจะรับโบนัส -200) เพิ่มตัวอย่างบางส่วน คุณไม่จำเป็นต้องจับB#, Cbฯลฯ
jimmy23013

Csus4 is the same as Gsus2คุณบอกว่า ฉันคิดว่าคุณหมายถึงCsus2 is the same as Gsus4ไม่ได้คุณ?
Gareth

@Gareth ... ใช่ แก้ไขแล้ว.
jimmy23013

คำตอบ:


2

Pyth 190 ตัวอักษร - 30 - 70 = 90

=Q{cQdL+x"C D EF G A B"hb&tlbt%hx" #b"eb3FZQJx[188 212 199 213 200 224 2555 2411 2412 2556 2567 2398)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 maj dim aug m sus4 7 m7 mmaj7 maj7 aug7 dim7"dJ=T0;ITQ

ไม่ค่อยมีความสุขกับมัน คอร์ดที่ใช้รหัสฮาร์ด

การใช้งาน:

ลองได้ที่นี่: Pyth คอมไพเลอร์ ปิดใช้งานโหมดดีบักและใช้"C D# G"เป็นอินพุต

คำอธิบาย:

ก่อนอื่นให้เตรียม:

=Q{cQd
   cQd  split chord into notes "C D# G" -> ["C", "D#", "G"]
  {     set (eliminate duplicates)
=Q      Q = ...

จากนั้นฟังก์ชั่นที่แปลงโน้ตเป็นจำนวนเต็ม

L+x"C D EF G A B"hb&tlbt%hx" #b"eb3
defines a function g(b),
  returns the sum of 
     index of "D" in "C D EF G A B"
     and the index of "#" in " #b" 
       (if b than use -1 instead of 2)

จากนั้นสำหรับแต่ละโน้ตเลื่อน coord และค้นหาในตาราง

FZQJx[188 ...)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 ..."dJ=T0;ITQ
               implicit T=10
FZQ            for note Z in chord Q:
   mykQ         map each note of Q to it's integer value
   m%-dyZ12     shift it by the integer value of Z modulo 12 
   S            sort it
   u+*G12hH 0   convert it to an integer in base 12
   x[188 ...)   look it up in the list (-1 if not in list)
   J            and store the value in J

   IhJ               if J>=0:
   +Z@c"sus2 ..."dJ   print the note Z and the chord in the list
=T0                   and set T=0
;            end loop
ITQ          if T:print chord (chord not in list)

2

Perl 5: 183 - 100 = 83

แก้ไข: ฉันสามารถตัดอักขระพิเศษบางตัวได้ดังนั้นฉันจึงเปลี่ยนชื่อคอร์ดเช่นเดียวกับในโซลูชัน Python ดังนั้นฉันจึงสามารถเสแสร้งสักครู่ที่ฉันเป็นผู้นำ

#!perl -pa
for$z(0..11){$x=0;$x|=1<<((/#/-/b/+$z+1.61*ord)%12or$o=$_)for@F;$x-/\d+_?/-$_*4||push@r,$o.$'
for qw(36M 34- 68+ 18o 40sus2 33sus4 292_7 290-7 546-M7 548M7 324+7 146o7)}$_="@r
"if@r

ตัวอย่าง:

$ perl chord.pl <<<"C D# G"
C-

0

Python 2, 335 bytes - 30 - 70 = 235

ความพยายามครั้งแรกที่สนามกอล์ฟที่ยาวขึ้นเล็กน้อยดังนั้นฉันอาจพลาดลูกเล่นบางอย่างที่เห็นได้ชัด

def f(s,N="C D EF G A B",r=range,u=1):
 for i in r(12):
  for t in r(12):
   if(set((N.find(n[0])+" #".find(n[1:]))%12for n in s.split())==set(map(lambda n:(int(n,16)+i)%12,"0"+"47037048036057027047A37A37B47B48A369"[3*t:3*t+3]))):print(N[i],N[i+1]+"b")[N[i]==" "]+"M - + o sus4 sus2 7 -7 -M7 M7 +7 o7".split()[t];u=0
 if(u):print s

ความคิดเห็นที่:

  • ฉันใช้ชื่อคอร์ดทางเลือกจากหน้า Wiki (ดูที่ส่วนท้ายของบรรทัดยาว) เพื่อประหยัดพื้นที่
  • คอร์ดจะถูกแสดงด้วยออฟเซ็ต 3 hex แต่ละตัว (ไม่จำเป็นต้องมี 0 แต่รวมไว้สำหรับ triads เพื่อให้เข้าแถว)
  • "#". find (n [1:]) ทำงานได้ตั้งแต่ "#". find ("b") คือ -1 และ "#". find ("") คือ 0

ตัวอย่างผลลัพธ์

>>> f("C D# G")
C-
>>> f("C Eb G")
C-
>>> f("C Eb F#")
Co
>>> f("F A C#")
Db+
F+
A+
>>> f("F D F F F F A A F")
D-
>>> f("C D")
C D
>>> f("C Eb Gb A")
Co7
Ebo7
Gbo7
Ao7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.